Php Symfony:使用存储库中的服务(类似于控制器中的服务)

Php Symfony:使用存储库中的服务(类似于控制器中的服务),php,symfony,service,repository,Php,Symfony,Service,Repository,在控制器中,我使用具有以下功能的服务: $this->get('version')->doSomething(); 如何从存储库中执行相同的操作 注意:我不想在存储库构造函数中注入服务,因为我只在许多存储库方法中的一种中使用该服务。$this->get('service')要求您将DI容器注入控制器构造函数。这是在Symfony控制器的后台完成的。 因此,访问您的服务的两种方法是注入整个容器(这是一个反模式,但每个人都使用它)或只将您的服务注入另一个类 如果不想将服务注入构造函数,

在控制器中,我使用具有以下功能的服务:

$this->get('version')->doSomething();
如何从存储库中执行相同的操作

注意:我不想在存储库构造函数中注入服务,因为我只在许多存储库方法中的一种中使用该服务。

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

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

services.yml:

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

class SomeRepository
{

    private $service;

    public function setService(ServiceClass $service)
    {
        $this->service = $service;
    }

    // ...
}

将服务注入存储库是一种糟糕的做法,您不应该这样做

虽然如果想要使用
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');
    }
}

最好是注入单个服务,而不是服务容器。

您不能使用
$this->get(…)
in repository方法。控制器中的这个方法使用服务容器(很容易加载),很可能您不需要将服务直接注入到存储库中,存储库应该只保存/读取数据。看看CQR和命令总线模式。在StackOverflow上看到关于同一主题的10多个问题后,我把我的答案放到帖子上:。我想你会在那里找到答案:)如果没有,请点击我,我会回答你的特定用例。的可能副本不是已经将服务注入到存储库反模式了吗?@ukaszD.Tulikowski是的。但更重要的是——注入整个容器,将其用作服务定位器,而不阅读前面的评论:)我使用这个解决方案,它工作得很好。构造函数中的标准注入每次都创建服务。此解决方案更好,因为“服务”仅在需要时创建。非常感谢。