Zend-framework-event-manager
Zend Framework-イベントマネージャー
最新のアプリケーションにはすべて、堅実で柔軟なイベントコンポーネントが必要です。 Zend Frameworkは、 zend-eventmanager というコンポーネントを提供します。 zend-eventmanagerは、高レベルアーキテクチャの設計を支援し、サブジェクト/オブザーバーパターンとアスペクト指向プログラミングをサポートします。
イベントマネージャーをインストールする
イベントマネージャは、以下で指定されている Composer を使用してインストールできます-
composer require zendframework/zend-eventmanager
イベントマネージャーの概念
イベントマネージャのコアコンセプトは次のとおりです-
- Event -イベントは、 greet など、任意のアクションと呼ばれます。
- リスナー-PHPコールバック。 イベントに添付され、イベントがトリガーされると呼び出されます。 リスナーのデフォルトの署名は-
function(EventInterface $e)
- EventInterface Class -イベント自体を指定するために使用されます。 名前(set/getName)、ターゲット(get/setTarget)、パラメーター(get/setParams)などのイベント情報を設定および取得するメソッドがあります。
- * EventManagerクラス*-EventManagerのインスタンスは、アプリケーションおよびその対応するリスナーで定義されたすべてのイベントを追跡します。 EventManagerは、リスナーにイベントをアタッチする attach メソッドを提供し、事前定義されたイベントをトリガーする trigger メソッドを提供します。 トリガーが呼び出されると、EventManagerはそれに接続されたリスナーを呼び出します。
- EventManagerAwareInterface -イベントベースのプログラミングをサポートするクラスの場合、EventManagerAwareInterfaceを実装する必要があります。 イベントマネージャを取得および設定するための setEventManager および getEventManager の2つのメソッドを提供します。
例
イベントマネージャーの概念を理解するために、簡単なPHPコンソールアプリケーションを作成しましょう。 以下の手順に従ってください。
- フォルダー「eventapp」を作成します。
- コンポーザーを使用して zend-eventmanager をインストールします。
- 「eventapp」フォルダー内にPHPファイル Greeter.php を作成します。
- クラス Greeter を作成し、 EventManagerAwareInterface を実装します。
require __DIR__ . '/vendor/autoload.php';
class Greeter implements EventManagerAwareInterface {
//code
}
ここでは、 require を使用して、Composerがインストールしたすべてのコンポーネントを自動ロードします。
以下に示すように、クラス Greeter で setEventManager メソッドを記述します-
public function setEventManager(EventManagerInterface $events) {
$events->setIdentifiers([ __CLASS__, get_called_class(),]);
$this->events = $events;
return $this;
}
このメソッドは、現在のクラスを特定のイベントマネージャー($ events引数)に設定し、ローカル変数 $ events にイベントマネージャーを設定します。
次のステップは、以下に示すように Greeter クラスに getEventManager メソッドを記述することです-
public function getEventManager() {
if (null === $this->events) {
$this->setEventManager(new EventManager());
}
return $this->events;
}
このメソッドは、ローカル変数からイベントマネージャーを取得します。 使用できない場合は、イベントマネージャーのインスタンスを作成して返します。
クラス Greeter にメソッド greet を記述します。
public function greet($message) {
printf("\"%s\" from class\n", $message);
$this->getEventManager()->trigger(__FUNCTION__, $this, $message ]);
}
このメソッドは、イベントマネージャーを取得し、それに関連付けられたイベントを起動またはトリガーします。
次のステップは、 Greeter クラスのインスタンスを作成し、そのメソッド greet にリスナーをアタッチすることです。
$greeter = new Greeter();
$greeter->getEventManager()->attach('greet', function($e) {
$event_name = $e->getName();
$target_name = get_class($e->getTarget());
$params_json = json_encode($e->getParams());
printf("\"%s\" event of class \"%s\" is called." .
" The parameter supplied is %s\n",
$event_name,
$target_name,
$params_json);
});
リスナーコールバックは、イベント、ターゲット、および指定されたパラメーターの名前を出力するだけです。
*Greeter.php* の完全なリストは次のとおりです-
<?php
require __DIR__ . '/vendor/autoload.php';
use Zend\EventManager\EventManagerInterface;
use Zend\EventManager\EventManager;
use Zend\EventManager\EventManagerAwareInterface;
class Greeter implements EventManagerAwareInterface {
protected $events;
public function setEventManager(EventManagerInterface $events) {
$events->setIdentifiers([__CLASS__, get_called_class(), ]);
$this->events = $events;
return $this;
}
public function getEventManager() {
if (null === $this->events) {
$this->setEventManager(new EventManager());
}
return $this->events;
}
public function greet($message) {
printf("\"%s\" from class\n", $message);
$this->getEventManager()->trigger(__FUNCTION__, $this, [$message ]);
}
}
$greeter = new Greeter();
$greeter->greet("Hello");
$greeter->getEventManager()->attach('greet', function($e) {
$event_name = $e->getName();
$target_name = get_class($e->getTarget());
$params_json = json_encode($e->getParams());
printf("\"%s\" event of class \"%s\" is called." . " The parameter supplied is %s\n",
$event_name,
$target_name,
$params_json);
});
$greeter->greet("Hello");
今、コマンドプロンプトphp Greeter.php でアプリケーションを実行すると、結果は次のようになります-
"Hello" from class
"Hello" from class
"greet" event of class "Greeter" is called. The parameter supplied is ["Hello"]
上記のサンプルアプリケーションでは、イベントマネージャの基本のみを説明しています。 イベントマネージャーは、*リスナーの優先度、カスタムコールバックプロトタイプ/署名、短絡など*など、より高度なオプションを提供します。 イベントマネージャーは、Zend MVCフレームワークで広く使用されています。