9

http://symfony.com/doc/master/components/event_dispatcher/introduction.htmlの例に基づいて、単純なイベント サブスクリプションを設定しようとしています。

これが私のイベントストアです:

namespace CookBook\InheritanceBundle\Event;

final class EventStore
{
    const EVENT_SAMPLE = 'event.sample';
}

これが私のイベントサブスクライバーです:

namespace CookBook\InheritanceBundle\Event;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\EventDispatcher\Event;

class Subscriber implements EventSubscriberInterface
{
    public static function getSubscribedEvents()
    {
        var_dump('here');
        return array(
                'event.sample' => array(
                        array('sampleMethod1', 10),
                        array('sampleMethod2', 5)
                ));
    }

    public function sampleMethod1(Event $event)
    {
        var_dump('Method 1');
    }

    public function sampleMethod2(Event $event)
    {
        var_dump('Method 2');
    }
}

services.yml の構成は次のとおりです。

kernel.subscriber.subscriber:
    class: CookBook\InheritanceBundle\Event\Subscriber
    tags:
        - {name:kernel.event_subscriber}

そして、これが私がイベントを発生させる方法です:

use Symfony\Component\EventDispatcher\EventDispatcher;
use CookBook\InheritanceBundle\Event\EventStore;
$dispatcher = new EventDispatcher();
$dispatcher->dispatch(EventStore::EVENT_SAMPLE);

期待される出力:

string 'here' (length=4)
string 'Method 1' (length=8)
string 'Method 2' (length=8)

実際の出力:

string 'here' (length=4)

何らかの理由で、リスナー メソッドが呼び出されません。このコードのどこが間違っているか知っている人はいますか? ありがとう。

4

2 に答える 2

8

@トリスタンが言ったこと。サービス ファイルのタグ部分は Symfony バンドルの一部であり、コンテナーからディスパッチャーをプルした場合にのみ処理されます。

これを行うと、例は期待どおりに機能します。

$dispatcher = new EventDispatcher();
$dispatcher->addSubscriber(new Subscriber());
$dispatcher->dispatch(EventStore::EVENT_SAMPLE);
于 2013-08-28T14:20:42.587 に答える