Symfony AutoWire多个服务同类

Hel*_*hka 6 autowired symfony symfony4

我正在将大型应用程序升级到4.2

并且$this->get(".....") 不推荐使用控制器内部,而应该使用AutoWire.

我遇到的问题是我有2个服务,实际上是来自同一个类(只是不同的构造函数args).

services.yml

services:
  service.a:
    class: Namespace\MyClass
    arguments: [ "argument1" ]

  service.b:
    class: Namespace\MyClass
    arguments: [ "argument2" ]
Run Code Online (Sandbox Code Playgroud)

控制器:

public function demoAction() {
  $serviceA = $this->get("service.a");
  $serviceB = $this->get("service.b");
}
Run Code Online (Sandbox Code Playgroud)

以及有问题的结果:

public function demoAction(MyClass $serviceA, MyClass $serviceB) {
}
Run Code Online (Sandbox Code Playgroud)

我们可以使用别名来服务定义,例如:

MyClass: '@service.a'
Run Code Online (Sandbox Code Playgroud)

但我不能使用虚拟/假类(没有现有的):

MyPseudClass: '@service.b'
Run Code Online (Sandbox Code Playgroud)

你如何在autowire模式下处理这样的案例?

我可以创建"伪"类,从基础扩展,只是为了获得不同的类名,但这感觉很奇怪.

小智 11

从4.2开始,您可以定义命名的自动装配别名.这应该工作:

services:
    Namespace\MyClass $serviceA: '@service.a'
    Namespace\MyClass $serviceB: '@service.b'
Run Code Online (Sandbox Code Playgroud)

使用Symfony 3.4和4.1,您可以使用绑定 - 但这不是特定的,因为它不考虑类型:

services:
    _defaults:
        bind:
            $serviceA: '@service.a'
            $serviceB: '@service.b'
Run Code Online (Sandbox Code Playgroud)