天天看點

Yaf學習筆記之鈎子與插件

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:

Yaf學習筆記之鈎子與插件

由上圖可見,

preDispatch

postDispatch

确實被觸發了兩次,同時兩個action中的視圖都渲染出來了。