ホームページ >バックエンド開発 >PHPチュートリアル >Zend Framework 2.0 Event Manager (The EventManager) 入門チュートリアル、zendeventmanager_PHP チュートリアル

Zend Framework 2.0 Event Manager (The EventManager) 入門チュートリアル、zendeventmanager_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:21:00878ブラウズ

Zend Framework 2.0 Event Manager (The EventManager) 入門チュートリアル、zendeventmanager

概要

EventManger は、次のユースケース向けに設計されたコンポーネントです:

コードをコピーします コードは次のとおりです:

単純な被験者/観察者パターンを実装する
アスペクト指向のデザインを実装する
イベント駆動型アーキテクチャを実装する

基本的なアーキテクチャでは、インスタンス ベースまたは共有トリガー イベントで特定のイベントのリスナーを追加および非アクティブ化し、リスナーの実行を終了できます。

クイックスタート

通常は、クラス内に EventManager を作成します。

コードをコピーします コードは次のとおりです:

ZendEventManagerEventManagerInterface を使用します;
ZendEventManagerEventManager を使用します;
ZendEventManagerEventManagerAwareInterface を使用します;

クラス Foo は EventManagerAwareInterface を実装します
{
保護された $events;

パブリック関数 setEventManager(EventManagerInterface $events)
{
$events->setIdentifiers(array(
) __クラス__、
get_called_class(),
));
$this->events = $events;
$this を返します;
}

パブリック関数 getEventManager()
{
If (null === $this->events) {
$this->setEventManager(new EventManager());
}
$this->events;
を返す }
}

上記のコードにより、ユーザーは EventManager インスタンスにアクセスしたり、新しいインスタンスでリセットしたりできます。インスタンスが存在しない場合は、使用時に遅延インスタンス化されます。

EventManager は、何らかのイベントをトリガーしたかどうかのみに関心があります。基本的なトリガーは、イベント名 (通常は現在の関数/メソッド名)、コンテキスト (通常は現在のオブジェクト インスタンス)、およびパラメーター (通常は現在の関数/メソッドに提供されるパラメーター) の 3 つのパラメーターを受け入れます。 。

コードをコピーします コードは次のとおりです:

クラスフー
{
// ... 上記のイベント定義を想定します

パブリック関数バー($baz, $bat = null)
{
$params = Compact('baz', 'bat');
$this->getEventManager()->trigger(__FUNCTION__, $this, $params);
}
}

順番に、イベントのトリガーでは、何かがイベントをリッスンしているかどうかのみが考慮されます。リスナーが EventManager に追加され、通知される特定のイベントとコールバックを指定します。コールバックは、イベント名、コンテキスト、パラメーターを取得するためのアクセサーを備えた Event オブジェクトを受け入れます。リスナーを追加してイベントを発生させましょう。

コードをコピーします コードは次のとおりです:

ZendLogFactory を LogFactory として使用します;

$log = LogFactory($someConfig);
$foo = 新しい 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 はパラメータ %s を使用して %s で呼び出しました',
$イベント、
$target,
$params
));
});

// 結果のログ メッセージ:
$foo->bar('baz', 'bat');
// 読み取り: bar が Foo で呼び出され、params {"baz" : "baz", "bat" : "bat"}"
を使用して

attach() の 2 番目の引数は有効なコールバックであることに注意してください。この例では、自己完結型を維持するための匿名関数が示されています。ただし、有効な関数名、関数オブジェクト、静的メソッドを参照する文字列、または特定の静的メソッドまたはインスタンス メソッドを持つコールバック配列を使用することもできます。繰り返しますが、PHP コールバックはすべて有効です。

場合によっては、EventManager クラスのオブジェクト インスタンスを作成せずにリスナーを指定したい場合があります。 Zend Framework は、SharedEventCollection の概念を通じてこれを実装します。簡単に言えば、よく知られている SharedEventCollection を使用してスタンドアロンの EventManager インスタンスを挿入すると、EventManager インスタンスに対して追加のリスナーがクエリされます。 SharedEventCollection に追加されるリスナーは通常のイベント マネージャーとほぼ同じです。attach の呼び出しは EventManager とまったく同じですが、最初に追加のパラメーター (指定されたインスタンス) が必要です。 EventManager のインスタンスを作成するときに、どのように __CLASS__ を渡したかを思い出してください。 SharedEventCollection を使用する場合、その値、またはコンストラクターに提供する配列内の任意の文字列を使用してインスタンスを識別することができます。たとえば、SharedEventManager インスタンスが EventManager インスタンスに (依存関係注入などによって) 注入されたことがわかっていると仮定すると、共有コレクションを介して追加するように上記の例を変更できます。

コードをコピーします コードは次のとおりです:
ZendLogFactory を LogFactory として使用します;

// $events が ZendEventManagerSharedEventManager インスタンスであると仮定します

$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 はパラメータ %s を使用して %s で呼び出しました',
$イベント、
$target,
$params
));
});

// 後で、Foo:
をインスタンス化します。 $foo = 新しい Foo();
$foo->getEventManager()->setSharedEventCollection($events);

// そして、上記のイベントをトリガーすることもできます:
$foo->bar('baz', 'bat');
// ログメッセージが生成されます:
// bar は、params {"baz" : "baz", "bat" : "bat"}"
を使用して Foo で呼び出されます

注意: 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 = 新しい SharedEventManager();
// コンテキスト「foo」の多くのイベントにアタッチします
$events->attach('foo', array('these', 'are', 'event', 'names'), $callback);

// コンテキスト「foo」と「bar」の多くのイベントにアタッチします
$events->attach(array('foo', 'bar'), array('these', 'are', 'event', 'names'), $callback);

