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をリスナーに渡したい場合-イベントは、それを保存する正しい方法です。また、イベントはディスパッチャの戻り値です。リスナー/サブスクライバーからデータを返したい場合は、イベントオブジェクトに保存することもできます。

于 2012-11-26T21:29:30.620 に答える