php - 无法在编译过程中添加学说订阅者标签
问题描述
我有一个简单的订阅者,如下所示:
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 类的自动装配,也会出现此问题。
解决方案
我终于找到了解决办法:编译过程必须在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);
}
}
推荐阅读
- python - python模块pytube的on_progress_callback问题
- google-api - 带有 Oauth2 的 Google Web Client 突然停止工作
- angular - 如何使用 routerLinkActive 更改材质按钮类型
- python - 如何在 discord.py 中将图像裁剪为带有枕头的圆形?
- c# - C# 按日期对列表框项进行排序
- reactjs - 使用 UseState 更新 React 中的子对象(并将其连接回父对象)
- python - Django 角色权限 - available_permissions 不会自动分配给组
- jmeter - 我们可以用不同的 ip 在 jmeter 中发送 5000 个请求吗
- reactjs - 在不使用 store 的情况下使用 reducer dispatch 在 React 组件之外工作的解决方法是什么
- anaconda - 制作一个可使用 Conda 安装的 python 库