ZF2 & Doctrine2 getServiceConfig 工厂连接函数



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

public function getServiceConfig()
{
    return array(
        'factories' => array(
            'doctrine.entitymanager.orm_cst' => new DoctrineORMModuleServiceEntityManagerFactory('orm_cst'),
            'doctrine.connection.orm_cst' => function ($sm) {
                    $config = $sm->get('config');
                    return new DoctrineORMModuleServiceDBALConnectionFactory('doctrine.entitymanager.' . $config['connection']);
                },
            'doctrine.configuration.orm_cst' => new DoctrineORMModuleServiceConfigurationFactory('orm_cst'),
            'doctrine.driver.orm_cst' => new DoctrineModuleServiceDriverFactory('orm_cst'),
            'doctrine.eventmanager.orm_cst' => new DoctrineModuleServiceEventManagerFactory('orm_cst'),
        ),
    );
}

我正试图从config中获取连接值,但我收到了以下错误:

Catchable fatal error: Object of class DoctrineORMModuleServiceDBALConnectionFactory could not be converted to string in W:domainszfvendordoctrineormlibDoctrineORMEntityManager.php on line 939

如果我不使用函数作为数组值,也没关系:

'doctrine.connection.orm_cst' => new DoctrineORMModuleServiceDBALConnectionFactory('orm_cst'),

我做错了什么?请帮忙。

doctrine.connection应该返回一个已配置的DoctrineDBALConnection

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

如果您希望保留闭包,只需手动调用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' => 'MyModuleFactoryCstConnectionFactory',

最新更新