- Zend Framework 教程
- Zend Framework - 首頁
- Zend Framework - 簡介
- Zend Framework - 安裝
- 框架應用
- Zend Framework - MVC 架構
- Zend Framework - 概念
- Zend Framework - 服務管理器
- Zend Framework - 事件管理器
- Zend Framework - 模組系統
- 應用程式結構
- Zend Framework - 建立模組
- Zend Framework - 控制器
- Zend Framework - 路由
- Zend Framework - 檢視層
- Zend Framework - 佈局
- 模型與資料庫
- 不同的資料庫
- 表單與驗證
- Zend Framework - 檔案上傳
- Zend Framework - Ajax
- Cookie 管理
- 會話管理
- Zend Framework - 身份驗證
- 郵件管理
- Zend Framework - 單元測試
- Zend Framework - 錯誤處理
- Zend Framework - 工作示例
- Zend Framework 有用資源
- Zend Framework - 快速指南
- Zend Framework - 有用資源
- Zend Framework - 討論
Zend Framework - 事件管理器
所有現代應用程式都需要強大且靈活的事件元件。Zend Framework 提供了一個這樣的元件,zend-eventmanager。zend-eventmanager 有助於設計高階架構,並支援釋出/訂閱模式和麵向方面的程式設計。
安裝事件管理器
事件管理器可以使用Composer安裝,如下所示:
composer require zendframework/zend-eventmanager
事件管理器的概念
事件管理器的核心概念如下:
事件 - 事件是任意命名的動作,例如greet。
監聽器 - 任何 PHP 回撥函式。它們附加到事件,並在事件觸發時被呼叫。監聽器的預設簽名為:
function(EventInterface $e)
EventInterface 類 - 用於指定事件本身。它具有設定和獲取事件資訊的方法,例如名稱 (set/getName)、目標 (get/setTarget) 和引數 (get/setParams)。
EventManager 類 - EventManager 的例項跟蹤應用程式中所有定義的事件及其相應的監聽器。EventManager 提供了一個方法 attach 用於將監聽器附加到事件,並提供了一個方法 trigger 用於觸發任何預定義的事件。一旦觸發被呼叫,EventManager 就會呼叫附加到它的監聽器。
EventManagerAwareInterface - 為了讓一個類支援基於事件的程式設計,它需要實現 EventManagerAwareInterface。它提供了兩個方法,setEventManager 和 getEventManager 用於獲取和設定事件管理器。
示例
讓我們編寫一個簡單的 PHP 控制檯應用程式來理解事件管理器的概念。請按照以下步驟操作。
建立一個名為“eventapp”的資料夾。
使用 composer 安裝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 框架中被廣泛使用。