【问题标题】:Symfony - Inject and access DIC service in Doctrine EntityRepositorySymfony - 在 Doctrine EntityRepository 中注入和访问 DIC 服务
【发布时间】:2018-02-23 14:49:13
【问题描述】:

这与使用 Symfony 2.2.1 和原则 2.3.3 编写的遗留项目有关。

我需要在 EntityRepository 类之一中访问 DIC @service。

我是否能够通过一些事件监听器或其他方式将该服务或容器注入其中?

我不想将它注入到 Entity 中,而是要注入到特定的 EntityRepository 中。

【问题讨论】:

  • 2.2?哎呀!你使用的是什么版本的教义?较新的版本有一个 RepositoryFactory 可以被覆盖和调整以将其他服务注入您的存储库。所以检查一下 vendor/doctrine/orm 看看你是否有这个类。
  • Yo' 这是一个非常传统的项目,很快就会被弃用:-)。所以我真的不是在寻找干净的解决方案。老实说,这是退役项目的一部分。说明已更新。
  • 很公平,假设您可以从容器中提取 repo,@Mocrates 的答案将起作用。否则,您最好的选择可能是简单地访问全局 $kernel->getContainer() 方法。
  • 谢谢@Cerad,在你写到这里之前,我在调试器中找到了它...

标签: symfony doctrine-orm symfony-2.2


【解决方案1】:

您可以尝试将您的 Repo 声明为服务并添加调用以注入您的其他服务

#services.yml
entity.repo :
   class: 'YourRepoNamespace'
   factory-service: 'doctrine.orm.default_entity_manager'
   factory-method: 'getRepository'
   arguments: ['YourEntityNamespace']
   calls:
     - ['setOtherService', ['@other_service']] 

【讨论】:

  • 好的,我在 cmets 中找到了我来自@Cerad 的问题 - 问题是我需要它在不改变实例化 repo 的情况下工作 - 这样我处理它基本上是因为它用于项目中的许多地方,它被拉为 $em->getRepository('RepoName')。我根本无法确保它将通过 DIC 获得。还是谢谢你!
【解决方案2】:

好的,这确实不是一个干净的解决方案,但即使你想通过$entityManaget->getRepository() 继续获取 repo,它也可以工作。 由于该项目将很快被弃用,它已经足够好了......

只需将此 DIC getter 添加到您的 EntityRepository 类中,您就可以在项目的任何存储库中获取任何 DIC 服务...

protected function getDICService($serviceName)
{
    /** @var \AppKernel $kernel */
    $kernel = $GLOBALS['kernel'];
    $container = $kernel->getContainer();
    return $container->get($serviceName);
}

【讨论】:

  • 我能否建议您接受其他答案,因为未来阅读此问题的用户应该更喜欢其他解决方案。但是您的回答对您非常具体的问题有好处
  • 你好@goto。我还没有确认它会起作用,让我们做出妥协,让这个问题悬而未决,让用户投票选出最佳答案。它足够短,任何人都可以选择更适合他的解决方案。
  • @goto 问题是另一个答案不适用于 $entityManaget->getRepository() ,它比制作存储库服务更常用。最好的最新解决方案将使用自定义 Doctrine RepositoryFactory。
  • Cerad
猜你喜欢
  • 1970-01-01
  • 2017-01-13
  • 2012-07-17
  • 2016-05-05
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 2022-09-21
  • 2018-01-22
相关资源
最近更新 更多