Bundle的services.yaml中的Symfony 4 _instanceof

时间:2018-07-04 12:30:03

标签: php symfony service bundle symfony4

我有一个捆绑包,其界面为Optimax\HealthCheckBundle\Service\HealthInterface 我需要为实现此接口的所有服务设置标签。我使用以下指令进行操作:

_instanceof:
  Optimax\HealthCheckBundle\Service\HealthInterface:
    tags: ['health.service']

当我将该指令放入config/services.yaml时,它可以正常工作。但是,如果我将此代码放入包的配置中(通过作曲家需要)vendor/optimax/health-check/src/Resources/config/services.yaml,它将无法正常工作。我不想每次将这个捆绑包复制到新项目中时都将此指令复制粘贴到services.yaml中。

如何将该指令移至Bundle目录中的services.yaml或至少移至项目config/packages文件夹中的另一个文件中?

2 个答案:

答案 0 :(得分:3)

您是否尝试在Bundle扩展程序中使用此接口自动标记所有服务,如下所示:

$container->registerForAutoconfiguration(CustomInterface::class)
     ->addTag('app.custom_tag')
;

来自Symfony文档: https://symfony.com/doc/current/service_container/tags.html

答案 1 :(得分:1)

为其他人扩展此问题。

_instanceof的功能与_defaults的定义相同。因为_instanceof定义仅适用于使用它的文件。

这可以防止第三方捆绑软件定义影响您的整个应用程序,例如:

_defaults: 
    public: true
    autowire: false

_instanceof:
    Psr\Log\LoggerAwareInterface:
        - method: setLogger
          arguments:
              - '@custom_logger'
        tags:
            - { name: monologer.log, channel: 'custom_channel' }

因此,如果您尝试用_instanceof标记的服务未在同一services.yml文件中声明,则不会添加标记。

要标记在整个应用程序中实现接口的服务,您需要使用method provided by @Jeroen