У меня есть заводы по Доктрине в методе 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'),
Что я делаю не так? Пожалуйста помоги.
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',