学习yaf(三)插件

使用插件

Yaf支持用户定义插件来扩展Yaf的功能, 这些插件都是一些类. 它们都必须继承自Yaf_Plugin_Abstract. 插件要发挥功效, 也必须现实的在Yaf中进行注册, 而后在适当的实际, Yaf就会调用它.php

 

Yaf支持的Hook

Yaf定义了6个Hook, 它们分别是:html

Yaf的Hook浏览器

触发顺序 名称 触发时机 说明
1 routerStartup 在路由以前触发 这个是7个事件中, 最先的一个. 可是一些全局自定的工做, 仍是应该放在Bootstrap中去完成
2 routerShutdown 路由结束以后触发 此时路由必定正确完成, 不然这个事件不会触发
3 dispatchLoopStartup 分发循环开始以前被触发  
4 preDispatch 分发以前触发 若是在一个请求处理过程当中, 发生了forward, 则这个事件会被触发屡次
5 postDispatch 分发结束以后触发 此时动做已经执行结束, 视图也已经渲染完成. 和preDispatch相似, 此事件也可能触发屡次
6 dispatchLoopShutdown 分发循环结束以后触发 此时表示全部的业务逻辑都已经运行完成, 可是响应尚未发送

插件类是用户编写的, 可是它须要继承自Yaf_Plugin_Abstract. 对于插件来讲, 上一节提到的7个Hook, 它不须要所有关心, 它只须要在插件类中定义和上面事件同名的方法, 那么这个方法就会在该事件触发的时候被调用.oop

而插件方法, 能够接受俩个参数, Yaf_Request_Abstract实例和Yaf_Response_Abstract实例. 一个插件类例子以下:post

一个简单的插件类spa

     <?php
     class UserPlugin extends Yaf_Plugin_Abstract {

     public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
     }

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

这个例子中, 插件UserPlugin只关心俩个事件. 因此就定义了俩个方法.插件

 注册插件

插件要生效, 还须要向Yaf_Dispatcher注册, 那么通常的插件的注册都会放在Bootstra中进行. 一个注册插件的例子以下:router

注册插件htm

                    
<?php
class Bootstrap extends Yaf_Bootstrap_Abstract{

        public function _initPlugin(Yaf_Dispatcher $dispatcher) {
            $user = new UserPlugin();
            $dispatcher->registerPlugin($user);
        }
}

插件目录

通常的, 插件应该放置在APPLICATION_PATH下的plugins目录, 这样在自动加载的时候, 加载器经过类名, 发现这是个插件类, 就会在这个目录下查找.继承

固然, 插件也能够放在任何你想防止的地方, 只要你能把这个类加载进来就能够

 

一个UserPlugin插件的使用

首先在Plugins目录下 新建User.php文件,由于yaf配置默认识别为UserPlugin.php,你能够在配置中修改是否携带后缀

/**
* 插件类定义
* User.php
*/
class UserPlugin extends Yaf_Plugin_Abstract {
//在路由以前触发,这个是7个事件中, 最先的一个. 可是一些全局自定的工做, 仍是应该放在Bootstrap中去完成
public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
echo "Plugin routerStartup called <br/>\n";
}
//路由结束以后触发,此时路由必定正确完成, 不然这个事件不会触发
public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
echo "Plugin routerShutdown called <br/>\n";
}
//分发循环开始以前被触发
public function dispatchLoopStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
echo "Plugin DispatchLoopStartup called <br/>\n";
}
//分发以前触发 若是在一个请求处理过程当中, 发生了forward, 则这个事件会被触发屡次
public function preDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
echo "Plugin PreDispatch called <br/>\n";
}
//分发结束以后触发,此时动做已经执行结束, 视图也已经渲染完成. 和preDispatch相似, 此事件也可能触发屡次
public function postDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
echo "Plugin postDispatch called <br/>\n";
}
//分发循环结束以后触发,此时表示全部的业务逻辑都已经运行完成, 可是响应尚未发送
public function dispatchLoopShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
echo "Plugin DispatchLoopShutdown called <br/>\n";
}

public function preResponse(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {
echo "Plugin PreResponse called <br/>\n";
}
}

 

在Bootstrap中注册插件


/**
* 插件的注册
*/
public function _initPlugin(Yaf_Dispatcher $dispatcher) {
$user = new UserPlugin();
$dispatcher->registerPlugin($user);
}

 

这时候访问浏览器 输出以下

Plugin routerStartup called Plugin routerShutdown called Plugin DispatchLoopStartup called Plugin PreDispatch called Plugin postDispatch called Plugin DispatchLoopShutdown called Hello World

相关文章
相关标签/搜索