在Symfony2中放置EventDispatcher的位置以及如何将其与Annotations一起使用?

时间:2012-02-23 10:10:47

标签: configuration event-handling annotations symfony dispatcher

我开始使用 Symfony2框架进行开发,我喜欢使用Eventdispatcher。现在我有三个问题我可以通过谷歌找到答案。

  1. 我将调度员放置在哪里,以便可以从中随处访问 应用程序?

  2. 如何配置自拍?我应该将所有文件放在一个文件中 每个bunble一个?

  3. 用注释配置它需要多少努力,即 @Event("some.event")?这可能吗?

2 个答案:

答案 0 :(得分:3)

常规

我可能会建议将EventDispatcher上的Symfony 2文档作为一个很好的起点,假设您的意思是希望提供自定义事件而不是自定义事件调度程序。

Symfony2 Internals - The Event Dispatcher

活动地点

就位置而言,相应捆绑包中的“事件”文件夹是一个不错的选择。事件的实际调度可能仅在束上下文中发生,而侦听器可能驻留在其他地方。然而,这是一个单独的主题并且具有最小的相关性,因为它们只是订阅事件的字符串名称(例如,'store.order'以借用文档的示例)并且只需要知道事件的接口/类型。

所以你可能在'Zap'命名空间的'Bar'包中有一个名为'Foo'的事件:

namespace Zap\Bar\Event;

use Symfony\Component\EventDispatcher\Event;

class FooEvent extends Event
{
    // ...
}

当您从捆绑包中发送事件时,您可以选择使用事件标识符'zap.bar.foo',当然您可以从其他地方注册侦听器以获得有关此标识符的通知看得合适。

访问事件调度程序

如果您希望访问主EventDispatcher实例,请获取对依赖注入容器的访问权限并检索“event_dispatcher”服务。一个简单的方法是让您的类扩展'ContainerAware',然后使用

检索调度程序
$dispatcher = $this->container->get('event_dispatcher');

答案 1 :(得分:2)

回答你的第一个问题:

  

我在哪里放置调度员,以便可以从应用程序的任何地方访问?

实际上,已经预先配置的事件调度程序服务可以通过调用$dispatcher = $this->container->get('event_dispatcher');@jstephenson指出,因此您无需在任何地方创建自己的实例。

但是,如果您需要自己的事件调度程序,只需在捆绑包的服务配置文件(即services.xml)中进行配置即可:

<service id="my_dispatcher" class="Symfony\Component\EventDispatcher\EventDispatcher" />

您可以使用自己的调度程序类,只要它实现EventDispatcherInterface。