The Generic Event Object

The base Event class provided by the EventDispatcher component is deliberately sparse to allow the creation of API specific event objects by inheritance using OOP. This allows for elegant and readable code in complex applications.

EventDispatcher コンポーネントによって提供される基本 Event クラスは、OOP を使用した継承によって API 固有のイベント オブジェクトを作成できるように意図的に疎になっています。これにより、複雑なアプリケーションで洗練された読みやすいコードが可能になります。

The GenericEvent is available for convenience for those who wish to use just one event object throughout their application. It is suitable for most purposes straight out of the box, because it follows the standard observer pattern where the event object encapsulates an event 'subject', but has the addition of optional extra arguments.

GenericEvent は、アプリケーション全体で 1 つのイベント オブジェクトのみを使用したい場合に便利です。これは、イベント オブジェクトがイベントの「サブジェクト」をカプセル化する標準的なオブザーバー パターンに従いますが、オプションの余分な引数が追加されているため、箱から出してすぐにほとんどの目的に適しています。

GenericEvent adds some more methods in addition to the base class Event

GenericEvent は、基本 classEvent に加えていくつかのメソッドを追加します
  • __construct(): Constructor takes the event subject and any arguments;
    __construct():Constructor は、イベントのサブジェクトと任意の引数を取ります。
  • getSubject(): Get the subject;
    getSubject():件名を取得します。
  • setArgument(): Sets an argument by key;
    setArgument(): キーで引数を設定します。
  • setArguments(): Sets arguments array;
    setArguments(): 引数配列を設定します。
  • getArgument(): Gets an argument by key;
    getArgument(): キーで引数を取得します。
  • getArguments(): Getter for all arguments;
    getArguments(): すべての引数のゲッター。
  • hasArgument(): Returns true if the argument key exists;
    hasArgument(): 引数キーが存在する場合は true を返します。

The GenericEvent also implements ArrayAccess on the event arguments which makes it very convenient to pass extra arguments regarding the event subject.

GenericEvent は、イベント引数に ArrayAccess も実装しているため、イベント サブジェクトに関する追加の引数を渡すのに非常に便利です。

The following examples show use-cases to give a general idea of the flexibility. The examples assume event listeners have been added to the dispatcher.

次の例は、柔軟性の一般的な考え方を示すユースケースを示しています。例では、イベントリスナーがディスパッチャに追加されていることを前提としています。

Passing a subject:

件名を渡す:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
use Symfony\Component\EventDispatcher\GenericEvent;

$event = new GenericEvent($subject);
$dispatcher->dispatch($event, 'foo');

class FooListener
{
    public function handler(GenericEvent $event)
    {
        if ($event->getSubject() instanceof Foo) {
            // ...
        }
    }
}

Passing and processing arguments using the ArrayAccess API to access the event arguments:

イベント引数にアクセスするための ArrayAccess API を使用した引数の受け渡しと処理:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use Symfony\Component\EventDispatcher\GenericEvent;

$event = new GenericEvent(
    $subject,
    ['type' => 'foo', 'counter' => 0]
);
$dispatcher->dispatch($event, 'foo');

class FooListener
{
    public function handler(GenericEvent $event)
    {
        if (isset($event['type']) && 'foo' === $event['type']) {
            // ... do something
        }

        $event['counter']++;
    }
}

Filtering data:

データのフィルタリング:
1
2
3
4
5
6
7
8
9
10
11
12
use Symfony\Component\EventDispatcher\GenericEvent;

$event = new GenericEvent($subject, ['data' => 'Foo']);
$dispatcher->dispatch($event, 'foo');

class FooListener
{
    public function filter(GenericEvent $event)
    {
        $event['data'] = strtolower($event['data']);
    }
}