学习yaf(三)插件

it2022-05-09  36

使用插件

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

 

Yaf支持的Hook

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

Yaf的Hook

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

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

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

一个简单的插件类

<?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中进行. 一个注册插件的例子如下:

注册插件

<?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

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/qiuhao/p/6993152.html

相关资源:数据结构—成绩单生成器

最新回复(0)