7.2. Yaf支持的Hook

Yaf定义了6个会被触发的Hook, 它们分别是:

表 7.1. Yaf的Hook

触发顺序 名称 触发时机 说明
1 routerStartup 在路由之前触发 这个是7个事件中, 最早的一个. 但是一些全局自定的工作, 还是应该放在Bootstrap中去完成
2 routerShutdown 路由结束之后触发 此时路由一定正确完成, 否则这个事件不会触发
3 dispatchLoopStartup 分发循环开始之前被触发  
4 preDispatch 分发之前触发 如果在一个请求处理过程中, 发生了forward, 则这个事件会被触发多次
5 postDispatch 分发结束之后触发 此时动作已经执行结束, 视图也已经渲染完成. 和preDispatch类似, 此事件也可能触发多次
6 dispatchLoopShutdown 分发循环结束之后触发 此时表示所有的业务逻辑都已经运行完成, 但是响应还没有发送


下面这个例子完整演示了一次请求中各个Hook被触发的先后顺序:

Hook的触发顺序


<?php
class Bootstrap extends Yaf_Bootstrap_Abstract {
    public function _initPlugin(Yaf_Dispatcher $dispatcher) {
        $dispatcher->registerPlugin(new TestPlugin());
    }
}

class TestPlugin extends Yaf_Plugin_Abstract {
    public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        var_dump("routerStartup");
    }

    public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        var_dump("routerShutdown");
    }

    public function dispatchLoopStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        var_dump("dispatchLoopStartup");
    }

    public function preDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        var_dump("preDispatch");
    }

    public function postDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        var_dump("postDispatch");
    }

    public function dispatchLoopShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
        var_dump("dispatchLoopShutdown");
    }
}

class IndexController extends Yaf_Controller_Abstract {
    public function indexAction() {
        return FALSE; //阻止视图渲染
    }
}

$config = array(
    "application" => array(
        "directory" => dirname(__FILE__) . "/application/",
    ),
);

$app = new Yaf_Application($config);
$app->bootstrap()->run();
?>


以上例程的输出类似于:


string(13) "routerStartup"
string(14) "routerShutdown"
string(19) "dispatchLoopStartup"
string(11) "preDispatch"
string(12) "postDispatch"
string(20) "dispatchLoopShutdown"