何时使用动作注入以及何时在控制器的构造函数中注入依赖项?
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 两者的性能价格是多少?
例如:
- 您必须始终 不
__construct()
吗?
- 如果 class 中的所有方法都使用
FooService
,我是否仍然在每个方法中加载它们,还是现在使用 __construct
?
我如何决定实施哪种解决方案?
我目前的逻辑是“尽可能多地使用动作注入,因为这可以节省初始化所有控制器的时间,缺点是方法调用有点慢,因为现在必须在那里完成”
我认为这个主题处于 SO 允许范围的边缘,我正在寻找指导规则集,而不是评论或意见。
两种情况下都没有显着的性能或内存优势,注入的服务是引用,而不是新实例。
大多数现代设计在任何情况下都不会有具有多种不同方法的控制器。如果相同 class 的许多 public 方法具有非常不同的依赖关系,也许所有这些方法不属于同一个 class 开始?
归根结底,这些设计差异是一种风格选择。如今,构造函数注入往往是首选(至少在我身边),因为依赖关系是 class 需要在 valid stated 中才能工作的东西,在实例化时传递它们对许多人来说似乎更合乎逻辑。
在许多情况下将 this 作为方法参数传递本身并没有错(就像将任何其他类型的 callable
作为参数一样),但我认为最好的是 将控制器操作视为任何其他方法:
- 方法如何读起来更清晰?
- 方法使用者是否需要了解 class 依赖关系,并在调用时更改依赖关系,或者这是否超出了使用者的职责范围?
在 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 两者的性能价格是多少? 例如:
- 您必须始终 不
__construct()
吗? - 如果 class 中的所有方法都使用
FooService
,我是否仍然在每个方法中加载它们,还是现在使用__construct
?
我如何决定实施哪种解决方案?
我目前的逻辑是“尽可能多地使用动作注入,因为这可以节省初始化所有控制器的时间,缺点是方法调用有点慢,因为现在必须在那里完成”
我认为这个主题处于 SO 允许范围的边缘,我正在寻找指导规则集,而不是评论或意见。
两种情况下都没有显着的性能或内存优势,注入的服务是引用,而不是新实例。
大多数现代设计在任何情况下都不会有具有多种不同方法的控制器。如果相同 class 的许多 public 方法具有非常不同的依赖关系,也许所有这些方法不属于同一个 class 开始?
归根结底,这些设计差异是一种风格选择。如今,构造函数注入往往是首选(至少在我身边),因为依赖关系是 class 需要在 valid stated 中才能工作的东西,在实例化时传递它们对许多人来说似乎更合乎逻辑。
在许多情况下将 this 作为方法参数传递本身并没有错(就像将任何其他类型的 callable
作为参数一样),但我认为最好的是 将控制器操作视为任何其他方法:
- 方法如何读起来更清晰?
- 方法使用者是否需要了解 class 依赖关系,并在调用时更改依赖关系,或者这是否超出了使用者的职责范围?