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

vbo*_*eix 2 symfony symfony4

按照官方文档(这里),我决定将我的 services.yaml 配置文件拆分为几个文件以提高可读性。

然后我创建了一个包含这个单一服务定义的文件 config/services/doctrine_listeners.yaml :

services:
    _defaults:
        autowire: true     
        autoconfigure: true

    App\Listeners\BookListener:
        tags:
            - { name: doctrine.event_listener, event: prePersist  }
Run Code Online (Sandbox Code Playgroud)

我在我的 config/services.yaml 中像这样导入它:

imports:
    - { resource: 'services/doctrine_listeners.yaml' }
Run Code Online (Sandbox Code Playgroud)

当这样进行时,侦听器永远不会被实例化。如果我直接在 config/services.yaml 中声明它,它就可以工作。

这对我来说看起来像是一个错误,我错过了什么吗?

dbr*_*ann 5

问题可能是该服务被默认服务文件覆盖。其中 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}'
Run Code Online (Sandbox Code Playgroud)

这也将注册您的侦听器,看起来这将覆盖您文件中的先前配置。

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

services:
    _defaults:
        autowire: true     
        autoconfigure: true

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

    App\Listeners\BookListener:
        tags:
            - { name: doctrine.event_listener, event: prePersist  }
Run Code Online (Sandbox Code Playgroud)