首页 > 解决方案 > 无法在编译过程中添加学说订阅者标签

问题描述

我有一个简单的订阅者,如下所示:

namespace App;

use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\Events;

class TestSubscriber implements EventSubscriber
{
    public function getSubscribedEvents(): array
    {
        return [
            Events::onFlush,
        ];
    }

    public function onFlush(OnFlushEventArgs $eventArgs): void
    {
        // Some stuff
    }
}

当我在编译过程中添加 Doctrine 订阅者标签时,该onFlush方法永远不会被触发:

namespace App\DepencyInjection\Compiler;

use App\TestSubscriber;

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Definition;

class TestSubscriberPass implements CompilerPassInterface
{
    public function process(ContainerBuilder $container)
    {
        $definition = new Definition(TestSubscriber::class);
        $definition->addTag('doctrine.event_subscriber');
        $container->setDefinition('app.test_subscriber', $definition);
    }
}

但是,如果我在 中声明标签services.yaml,则效果很好:

services:
    app.test_subscriber:
        class: App\TestSubscriber
        tags:
            - { name: 'doctrine.event_subscriber' }

我错过了什么?编译过程成功执行,但标签似乎被忽略了。即使我禁用 TestSubscriber 类的自动装配,也会出现此问题。

这是debug:container命令输出: 在此处输入图像描述

标签: phpsymfonydoctrine-orm

解决方案


我终于找到了解决办法:编译过程必须在Doctrine编译之前执行,所以我在编译过程声明中设置了一个优先级增长器比0 Kernel.php

final class Kernel extends BaseKernel
{
    use MicroKernelTrait;
    
    protected function build(ContainerBuilder $container): void
    {
        $container->addCompilerPass(new TestSubscriberPass(), PassConfig::TYPE_BEFORE_OPTIMIZATION, 100);
    }
}

推荐阅读