symfony2我自己的事件

时间:2012-11-26 21:10:51

标签: events symfony dispatcher

我通过facebook进行授权和身份验证,如下所示: http://symfony.com/doc/current/cookbook/security/custom_authentication_provider.html 它的工作原理

现在我想创建自己的事件,当用户使用facebook进行身份验证时,此事件将执行某些操作。例如,将用户重定向到主页。 我是这样做的 http://symfony.com/doc/current/components/event_dispatcher/introduction.html

所以我有这门课 http://pastebin.com/2FTndtL4

我不知道如何实现它,我应该将什么作为参数传递给构造函数

2 个答案:

答案 0 :(得分:2)

这很简单。 Symfony 2事件系统功能强大,服务标签可以完成这项工作。

  1. 将调度程序注入要触发事件的类。服务ID为event_dispatcher;
  2. 在需要时使用$this->dispatcher->dispatch('facebook.post_auth', new FilterFacebookEvent($args))点击活动
  3. 制作实施EventSubscriberInterface的服务,定义静态getSubscribedEvents()方法。当然你想听facebook.post_auth事件。
  4. 所以你的静态方法看起来像:

    static public function getSubscribedEvents()
    {
        return array(
            'facebook.post_auth' => 'onPostAuthentication'
        );
    }
    
    public function onPostAuthentication(FilterFacebookEvent $event)
    {
        // Do something, get the event args, etc
    }
    

    最后将此服务注册为调度程序的订阅者:给它一个标记(例如facebook.event_subscriber),然后创建RegisterFacebookEventsSubscribersPass(参见this tutorial)。编译器传递应检索所有标记的服务,并在循环内调用:

    $dispatcher  = $container->getDefinition('event_dispatcher');
    $subscribers = $container->findTaggedServiceIds('facebook.event_subscriber');
    
    foreach($subscribers as $id => $attributes) {
        $definition->addMethodCall('addSubscriber', array(new Reference($id)));
    }
    

    通过这种方式,您可以快速创建订阅者(例如,记录日志),只需标记您的服务。

答案 1 :(得分:1)

事件对象只是某种状态/数据存储。它保留的数据可用于通过订阅者和/或监听器调度某种事件。因此,例如,如果您想将facebook id传递给您的Listener(s) - 事件是存储它的正确方法。事件也是调度员的返回值。如果要从监听器/订阅者返回一些数据 - 您还可以将其存储在Event对象中。