ZF2& Doctrine2 getServiceConfig工厂连接函数

时间:2014-11-10 10:24:02

标签: php doctrine-orm zend-framework2

我在 Module.php 方法 getServiceConfig()中有Doctrine工厂:

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'doctrine.entitymanager.orm_cst' => new \DoctrineORMModule\Service\EntityManagerFactory('orm_cst'),
            'doctrine.connection.orm_cst' => function ($sm) {
                    $config = $sm->get('config');
                    return new \DoctrineORMModule\Service\DBALConnectionFactory('doctrine.entitymanager.' . $config['connection']);
                },
            'doctrine.configuration.orm_cst' => new \DoctrineORMModule\Service\ConfigurationFactory('orm_cst'),
            'doctrine.driver.orm_cst' => new \DoctrineModule\Service\DriverFactory('orm_cst'),
            'doctrine.eventmanager.orm_cst' => new \DoctrineModule\Service\EventManagerFactory('orm_cst'),
        ),
    );
}

我正在尝试从 config 获取连接值,我收到以下错误:

Catchable fatal error: Object of class DoctrineORMModule\Service\DBALConnectionFactory could not be converted to string in W:\domains\zf\vendor\doctrine\orm\lib\Doctrine\ORM\EntityManager.php on line 939

如果我没有将函数用作数组值,那就没关系了:

'doctrine.connection.orm_cst' => new \DoctrineORMModule\Service\DBALConnectionFactory('orm_cst'),

我做错了什么?请帮忙。

1 个答案:

答案 0 :(得分:1)

doctrine.connection应返回已配置的\Doctrine\DBAL\Connection

目前,您错误地返回实际ZF2工厂实例\DoctrineORMModule\Service\DBALConnectionFactory),而不是使用它来创建连接。

如果您希望保留关闭,您可以手动调用createService()方法,它应该可以正常工作。

'doctrine.connection.orm_cst' => function ($sm) {
    $config = $sm->get('config');

    $key = 'doctrine.entitymanager.' . $config['connection'];
    $factory = new DBALConnectionFactory($key);

    // Manually call the createService method and the factory will then
    // return the Connection instance
    return $factory->createService($sm);
},

另一个(首选)选项是扩展默认的Doctrine工厂并在工厂内定义配置键,这样你就可以在一个地方创建连接所需的一切(这真的是使用工厂背后的想法) )。

如果您没有使用上述闭包,还值得注意的是,通过使用new创建服务工厂,您将在每次请求时重新创建每个服务工厂 - 这将产生不必要的负面性能影响。解决方案将是在您自己的自定义工厂中扩展和/或包装Doctrine工厂,并使用字符串来引用它们。然后,服务管理器将能够延迟加载它们。

'doctrine.connection.orm_cst' => 'MyModule\Factory\CstConnectionFactory',