Symfony:使用Repository中的服务(类似于Controller)

时间:2017-10-23 10:16:58

标签: php symfony service repository

在Controller中,我使用的服务包括:

$this->get('version')->doSomething();

如何从存储库中执行相同操作?

注意:我不想在Repository构造函数中注入服务,因为我只在许多Repository方法中使用该服务。

2 个答案:

答案 0 :(得分:1)

CONDA_DEFAULT_ENV要求您将DI容器注入控制器构造函数。它是在Symfony控制器的幕后完成的。 因此,访问您的服务的两种方法是注入整个容器(这是一个反模式,但每个人都使用它)或者只将您的服务注入另一个类。

如果您不想将服务注入构造函数,请使用setter injection

services.yml:

$this->get('service')

服务类

 app.newsletter_manager:
     class: AppBundle\SomeRepository
     calls:
         - [setService, ['@service']]

答案 1 :(得分:1)

将服务注入存储库是不良做法,您不应该这样做。

虽然如果想要与get->('any.service')一起使用的解决方案,它将如下所示:

services.yml

app.some_service:
  class: 'AppBundle\Repositories\SomeEntityRepository'
  factory: ["@doctrine.orm.entity_manager", getRepository]
  arguments:
    - 'AppBundle\Entity\SomeEntity'
  calls:
    - [setContainer, ["@service_container"]]

在您的存储库类中:

class SomeEntityRepository implements ContainerAwareInterface
{
    use ContainerAwareTrait;

    public function foo()
    {
        $bar = $this->container->get('app.bar_service');
    }
}

注入个人服务而不是服务容器也更好。