ZF2 & Doctrine2 getServiceConfig функция подключения к фабрикам

0

У меня есть заводы по Доктрине в методе module.php getServiceConfig():

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

Что я делаю не так? Пожалуйста помоги.

Теги:
doctrine2
zend-framework2

1 ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню