我在 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'),
我做错了什么?请帮忙。
答案 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',