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:
由上图可见,
preDispatch
和
postDispatch
确实被触发了两次,同时两个action中的视图都渲染出来了。