ZendFramework-イベントマネージャー

最新のアプリケーションにはすべて、堅牢で柔軟なイベントコンポーネントが必要です。Zend Frameworkは、そのようなコンポーネントの1つを提供します。zend-eventmanager。zend-eventmanagerは、高レベルのアーキテクチャーの設計を支援し、サブジェクト/オブザーバーパターンとアスペクト指向プログラミングをサポートします。

イベントマネージャをインストールする

イベントマネージャは、を使用してインストールできます。 Composer 以下に指定されているように-

composer require zendframework/zend-eventmanager

イベントマネージャーの概念

イベントマネージャーのコアコンセプトは次のとおりです-

  • Event −イベントは任意の名前のアクションです。 greet

  • Listener−PHPコールバック。それらはイベントに添付され、イベントがトリガーされると呼び出されます。リスナーのデフォルトの署名は-です。

function(EventInterface $e)
  • EventInterface Class−イベント自体を指定するために使用されます。名前(set / getName)、ターゲット(get / setTarget)、パラメーター(get / setParams)などのイベント情報を設定および取得するメソッドがあります。

  • EventManager class− EventManagerのインスタンスは、アプリケーションとそれに対応するリスナーで定義されたすべてのイベントを追跡します。EventManagerはメソッドを提供します。attach リスナーをイベントにアタッチし、メソッドを提供します。 trigger事前定義されたイベントをトリガーします。トリガーが呼び出されると、EventManagerはそれに接続されているリスナーを呼び出します。

  • EventManagerAwareInterface−イベントベースのプログラミングをサポートするクラスの場合、EventManagerAwareInterfaceを実装する必要があります。それは2つの方法を提供します、setEventManager そして getEventManager イベントマネージャを取得して設定します。

イベントマネージャの概念を理解するための簡単なPHPコンソールアプリケーションを作成しましょう。以下の手順に従ってください。

  • 「eventapp」フォルダを作成します。

  • インストール zend-eventmanager 作曲家を使用します。

  • PHPファイルを作成する Greeter.php 「eventapp」フォルダ内。

  • クラスを作成する Greeter を実装します EventManagerAwareInterface

require __DIR__ . '/vendor/autoload.php'; 
class Greeter implements EventManagerAwareInterface { 
   // code 
}

ここに、 require Composerにインストールされているすべてのコンポーネントを自動ロードするために使用されます。

書きます setEventManager クラスのメソッド Greeter 以下に示すように-

public function setEventManager(EventManagerInterface $events) { 
   $events->setIdentifiers([ __CLASS__, get_called_class(),]); 
   $this->events = $events; 
   return $this; 
}

このメソッドは、現在のクラスを指定されたイベントマネージャー($ events引数)に設定してから、イベントマネージャーをローカル変数に設定します $events

次のステップは書くことです getEventManager クラスのメソッド Greeter 以下に示すように-

public function getEventManager() { 
   if (null === $this->events) { 
      $this->setEventManager(new EventManager()); 
   } 
   return $this->events; 
}

このメソッドは、ローカル変数からイベントマネージャーを取得します。使用できない場合は、イベントマネージャのインスタンスを作成して返します。

メソッドを書いて、 greet、 クラスで Greeter

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"]

上記のサンプルアプリケーションは、イベントマネージャの基本のみを説明しています。イベントマネージャは、次のような多くのより高度なオプションを提供します。Listener Priority, Custom Callback Prototype / Signature, Short Circuiting, など。イベントマネージャーは、ZendMVCフレームワークで広く使用されています。