Yaf中定義了6個鈎子(Hook),相當于事件,在插件(Plugin)類中定義與鈎子相同名稱的方法,注冊之後,這些方法便會被架構自動調用。
一、鈎子清單
觸發順序 | 名稱 | 觸發時機 | 說明 |
---|---|---|---|
1 | routerStartup | 路由之前 | 觸發最早的一個事件 |
2 | routerShutdown | 路由結束之後 | |
3 | dispatchLoopStartup | 分發循環開始前 | |
4 | preDispatch | 分發之前 | 如果勤求處理過程中發送了forward,則該事件可能觸發多次 |
5 | postDispatch | 分發之後 | 動作執行結束,視圖渲染完成,也可能觸發多次 |
6 | dispatchLoopShutdown | 分發循環結束 | 所有業務邏輯已經完成,響應還未發送 |
二、插件
- 插件類的預設目錄預設為
。plugins
- 插件類必須繼承自
。Yaf_Plugin_Abstract
- 插件類中定義的與Yaf 鈎子相同名稱的方法,要接受
執行個體和Yaf_Request_Abstract
執行個體,作為參數,否則會報錯。Yaf_Response_Abstract
寫個例子來加深了解:
1. 定義插件
定義一個TracePlugin插件,其中定義Yaf架構中的6個Hook同名方法。
<?php
class TracePlugin extends Yaf_Plugin_Abstract
{
public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response)
{
echo __METHOD__, " ...<br/>";
}
public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response)
{
echo __METHOD__, " ...<br/>";
}
public function dispatchLoopStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response)
{
echo __METHOD__, " ...<br/>";
}
public function preDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response)
{
echo __METHOD__, " ...<br/>";
}
public function postDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response)
{
echo __METHOD__, " ...<br/>";
}
public function dispatchLoopShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response)
{
echo __METHOD__, " ...<br/>";
}
}
以上代碼儲存為 application/plugins/Trace.php。
2. 注冊插件
在
$app->run();
之前注冊插件:
$app->getDispatcher()->registerPlugin(new TracePlugin);
3.測試插件
IndexController内容如下:
<?php
class IndexController extends Yaf_Controller_Abstract
{
public function indexAction()
{
$this->getView()->assign("content", "Hello World");
$this->forward('user');
}
public function userAction()
{
$this->getView()->assign("content", "action user");
}
}
以上代碼儲存為application/controllers/Index.php。
為了測試多次觸發
preDispatch
和
postDispatch
,
indexAction
中
forward
到了
userAction
。
浏覽器中通路yaf.cc/index/index:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICdzFWRoRXdvN1LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX9EFVNpHNXlVMs5mYxgmMZZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DM0QTN0EjM3ETNxQDM3EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
由上圖可見,
preDispatch
和
postDispatch
确實被觸發了兩次,同時兩個action中的視圖都渲染出來了。