【问题标题】:Where to place EventDispatcher in Symfony2 and how to use it with Annotations?在 Symfony2 中将 EventDispatcher 放置在哪里以及如何将它与 Annotations 一起使用?
【发布时间】:2012-02-23 10:10:46
【问题描述】:

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

  1. 我放置调度程序的位置,以便可以从任何地方访问它 那个应用?

  2. 如何配置自定义事件?我应该将所有内容放在一个文件中还是 每个捆绑一个?

  3. 用注解配置它要花多少功夫,即 @Event("some.event")?这可能吗?

【问题讨论】:

    标签: configuration event-handling annotations symfony dispatcher


    【解决方案1】:

    常规

    如果您的意思是希望提供自定义事件而不是自定义事件调度程序,我可能会建议您将有关 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');
    

    【讨论】:

    • 不,我喜欢按原样使用 Dispatcher,但我不知道在我的应用程序中创建和放置对象的位置。第二个问题是配置,尽可能在所有侦听器方法上添加注释。
    • 我已经扩展了我的答案,希望这有助于进一步。我没有提到注释,因为我不确定你要达到什么目的。
    • 非常感谢,但不幸的是它对我没有帮助。 :( 我需要一个调度程序来触发一个事件。那么在应用程序中初始化调度程序的共同点在哪里?以及我如何无法从任何我想要的地方访问该对象?
    • 使用事件注释我只想将一个方法标记为一个或多个事件的侦听器。
    【解决方案2】:

    回答你的第一个问题:

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

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

    但是,如果您需要自己的事件调度器,您可以像这样在您的捆绑包的服务配置文件(即 services.xml)中简单地配置它:

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

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

    【讨论】:

      猜你喜欢
      • 2017-08-05
      • 2010-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多