優先度を指定すると、その優先度が指定されたすべてのイベントに使用されることに注意してください。

SharedEventManager を介してすべてのイベントを一度に追加します

コードをコピーします コードは次のとおりです:

$events = 新しい SharedEventManager();
// コンテキスト「foo」のすべてのイベントにアタッチします
$events->attach('foo', '*', $callback);

// コンテキスト「foo」と「bar」のすべてのイベントにアタッチします
$events->attach(array('foo', 'bar'), '*', $callback);

優先度を指定すると、その優先度が指定されたすべてのイベントに使用されることに注意してください。

上記のコードはコンテキスト「foo」と「bar」を指定しており、イベントがトリガーされると指定されたリスナーに通知されます。

設定オプション

イベントマネージャーのオプション

識別子

指定された EventManager インスタンスは、SharedEventManager 経由でアクセスされると、文字列または文字列の配列に応答できます。

イベントクラス

リスナーに渡されるイベントを表すために使用される代替 Event クラス名。

共有コレクション

イベントがトリガーされたときの SharedEventCollection インスタンス。

利用可能な方法

__構築

__construct(null|string|int 識別子)

コレクションを共有する目的で、指定された識別子 (指定されている場合) を使用して、新しい EventManager インスタンスを構築します。

setEventClass

setEventClass(string $class)

トリガーされたリスナーに渡されるイベントを作成するときに使用する置換イベント クラス名を提供します。

共有コレクションの設定

setSharedCollections(SharedEventCollection $collections=null)

イベントがトリガーされたときに使用される SharedEventCollection インスタンス。

共有コレクションを取得

getSharedCollections()

現在追加されている SharedEventCollection インスタンスを返します。コレクションが追加されない場合は、空または SharedEventCollection インスタンスを返します。

トリガー

トリガー(文字列 $event、混合 $target、混合 $argv、コールバック $callback)

指定されたイベントのすべてのリスナーをトリガーします。 $event には現在の関数/メソッド名を使用し、必要に応じて「.pre」、「.post」などを続けることをお勧めします。 $context は、現在のオブジェクトのインスタンス、またはオブジェクトを使用してトリガーされない場合は関数の名前である必要があります。 $params は通常、連想配列または ArrayAccess インスタンスにする必要があります。関数/メソッドに渡されるパラメーターを使用することをお勧めします (ここでは、compact() が便利です)。このメソッドはコールバックを受け入れることもでき、triggerUntil() と同じように動作します。

メソッドは、ResponseCollection のインスタンスを返します。これは、さまざまなリスナーから返された値のイントロスペクト、短絡のテストなどに使用できます。

トリガーまで

triggerUntil(string $event、mixed $context、mixed $argv、コールバック $callback)

trigger() と同様に、指定されたイベントのすべてのリスナーをトリガーします。ただし、各リスナーの戻り値を $callback に渡します。$callback がブール値の true を返した場合、リスナーの実行は終了します。 $result->stopped() を使用してこれをテストできます。

添付

attach(string $event, コールバック $callback, int $priority)

イベント $event をリッスンするために $callback を EventManager インスタンスに追加します。 $priority が指定されている場合、リスナーはその優先順位を使用して内部リスナー スタックに挿入され、より高い値が最初に実行されます。 (デフォルトの優先度は「1」で、負の値で実行されます。)

メソッドは ZendStdlibCallbackHandler のインスタンスを返します。この値は、必要に応じて後で detach() に渡すことができます。

集計を添付

attachAggregate(string|ListenerAggregate $aggregate)

文字列が $aggregate として渡された場合、そのクラスをインスタンス化します。その後、$aggregate が EventManager インスタンスのattach() メソッドに渡され、リスナーを登録できるようになります。

ListenerAggregate インスタンスを返します。

切り離す

デタッチ(CallbackHandler $listener)

すべてのリスナーをスキャンし、$listener に一致するリスナーの一致を解除して、リスナーがトリガーされなくなるようにします。

リスナーが割り当てられてサブスクライブ解除されている場合は true ブール値を返し、それ以外の場合は false ブール値を返します。

集約を切り離す

detachAggregate(ListenerAggregate $aggregate)

すべてのイベントをループして、コレクションが表すリスナーを決定します。すべての一致について、リスナーは削除されます。

リスナーが識別されてサブスクライブ解除されている場合は true ブール値を返し、それ以外の場合は false ブール値を返します。

イベントを取得

getEvent()

リスナーによって付加されたすべてのイベント名を含む配列を返します。

getListeners

getListeners(string $event)

$event に追加されたすべてのリスナーの ZendStdlibPriorityQueue インスタンスを返します

クリアリスナー

clearListeners(string $event)

$event に追加されたすべてのリスナーを削除します。

Args を準備する

prepareArgs(array $args)

提供された $args から ArrayObject を作成します。これは、リスナーがパラメータを変更できるようにして、後のリスナーまたはトリガーされたメソッドがこれらの変更を確認できるようにする場合に便利です。

zend フレームワーク 2 入門学習とコミュニケーション

貴重なスペースをお借りして、zend フレームワーク 2 についての交換と学習のための回答を差し上げたいと思います。ここに来て、もう少し人がいます。グループ番号 213966183

zendフレームワーク20のモジュール設定問題について

知っておくと良いです

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/861791.html技術記事 Zend Framework 2.0 イベント マネージャー (EventManager) 入門チュートリアル、zendeventmanager 概要 EventManger は、次の使用例向けに設計されたコンポーネントです。 コードをコピーします。 コードは次のとおりです:...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。