特征可以注入服务吗?
Can traits have services injected?
在我的 Symfony 4.4 项目中,我想在每次触发 setSomething() setter 方法时添加特定方法,但也许我可以使用 traits?
特征可以注入服务吗?
是的,你可以,但它不会像服务中的自动装配那样自动注入。
这是我在我的服务中注入 TranslatorInterface 并在我的特征中使用的示例:
trait MyTrait
{
private TranslatorInterface $translator;
public function setTranslator(TranslatorInterface $translator): self
{
$this->translator = $translator;
return $this;
}
public functio myTraitFunction()
{
// use $this->translator
}
}
class MyClass
{
use MyTrait;
public function __construct(TranslatorInterface $translator)
{
$this->setTranslator($translator);
}
public function somFunction(): something
{
// use $this->myTraitFunction()
}
}
``
旁注,可能对未来的读者有用。如果你有一个基于服务或 class 成员的特征,我会选择像
这样的抽象方法
trait MyTrait
{
protected abstract function getTranslator(): TranslatorInterface;
[...]
}
然后在 class 中实现使用特征的方法。
就我个人而言,我宁愿不依赖于“setter 注入”,而是绑定两个仅在逻辑上耦合的方法。
如果你接受这个,这个问题实际上就不是问题,因为你可以以规范的方式注入服务。
在我的 Symfony 4.4 项目中,我想在每次触发 setSomething() setter 方法时添加特定方法,但也许我可以使用 traits?
特征可以注入服务吗?
是的,你可以,但它不会像服务中的自动装配那样自动注入。 这是我在我的服务中注入 TranslatorInterface 并在我的特征中使用的示例:
trait MyTrait
{
private TranslatorInterface $translator;
public function setTranslator(TranslatorInterface $translator): self
{
$this->translator = $translator;
return $this;
}
public functio myTraitFunction()
{
// use $this->translator
}
}
class MyClass
{
use MyTrait;
public function __construct(TranslatorInterface $translator)
{
$this->setTranslator($translator);
}
public function somFunction(): something
{
// use $this->myTraitFunction()
}
}
``
旁注,可能对未来的读者有用。如果你有一个基于服务或 class 成员的特征,我会选择像
这样的抽象方法trait MyTrait
{
protected abstract function getTranslator(): TranslatorInterface;
[...]
}
然后在 class 中实现使用特征的方法。
就我个人而言,我宁愿不依赖于“setter 注入”,而是绑定两个仅在逻辑上耦合的方法。
如果你接受这个,这个问题实际上就不是问题,因为你可以以规范的方式注入服务。