Php 如何在Symfony中将服务注入到操作中?

Php 如何在Symfony中将服务注入到操作中?,php,symfony,dependency-injection,interface,Php,Symfony,Dependency Injection,Interface,我感兴趣的是,是否可以将实现我的接口的定制服务注入到操作中。从表面上看,这是不可能的。为了正确理解我,让我向您展示一个简单的exmaple: Les假设我们有一个控制器C1,它有两个动作:一个动作和一个动作。有一个实现接口为的服务S1。好啊 在行动中,我计划使用这项服务。它是在“app.s1.service”名称下注册的,因此,正如我们所知,我可以使用以下命令获得此服务: $this->get('app.s1.service'); 通过使用某种第三方包,比如 我们可以用其他方式来做。无论

我感兴趣的是,是否可以将实现我的接口的定制服务注入到操作中。从表面上看,这是不可能的。为了正确理解我,让我向您展示一个简单的exmaple:

Les假设我们有一个控制器C1,它有两个动作:一个动作和一个动作。有一个实现接口为的服务S1。好啊 在行动中,我计划使用这项服务。它是在“app.s1.service”名称下注册的,因此,正如我们所知,我可以使用以下命令获得此服务:

$this->get('app.s1.service');
通过使用某种第三方包,比如 我们可以用其他方式来做。无论如何困扰我的是,我想确定,如果有一天,有人包装了一个新的服务S2,并希望以实际行动更改我的服务,它不会破坏整个应用程序,因为S2中没有合适的方法,实际上一个新的开发人员没有实现我的接口。我不想将此服务注入构造函数,因为在一个操作中我不使用它。就像在Laravel中一样,我希望有可能将inteface注入到我的操作中,并得到适当的实现。 我在玩ControllerResolver,但这类问题看起来相当复杂。我想避免在我的行为中进行额外的检查,比如:

$s2 = $this->get('app.s2.service')
if (!$s2 instanceof IS) {
  // ... bla bla bla
}

提前感谢。

我想您可以先配置service.yml,然后注入app.s2.service的实例。也许它能按你的愿望工作。显然,您并没有将其直接注入到操作中,而是将其注入到控制器(现在它是一个服务)构造函数中。@Muriano OP提到,他不想通过构造函数注入依赖项,而是直接注入到操作方法中。这就是问题的重点。对不起,我理解错了。好的,有了这个“更新”,我想你可以做一个小把戏,创建一个返回给你的愿望服务的实例。这不是正确的处理方法,但它可以很好地工作。您可以尝试使用“裸包”方法。因此,每个操作都将是一个单独的控制器,并且只保存它的依赖项。还可以覆盖默认的控制器解析器,该解析器负责注入方法参数。但是@DmitryGrachikov有一个解决方案,移动到每个控制器一个操作。一旦你采取了这一步,许多事情就会变得更干净。