2

我通过 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

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

4

2 回答 2

2

这真的很简单。Symfony 2 事件系统功能强大,服务标签可以胜任。

  1. 将调度程序注入到要触发事件的类中。服务 ID 是event_dispatcher
  2. 在需要时触发事件$this->dispatcher->dispatch('facebook.post_auth', new FilterFacebookEvent($args))
  3. 创建一个实现的服务EventSubscriberInterface,定义一个静态getSubscribedEvents()方法。当然你想听facebook.post_auth事件。

所以你的静态方法看起来像:

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(参见本教程)。您的编译器传递应该检索所有标记的服务,并且在循环内应该调用:

$dispatcher  = $container->getDefinition('event_dispatcher');
$subscribers = $container->findTaggedServiceIds('facebook.event_subscriber');

foreach($subscribers as $id => $attributes) {
    $definition->addMethodCall('addSubscriber', array(new Reference($id)));
}

通过这种方式,您可以快速让订阅者(例如,用于登录)简单地标记您的服务。

于 2012-11-26T21:30:47.860 回答
1

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

于 2012-11-26T21:29:30.620 回答