Zend-framework-event-manager

提供:Dev Guides
移動先:案内検索

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がインストールしたすべてのコンポーネントを自動ロードします。

以下に示すように、クラス GreetersetEventManager メソッドを記述します-

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フレームワークで広く使用されています。