在Symfony中动态批量配置服务

时间:2019-05-21 14:35:36

标签: symfony symfony-3.4

如何在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中做到这一点吗?

0 个答案:

没有答案