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

标签 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 中声明它,它就可以工作。

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

最佳答案

问题可能是服务被默认服务文件覆盖。其中有一个针对 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  }

关于Symfony 4 服务在资源文件中声明时被忽略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54902936/

相关文章:

symfony - 尝试将 FOSUserBundle 安装到 Symfony2 时遇到问题

composer-php - Symfony 演示应用程序安装失败 - pdo_sqlite 丢失

php - Symfony 4 路由注释导致 openapi 注释错误

php - 替换/装饰 `translation.reader`

symfony - 查找/自定义 Symfony Forms Twig block 名称

database - Doctrine 中给出的 Symfony2 : spl_object_hash() expects parameter 1 to be object, 字符串

php - 在 symfony 中避免依赖注入(inject)中的容器字符串

symfony - PhpStorm Xdebug Symfony 配置

php - 使用 `must implement interface Doctrine\ORM\EntityManagerInterface error` 将 EntityManagerInterface 注入(inject)我的服务

Symfony 4针对不同环境的不同安全配置