何时使用动作注入以及何时在控制器的构造函数中注入依赖项?

When to use action injection and when to inject dependencies on the constructor for controllers?

在 Symfony 中,您可以直接将服务注入控制器功能:

use App\Service\FooService;

class FooController
{
    public function one(FooService $fooService){
        $fooService->doSomething();
    }
}

但是用同样的努力,你可以在构造中使用它:

class FooController
{
    public function __construct(private FooService $fooService){}

    public function two(){
        $this->fooService->doSomething();
    }
}

我正在寻找 reasons/guides 何时注射以及何时不注射。 pro/cons 两者的性能价格是多少? 例如:

我如何决定实施哪种解决方案?

我目前的逻辑是“尽可能多地使用动作注入,因为这可以节省初始化所有控制器的时间,缺点是方法调用有点慢,因为现在必须在那里完成”

我认为这个主题处于 SO 允许范围的边缘,我正在寻找指导规则集,而不是评论或意见。

两种情况下都没有显着的性能或内存优势,注入的服务是引用,而不是新实例。

大多数现代设计在任何情况下都不会有具有多种不同方法的控制器。如果相同 class 的许多 public 方法具有非常不同的依赖关系,也许所有这些方法不属于同一个 class 开始?

归根结底,这些设计差异是一种风格选择。如今,构造函数注入往往是首选(至少在我身边),因为依赖关系是 class 需要在 valid stated 中才能工作的东西,在实例化时传递它们对许多人来说似乎更合乎逻辑。

在许多情况下将 this 作为方法参数传递本身并没有错(就像将任何其他类型的 callable 作为参数一样),但我认为最好的是 将控制器操作视为任何其他方法:

  • 方法如何读起来更清晰?
  • 方法使用者是否需要了解 class 依赖关系,并在调用时更改依赖关系,或者这是否超出了使用者的职责范围?