我在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',