概要
EventManger は、次のユースケース向けに設計されたコンポーネントです:
単純なサブジェクト/オブザーバー パターンの実装
アスペクト指向設計の実装
イベント駆動型アーキテクチャの実装
基本的なアーキテクチャにより、指定されたイベントを追加および非アクティブ化できますリスナーは、インスタンスベースであっても共有コレクションであっても、リスナーの実行を終了します。
クイックスタート
通常、クラス内に EventManager を作成します。
use Zend\EventManager\EventManagerInterface; use Zend\EventManager\EventManager; use Zend\EventManager\EventManagerAwareInterface; class Foo implements EventManagerAwareInterface { protected $events; public function setEventManager(EventManagerInterface $events) { $events->setIdentifiers(array( __CLASS__, get_called_class(), )); $this->events = $events; return $this; } public function getEventManager() { if (null === $this->events) { $this->setEventManager(new EventManager()); } return $this->events; } }
上記のコードにより、ユーザーは EventManager インスタンスにアクセスしたり、新しいインスタンスでリセットしたりできます。インスタンスが存在しない場合は、使用時に遅延インスタンス化されます。
EventManager は、何らかのイベントをトリガーしたかどうかのみに関心があります。基本的なトリガーは、イベント名 (通常は現在の関数/メソッド名)、コンテキスト (通常は現在のオブジェクト インスタンス)、およびパラメーター (通常は現在の関数/メソッドに提供されるパラメーター) の 3 つのパラメーターを受け入れます。 。
class Foo { // ... assume events definition from above public function bar($baz, $bat = null) { $params = compact('baz', 'bat'); $this->getEventManager()->trigger(__FUNCTION__, $this, $params); } }
つまり、イベントのトリガーでは、何かがイベントをリッスンしているかどうかだけが考慮されます。リスナーが EventManager に追加され、通知される特定のイベントとコールバックを指定します。コールバックは、イベント名、コンテキスト、パラメーターを取得するためのアクセサーを備えた Event オブジェクトを受け入れます。リスナーを追加してイベントを発生させましょう。
use Zend\Log\Factory as LogFactory; $log = LogFactory($someConfig); $foo = new Foo(); $foo->getEventManager()->attach('bar', function ($e) use ($log) { $event = $e->getName(); $target = get_class($e->getTarget()); $params = json_encode($e->getParams()); $log->info(sprintf( '%s called on %s, using params %s', $event, $target, $params )); }); // Results in log message: $foo->bar('baz', 'bat'); // reading: bar called on Foo, using params {"baz" : "baz", "bat" : "bat"}"
attach() の 2 番目の引数は任意の有効なコールバックであることに注意してください。この例では、自己完結型を維持するための匿名関数が示されています。ただし、有効な関数名、関数オブジェクト、静的メソッドを参照する文字列、または特定の静的メソッドまたはインスタンス メソッドを持つコールバック配列を使用することもできます。繰り返しますが、PHP コールバックはすべて有効です。
場合によっては、EventManager クラスのオブジェクト インスタンスを作成せずにリスナーを指定したい場合があります。 Zend Framework は、SharedEventCollection の概念を通じてこれを実装します。簡単に言えば、よく知られている SharedEventCollection を使用してスタンドアロンの EventManager インスタンスを挿入すると、EventManager インスタンスに対して追加のリスナーがクエリされます。 SharedEventCollection に追加されるリスナーは通常のイベント マネージャーとほぼ同じです。attach の呼び出しは EventManager とまったく同じですが、最初に追加のパラメーター (指定されたインスタンス) が必要です。 EventManager のインスタンスを作成するときに、どのように __CLASS__ を渡したかを思い出してください。 SharedEventCollection を使用する場合、その値、またはコンストラクターに提供する配列内の任意の文字列を使用してインスタンスを識別することができます。例として、SharedEventManager インスタンスが EventManager インスタンスに (たとえば、依存関係注入によって) 注入されたことがわかっていると仮定すると、共有コレクション経由でそれを追加するように上記の例を変更できます:
use Zend\Log\Factory as LogFactory; // Assume $events is a Zend\EventManager\SharedEventManager instance $log = LogFactory($someConfig); $events->attach('Foo', 'bar', function ($e) use ($log) { $event = $e->getName(); $target = get_class($e->getTarget()); $params = json_encode($e->getParams()); $log->info(sprintf( '%s called on %s, using params %s', $event, $target, $params )); }); // Later, instantiate Foo: $foo = new Foo(); $foo->getEventManager()->setSharedEventCollection($events); // And we can still trigger the above event: $foo->bar('baz', 'bat'); // results in log message: // bar called on Foo, using params {"baz" : "baz", "bat" : "bat"}"
注: StaticEventManager
2.0.0beta3 では、StaticEventManager シングルトンを SharedEventCollection として使用できます。こうすることで、SharedEventCollection にアクセスする場所や方法を心配する必要がなく、StaticEventManager::getInstance() を呼び出すだけでグローバルに利用できます。
ただし、フレームワークではその使用が非推奨となっていることに注意してください。2.0.0beta4 では、SharedEventManager インスタンスを構成し、それを別の EventManager インスタンスに挿入することで置き換えることになります。
ワイルドカード リスナー
場合によっては、特定のインスタンスの多くまたはすべてのイベントに同じリスナーを追加したり、共有イベント コレクション、多くのコンテキスト、および多くのイベントを使用したりすることができます。 EventManager コンポーネントによりこれが可能になります。
複数のイベントを一度に追加する
$events = new EventManager(); $events->attach(array('these', 'are', 'event', 'names'), $callback);
ワイルドカードを使用して追加する
$events = new EventManager(); $events->attach('*', $callback);
優先度を指定すると、その優先度がこのリスナーによって起動されるすべてのイベントに使用されることに注意してください。
上記のコードは、トリガーがトリガーされるたびに、この特定のリスナーに通知が送信されることを指定します。
SharedEventManager を使用して複数のイベントを一度に追加します
$events = new SharedEventManager(); // Attach to many events on the context "foo" $events->attach('foo', array('these', 'are', 'event', 'names'), $callback); // Attach to many events on the contexts "foo" and "bar" $events->attach(array('foo', 'bar'), array('these', 'are', 'event', 'names'), $callback);
優先順位を指定すると、その優先順位が指定されたすべてのイベントに使用されることに注意してください。
SharedEventManager を使用してすべてのイベントを一度に追加します
$events = new SharedEventManager(); // Attach to all events on the context "foo" $events->attach('foo', '*', $callback); // Attach to all events on the contexts "foo" and "bar" $events->attach(array('foo', 'bar'), '*', $callback);
優先順位を指定すると、その優先順位が指定されたすべてのイベントに使用されることに注意してください。
上記のコードはコンテキスト「foo」と「bar」を指定しており、イベントがトリガーされると指定されたリスナーに通知されます。
設定オプション
EventManager オプション
識別子
SharedEventManager 経由でアクセスされたときに、特定の EventManager インスタンスが応答できる文字列または文字列の配列。
event_class
リスナーに渡されるイベントを表すために使用される代替 Event クラスの名前。
shared_collections
イベントがトリガーされたときの SharedEventCollection インスタンス。
利用可能なメソッド
__construct
__construct(null|string|int Sidentifier)
コレクションを共有する目的で、指定された識別子 (指定されている場合) を使用して新しい EventManager インスタンスを構築します。
setEventClass
setEventClass(string $class)
トリガーされたリスナーに渡されるイベントを作成するときに使用する置換イベント クラス名を提供します。
setSharedCollections
setSharedCollections(SharedEventCollection $collections=null)
イベントがトリガーされたときに使用される SharedEventCollection インスタンス。
getSharedCollections
getSharedCollections()
現在追加されている SharedEventCollection インスタンスを返します。コレクションが追加されない場合は、空または SharedEventCollection インスタンスを返します。
trigger
trigger(string $event,mixed$target,mixed$argv,callback$callback)
指定されたイベントのすべてのリスナーをトリガーします。 $event には現在の関数/メソッド名を使用し、必要に応じて「.pre」、「.post」などを続けることをお勧めします。 $context は、現在のオブジェクトのインスタンス、またはオブジェクトを使用してトリガーされない場合は関数の名前である必要があります。 $params は通常、連想配列または ArrayAccess インスタンスにする必要があります。関数/メソッドに渡されるパラメーターを使用することをお勧めします (ここでは、compact() が便利です)。このメソッドはコールバックを受け入れることもでき、triggerUntil() と同じように動作します。
メソッドは、ResponseCollection のインスタンスを返します。これは、さまざまなリスナーによって返された値のイントロスペクト、短絡のテストなどに使用できます。
triggerUntil
triggerUntil(string $event,mixed$context,mixed$argv,callback$callback)
各リスナーに使用される点を除いて、trigger()と同様に、指定されたイベントのすべてのリスナーをトリガーします。値が $callback に渡され、$callback がブール値 true を返した場合、リスナーの実行は終了します。 $result->stopped() を使用してこれをテストできます。
attach
attach(string $event, callback $callback, int $priority)
$callback を EventManager インスタンスに追加し、イベント $event をリッスンします。 $priority が指定されている場合、リスナーはその優先順位を使用して内部リスナー スタックに挿入され、より高い値が最初に実行されます。 (デフォルトの優先順位は「1」で、負の値で実行されます。)
メソッドは ZendStdlibCallbackHandler のインスタンスを返します。この値は、必要に応じて後で detach() に渡すことができます。
attachAggregate
attachAggregate(string|ListenerAggregate $aggregate)
$aggregate として文字列が渡された場合、そのクラスをインスタンス化します。その後、$aggregate が EventManager インスタンスのattach() メソッドに渡され、リスナーを登録できるようになります。
ListenerAggregate インスタンスを返します。
detach
detach(CallbackHandler $listener)
すべてのリスナーをスキャンし、$listener に一致するリスナーをすべてデタッチして、トリガーされなくなるようにします。
リスナーが割り当てられてサブスクライブ解除されている場合は true ブール値を返し、それ以外の場合は false ブール値を返します。
detachAggregate
detachAggregate(ListenerAggregate $aggregate)
すべてのイベントをループして、すべての一致に対してコレクションによって表されるリスナーを決定します。リスナーは削除されます。
リスナーが識別されてサブスクライブ解除されている場合は true ブール値を返し、それ以外の場合は false ブール値を返します。
getEvents
getEvent()
リスナーにアタッチされたすべてのイベントの名前を含む配列を返します。
getListeners
getListeners(string $event)
$event に追加されたすべてのリスナーの ZendStdlibPriorityQueue インスタンスを返します
clearListeners
clearListeners(string $event)
$event デバイスに追加されたすべてのリスナーを削除します。
prepareArgs
prepareArgs(array $args)
指定された $args から ArrayObject を作成します。これは、リスナーがパラメータを変更できるようにして、後のリスナーまたはトリガーされたメソッドがこれらの変更を確認できるようにする場合に便利です。
Zend Framework 2.0 Event Manager (The EventManager) 入門チュートリアルに関連するその他の記事については、PHP 中国語 Web サイトに注目してください。