用于事件类的 Symfony DI

0 php events dependency-injection symfony

我的项目中有一些使用 DI 的事件。当我的事件是 App\Manager\ValidatorAwareInterface 的实例时,我配置注入 @validator 服务。

当我在 services.yaml 中有此代码时,它可以工作:

services:
    _instanceof:
        App\Manager\Validator\ValidatorAwareInterface:
            calls:
                -   method: setValidator
                    arguments:
                        - '@validator'
Run Code Online (Sandbox Code Playgroud)

但是,当我将相同的代码放入在 services.yaml 中导入的 manager.yaml 文件中时,它不再起作用:

imports:
    - { resource: manager.yaml }
Run Code Online (Sandbox Code Playgroud)

你知道为什么吗?

谢谢。

Cer*_*rad 5

@stephan.mada 的回答可能会解决你的问题。

但我想指出一个鲜为人知的注释,称为“@required”,它根本不需要显式配置您的设置器。

use Symfony\Component\Validator\Validator\ValidatorInterface;

trait ValidatorTrait
{
    /** @var ValidatorInterface */
    protected $validator;

    /** @required */
    public function injectValidator(ValidatorInterface $validator)
    {
        $this->validator = $this->validator ?: $validator;
    }
}
Run Code Online (Sandbox Code Playgroud)

注入方法之前的“@required”会导致容器自动注入依赖项。services.yaml 中的 setter 内容可以完全消失。您看不到“@required”的大量使用,但它对于常见注入的服务确实派上用场。

您可能还注意到我在这里使用了一个特征。有了特质,我不再需要基类或接口。任何使用该特征的服务都会自动注入验证器服务。如果您愿意,当然可以使用传统的课程。

class SomeService
{
    use ValidatorTrait; // And the validator is now available
    use RouterTrait;    // As well as the router
Run Code Online (Sandbox Code Playgroud)

最后一点。我添加了一个警卫以确保验证器只能注入一次。这可以防止流氓程序员可能试图在周期的其他时刻注入不同的验证器。