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同名方法。



class TracePlugin extends Yaf_Plugin_Abstract
{
    public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response)
    {
        echo __METHOD__, " ...
"
; } public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { echo __METHOD__, " ...
"
; } public function dispatchLoopStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { echo __METHOD__, " ...
"
; } public function preDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { echo __METHOD__, " ...
"
; } public function postDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { echo __METHOD__, " ...
"
; } public function dispatchLoopShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) { echo __METHOD__, " ...
"
; } }

以上代码保存为 application/plugins/Trace.php。

2. 注册插件

$app->run();之前注册插件:

$app->getDispatcher()->registerPlugin(new TracePlugin);

3.测试插件

IndexController内容如下:



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。

为了测试多次触发preDispatchpostDispatchindexActionforward到了userAction

浏览器中访问yaf.cc/index/index:
Yaf学习笔记之钩子与插件_第1张图片

由上图可见,preDispatchpostDispatch确实被触发了两次,同时两个action中的视图都渲染出来了。

你可能感兴趣的:(Yaf学习笔记之钩子与插件)