【问题标题】:ZF2 & Doctrine2 getServiceConfig factories connection functionZF2 & Doctrine2 getServiceConfig 工厂连接函数
【发布时间】:2014-11-10 10:24:02
【问题描述】:

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

我做错了什么?请帮忙。

【问题讨论】:

  • $config['connection'] 持有什么。

标签: php doctrine-orm zend-framework2


【解决方案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',

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 1970-01-01
    • 2013-03-26
    • 2013-09-22
    相关资源
    最近更新 更多