概要
EventManger は、次のユースケース向けに設(shè)計(jì)されたコンポーネントです:
単純なサブジェクト/オブザーバー パターンの実裝
アスペクト指向設(shè)計(jì)の実裝
イベント駆動(dòng)型アーキテクチャの実裝
基本的なアーキテクチャにより、指定されたイベントを追加および非アクティブ化できますリスナーは、インスタンスベースであっても共有コレクションであっても、リスナーの実行を終了します。
クイックスタート
通常、クラス內(nèi)に 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 インスタンスにアクセスしたり、新しいインスタンスでリセットしたりできます。インスタンスが存在しない場(chǎng)合は、使用時(shí)に遅延インスタンス化されます。
EventManager は、何らかのイベントをトリガーしたかどうかのみに関心があります?;镜膜圣去辚`は、イベント名 (通常は現(xiàn)在の関數(shù)/メソッド名)、コンテキスト (通常は現(xiàn)在のオブジェクト インスタンス)、およびパラメーター (通常は現(xiàn)在の関數(shù)/メソッドに提供されるパラメーター) の 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 番目の引數(shù)は任意の有効なコールバックであることに注意してください。この例では、自己完結(jié)型を維持するための匿名関數(shù)が示されています。ただし、有効な関數(shù)名、関數(shù)オブジェクト、靜的メソッドを參照する文字列、または特定の靜的メソッドまたはインスタンス メソッドを持つコールバック配列を使用することもできます。繰り返しますが、PHP コールバックはすべて有効です。
場(chǎng)合によっては、EventManager クラスのオブジェクト インスタンスを作成せずにリスナーを指定したい場(chǎng)合があります。 Zend Framework は、SharedEventCollection の概念を通じてこれを?qū)g裝します。簡(jiǎn)単に言えば、よく知られている SharedEventCollection を使用してスタンドアロンの EventManager インスタンスを挿入すると、EventManager インスタンスに対して追加のリスナーがクエリされます。 SharedEventCollection に追加されるリスナーは通常のイベント マネージャーとほぼ同じです。attach の呼び出しは EventManager とまったく同じですが、最初に追加のパラメーター (指定されたインスタンス) が必要です。 EventManager のインスタンスを作成するときに、どのように __CLASS__ を渡したかを思い出してください。 SharedEventCollection を使用する場(chǎng)合、その値、またはコンストラクターに提供する配列內(nèi)の任意の文字列を使用してインスタンスを識(shí)別することができます。例として、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 にアクセスする場(chǎng)所や方法を心配する必要がなく、StaticEventManager::getInstance() を呼び出すだけでグローバルに利用できます。
ただし、フレームワークではその使用が非推奨となっていることに注意してください。2.0.0beta4 では、SharedEventManager インスタンスを構(gòu)成し、それを別の EventManager インスタンスに挿入することで置き換えることになります。
ワイルドカード リスナー
場(chǎng)合によっては、特定のインスタンスの多くまたはすべてのイベントに同じリスナーを追加したり、共有イベント コレクション、多くのコンテキスト、および多くのイベントを使用したりすることができます。 EventManager コンポーネントによりこれが可能になります。
複數(shù)のイベントを一度に追加する
$events = new EventManager(); $events->attach(array('these', 'are', 'event', 'names'), $callback);
ワイルドカードを使用して追加する
$events = new EventManager(); $events->attach('*', $callback);
優(yōu)先度を指定すると、その優(yōu)先度がこのリスナーによって起動(dòng)されるすべてのイベントに使用されることに注意してください。
上記のコードは、トリガーがトリガーされるたびに、この特定のリスナーに通知が送信されることを指定します。
SharedEventManager を使用して複數(shù)のイベントを一度に追加します
$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);
優(yōu)先順位を指定すると、その優(yōu)先順位が指定されたすべてのイベントに使用されることに注意してください。
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);
優(yōu)先順位を指定すると、その優(yōu)先順位が指定されたすべてのイベントに使用されることに注意してください。
上記のコードはコンテキスト「foo」と「bar」を指定しており、イベントがトリガーされると指定されたリスナーに通知されます。
設(shè)定オプション
EventManager オプション
識(shí)別子
SharedEventManager 経由でアクセスされたときに、特定の EventManager インスタンスが応答できる文字列または文字列の配列。
event_class
リスナーに渡されるイベントを表すために使用される代替 Event クラスの名前。
shared_collections
イベントがトリガーされたときの SharedEventCollection インスタンス。
利用可能なメソッド
__construct
__construct(null|string|int Sidentifier)
コレクションを共有する目的で、指定された識(shí)別子 (指定されている場(chǎng)合) を使用して新しい EventManager インスタンスを構(gòu)築します。
setEventClass
setEventClass(string $class)
トリガーされたリスナーに渡されるイベントを作成するときに使用する置換イベント クラス名を提供します。
setSharedCollections
setSharedCollections(SharedEventCollection $collections=null)
イベントがトリガーされたときに使用される SharedEventCollection インスタンス。
getSharedCollections
getSharedCollections()
現(xiàn)在追加されている SharedEventCollection インスタンスを返します。コレクションが追加されない場(chǎng)合は、空または SharedEventCollection インスタンスを返します。
trigger
trigger(string $event,mixed$target,mixed$argv,callback$callback)
指定されたイベントのすべてのリスナーをトリガーします。 $event には現(xiàn)在の関數(shù)/メソッド名を使用し、必要に応じて「.pre」、「.post」などを続けることをお?jiǎng)幛幛筏蓼埂?$context は、現(xiàn)在のオブジェクトのインスタンス、またはオブジェクトを使用してトリガーされない場(chǎng)合は関數(shù)の名前である必要があります。 $params は通常、連想配列または ArrayAccess インスタンスにする必要があります。関數(shù)/メソッドに渡されるパラメーターを使用することをお?jiǎng)幛幛筏蓼?(ここでは、compact() が便利です)。このメソッドはコールバックを受け入れることもでき、triggerUntil() と同じように動(dòng)作します。
メソッドは、ResponseCollection のインスタンスを返します。これは、さまざまなリスナーによって返された値のイントロスペクト、短絡(luò)のテストなどに使用できます。
triggerUntil
triggerUntil(string $event,mixed$context,mixed$argv,callback$callback)
各リスナーに使用される點(diǎn)を除いて、trigger()と同様に、指定されたイベントのすべてのリスナーをトリガーします。値が $callback に渡され、$callback がブール値 true を返した場(chǎng)合、リスナーの実行は終了します。 $result->stopped() を使用してこれをテストできます。
attach
attach(string $event, callback $callback, int $priority)
$callback を EventManager インスタンスに追加し、イベント $event をリッスンします。 $priority が指定されている場(chǎng)合、リスナーはその優(yōu)先順位を使用して內(nèi)部リスナー スタックに挿入され、より高い値が最初に実行されます。 (デフォルトの優(yōu)先順位は「1」で、負(fù)の値で実行されます。)
メソッドは ZendStdlibCallbackHandler のインスタンスを返します。この値は、必要に応じて後で detach() に渡すことができます。
attachAggregate
attachAggregate(string|ListenerAggregate $aggregate)
$aggregate として文字列が渡された場(chǎng)合、そのクラスをインスタンス化します。その後、$aggregate が EventManager インスタンスのattach() メソッドに渡され、リスナーを登録できるようになります。
ListenerAggregate インスタンスを返します。
detach
detach(CallbackHandler $listener)
すべてのリスナーをスキャンし、$listener に一致するリスナーをすべてデタッチして、トリガーされなくなるようにします。
リスナーが割り當(dāng)てられてサブスクライブ解除されている場(chǎng)合は true ブール値を返し、それ以外の場(chǎng)合は false ブール値を返します。
detachAggregate
detachAggregate(ListenerAggregate $aggregate)
すべてのイベントをループして、すべての一致に対してコレクションによって表されるリスナーを決定します。リスナーは削除されます。
リスナーが識(shí)別されてサブスクライブ解除されている場(chǎng)合は true ブール値を返し、それ以外の場(chǎng)合は false ブール値を返します。
getEvents
getEvent()
リスナーにアタッチされたすべてのイベントの名前を含む配列を返します。
getListeners
getListeners(string $event)
$event に追加されたすべてのリスナーの ZendStdlibPriorityQueue インスタンスを返します
clearListeners
clearListeners(string $event)
$event デバイスに追加されたすべてのリスナーを削除します。
prepareArgs
prepareArgs(array $args)
指定された $args から ArrayObject を作成します。これは、リスナーがパラメータを変更できるようにして、後のリスナーまたはトリガーされたメソッドがこれらの変更を確認(rèn)できるようにする場(chǎng)合に便利です。
Zend Framework 2.0 Event Manager (The EventManager) 入門(mén)チュートリアルに関連するその他の記事については、PHP 中國(guó)語(yǔ) Web サイトに注目してください。

ホットAIツール

Undress AI Tool
脫衣畫(huà)像を無(wú)料で

Undresser.AI Undress
リアルなヌード寫(xiě)真を作成する AI 搭載アプリ

AI Clothes Remover
寫(xiě)真から衣服を削除するオンライン AI ツール。

Clothoff.io
AI衣類(lèi)リムーバー

Video Face Swap
完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版
中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1
強(qiáng)力な PHP 統(tǒng)合開(kāi)発環(huán)境

ドリームウィーバー CS6
ビジュアル Web 開(kāi)発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)