2011-12-13 126 views
17

如何在不修改Doctrine2内核中的DriverManager.php的情况下添加自定义驱动程序?Doctrine 2 - 如何添加自定义DBAL驱动程序?

我为pdo_dblib创建了一个DBAL驱动程序,并将它放在Symfony2包中。这工作得很好,但我必须将驱动程序添加到DriverManager.php硬编码驱动程序的列表,否则我得到以下异常:

异常

[Doctrine\DBAL\DBALException]                                     
The given 'driver' pdo_dblib is unknown, Doctrine currently supports only the following drivers: pdo_mysql, pdo_sqlite, pdo_pgsql, pdo_oci, oci8, ibm_db2, pdo_ibm, pdo_sqlsrv 

除非我修改DriverManager.php

final class DriverManager 
{ 
    private static $_driverMap = array(
     'pdo_dblib' => 'Doctrine\DBAL\Driver\PDODblib\Driver', // Added this line 
    ); 
} 

这里是我的config.yml:

# Doctrine Configuration 
doctrine: 
    dbal: 
     driver:   pdo_dblib 
     driver_class: PDODblibBundle\Doctrine\DBAL\Driver\PDODblib\Driver 
+0

你可以分享你PDODblib文件夹中我遇到这个问题藏汉,也没有你设法找到一种方法来添加自定义驱动程序而不修改核心? – Matt

+1

我还没有找到添加驱动程序而不修改Doctrine2核心的方法。不过你可以看看这个Bundle:http://github.com/trooney/PDODblibBundle – rooney

+0

对于任何人走这条路:有没有应用提交PHP svn add lastInsertId和事务支持到pdo_dblib驱动程序。请参阅http://svn.php.net/viewvc/php/php-src/trunk/ext/pdo_dblib/dblib_driver.c?view=log(rev。300647和300647) – rooney

回答

25

实际上,你可以,只要把驱动程序配置选项completlely出来。

所有你需要定义的是driver_class选项。该驱动程序只用于对默认驱动程序类进行内部查找,只要您仅提供该类,则不会因查找而失败。

顺便说一句:有没有办法(在一个完整的默认设置)在parameters.ini来定义这一点,你必须直接改变它的config.yml内

BTW:由于另一个缺陷(司机下降回到特定区域的mysql),你可能不会在配置中设置字符集,因为它将注册一个MySql事件处理程序来设置字符集。

所以我最后的学说配置基于我mssql_ *基于实现如下所示,没有问题的作品:

# Doctrine Configuration 
doctrine: 
    dbal: 
     #driver: %database_driver% 
     driver_class: Doctrine\DBAL\Driver\MsSql\Driver 
     host:  %database_host% 
     port:  %database_port% 
     dbname: %database_name% 
     user:  %database_user% 
     password: %database_password% 
     #charset: UTF8 

    orm: 
     auto_generate_proxy_classes: %kernel.debug% 
     auto_mapping: true 
+1

这就是我正在寻找的!非常感谢! –

+1

自版本2.2开始,MsSql驱动程序已重命名为SQLSrv –

相关问题