jmikola/wildcard-event-dispatcher-bundle

增强Symfony2事件调度器,支持由AMQP主题交换机启发的通配符模式。

v1.0.3 2016-09-14 20:17 UTC

This package is auto-updated.

Last update: 2024-09-06 08:42:07 UTC


README

Build Status

此包将 WildcardEventDispatcher 库与Symfony集成,并允许使用受AMQP主题交换机启发的通配符模式分配事件监听器。

Symfony的事件调度器组件和框架现有的事件命名约定(点分隔的单词)已经与AMQP消息路由键非常相似。此包旨在少量使用,其中通配符可以替换中央监听器(如活动日志服务)的冗长配置。

有关此包的一些背景信息可以在symfony-devs 邮件列表中找到。

兼容性

此包需要Symfony 2.3或更高版本。

配置

没有配置选项。Symfony将自动加载包的依赖注入扩展。

该扩展将创建一个服务,它通过 组合 现有的 event_dispatcher 服务并假定其服务ID。根据是否启用调试模式,此包可能会包装FrameworkBundle的ContainerAwareEventDispatcherTraceableEventDispatcher类的一个实例。

监听通配符事件模式

此包允许您在分配事件监听器时使用单词 * 和多词 # 通配符。通配符运算符在WildcardEventDispatcher 的文档中有更详细的描述。

单词通配符

考虑当前 acme.listener 服务正在监听多个 core 事件的情况

<!-- Acme/MainBundle/Resources/config/listener.xml -->

<service id="acme.listener" class="Acme/MainBundle/Listener">
    <tag name="kernel.listener" event="core.exception" method="onCoreEvent" />
    <tag name="kernel.listener" event="core.request" method="onCoreEvent" />
    <tag name="kernel.listener" event="core.response" method="onCoreEvent" />
</service>

您可以将上述配置重构为使用单词 * 通配符

<!-- Acme/MainBundle/Resources/config/listener.xml -->

<service id="acme.listener" class="Acme/MainBundle/Listener">
    <tag name="kernel.listener" event="core.*" method="onCoreEvent" />
</service>

此监听器现在将观察所有以 core. 开头并跟另一个单词的事件。名为 core 的事件也将与该模式匹配。

多词通配符

假设您的应用程序中有一个名为 core.foo.bar 的事件。前面提到的 core.* 模式不会匹配此事件。您可以

<!-- Acme/MainBundle/Resources/config/listener.xml -->

<service id="acme.listener" class="Acme/MainBundle/Listener">
    <tag name="kernel.listener" event="core.*.*" method="onCoreEvent" />
</service>

此语法将匹配 core.foocore.foo.bar,但 core 将不再匹配(假设存在这样的事件);然而,多词 # 通配符允许匹配所有这些事件名称

<!-- Acme/MainBundle/Resources/config/listener.xml -->

<service id="acme.listener" class="Acme/MainBundle/Listener">
    <tag name="kernel.listener" event="core.#" method="onCoreEvent" />
</service>

您还可以使用 # 通配符来监听应用程序中的 所有 事件

<!-- Acme/MainBundle/Resources/config/listener.xml -->

<service id="acme.listener" class="Acme/MainBundle/Listener">
    <tag name="kernel.listener" event="#" method="onAnyEvent" />
</service>