天天看点

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中的视图都渲染出来了。