在资源文件中声明Symfony 4服务时将被忽略

时间:2019-02-27 10:10:04

标签: symfony symfony4

根据官方文档(here),我决定将services.yaml配置文件分为几个文件以提高可读性。

然后,我创建了一个文件config / services / doctrine_listeners.yaml,其中包含以下单个服务定义:

services:
    _defaults:
        autowire: true     
        autoconfigure: true

    App\Listeners\BookListener:
        tags:
            - { name: doctrine.event_listener, event: prePersist  }

然后将其这样导入到config / services.yaml中:

imports:
    - { resource: 'services/doctrine_listeners.yaml' }

以这种方式进行操作时,听众永远不会被实例化。如果我改为直接在config / services.yaml中声明它,则可以使用。

这对我来说似乎是个小虫,我错过了什么吗?

2 个答案:

答案 0 :(得分:3)

问题可能是该服务被默认服务文件覆盖。其中有一个src中所有类的PSR-4服务发现:

# makes classes in src/ available to be used as services
# this creates a service per class whose id is the fully-qualified class name
App\:
    resource: '../src/*'
    exclude: '../src/{DependencyInjection,Entity,Migrations,Tests,Kernel.php}'

这还将注册您的侦听器,并且看起来这将从文件内部覆盖以前的配置。

我建议将Listeners添加到services.yaml的排除部分中,然后将它们的服务发现移至您的文件中:

services:
    _defaults:
        autowire: true     
        autoconfigure: true

    App\Listeners\:
        resource: '../../src/Listeners/*'

    App\Listeners\BookListener:
        tags:
            - { name: doctrine.event_listener, event: prePersist  }

答案 1 :(得分:1)

最可能的原因是添加服务时出现了冗余,这不允许加载服务。如果您在此处共享config / services.yml内容,那就太好了。