我已经看到大量使用doctrine的项目,其中一些项目将容器或其他服务注入到存储库中。我在这里也看到了一些关于存储库中容器的问题:
我唯一的问题是将容器o其他服务添加到存储库或实体。我认为可能会有一些副作用。例如,如果某些代码依赖于特定上下文中不可用的服务,则无法重用某些代码。例如,如果我的存储库依赖于Symfony\Component\HttpFoundation\Request
,则不能在命令中使用它。
创建服务而不是耦合存储库可以是更好的解决方案吗?
答案 0 :(得分:1)
有一些如何创建实体管理器(或存储库)的示例,相关内容如FOSUserBundle中所述,其中doctrine实体管理器已作为对象管理器注入依赖注入。
if ('custom' !== $config['db_driver']) {
if (isset(self::$doctrineDrivers[$config['db_driver']])) {
$loader->load('doctrine.xml');
$container->setAlias('fos_user.doctrine_registry', new Alias(self::$doctrineDrivers[$config['db_driver']]['registry'], false));
} else {
$loader->load(sprintf('%s.xml', $config['db_driver']));
}
$container->setParameter($this->getAlias().'.backend_type_'.$config['db_driver'], true);
}
if (isset(self::$doctrineDrivers[$config['db_driver']])) {
$definition = $container->getDefinition('fos_user.object_manager');
$definition->setFactory(array(new Reference('fos_user.doctrine_registry'), 'getManager'));
}
在这种情况下,UserManager而不是具有相同角色的存储库。
在此示例中,所有服务都已初始化并直接注入依赖项注入
在bundle构造/或“编译”(依赖注入)中直接调用(私有)服务而不是在服务中对colling容器进行调用更为强大