如何在Symfony 3.4中动态批量配置服务?
今天,我能够将自己的Doctrine存储库手动配置为services.yml
中的服务,如下所示:
AppBundle\Repository\MyEntityRepository:
class: Doctrine\ORM\EntityRepository
factory: ['@doctrine.orm.default_entity_manager', getRepository]
arguments:
- AppBundle\Entity\MyEntity
这种方法的问题在于,它过于冗长,而且我认为,通过分别注册我的每个存储库(有很多!),也容易出错。我还需要使它们与我的services_test.yml
保持同步,这使问题更加严重。
之前我已经使用过其他一些依赖注入库PHP-DI,通过使用通配符和回调工厂函数,我可以使用该库完成我想要的工作:
$dependencyInjectionContainerBuilder->addDefinitions([
'AppBundle\Repository\*' => function (
\DI\Factory\RequestedEntry $requestedEntry,
\Doctrine\ORM\EntityManager $em
) {
$className = $requestedEntry->getName();
$matches = [];
preg_match('~AppBundle\\\\Repository\\\\(.*)Repository~', $className, $matches);
if (!empty($matches[1])) {
return $em->getRepository('AppBundle\\Entity\\' . $matches[1]);
}
}
]);
此代码段基本上监视AppBundle \ Repository *类的自动装配,当发现一个类时,使用正确的类名调用$ em-> getRepository并返回该对象。
我知道代码看起来很笨拙,但就我而言,维护该代码比保持数十个手动服务注册容易得多。
有人知道如何在Symfony 3.4中做到这一点吗?