学习yaf插件

Posted 种花家的大老师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习yaf插件相关的知识,希望对你有一定的参考价值。

使用插件

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

 

Yaf支持的Hook

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

Yaf的Hook

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

插件类是用户编写的, 但是它需要继承自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

 

 

 

 

 

 

 

 

 

 

以上是关于学习yaf插件的主要内容,如果未能解决你的问题,请参考以下文章

基于yaf框架和uploadify插件,做的一个导入excel文件,查看并保存数据的功能

Lnmp上安装Yaf学习

学习yaf路由

yaf代码生成工具的使用

macOS 安装配置yaf框架 生成yaf项目

CentOS 7 LNMP部署—php 常用插件