特征可以注入服务吗?

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 注入”,而是绑定两个仅在逻辑上耦合的方法。

如果你接受这个,这个问题实际上就不是问题,因为你可以以规范的方式注入服务。