yaf零基础学习总结7-学习使用Yaf中的插件

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

也许你们会问这个插件是个什么概念,有什么用呢,其实咱们用插件主要是用到Yaf框架中支持的Hook(钩子),Yaf中定义了6个Hook,他们分别是: 

Yaf中支持的6个Hook 

一、routerStartup 这个会在路由以前出发,也就是路由以前会调用这个Hook ,这个是7个事件中, 最先的一个. 可是一些全局自定的工做, 仍是应该放在Bootstrap中去完成 

二、routerShutdown 这个在路由结束以后触发,须要注意的是,只有路由正确完成以后才会触发这个Hook 

三、dispatchLoopStartup 分发循环开始以前被触发 

四、preDispatch 分发以前触发,若是在一个请求处理过程当中, 发生了forward, 则这个事件会被触发屡次 

五、postDispatch 分发结束以后触发,此时动做已经执行结束, 视图也已经渲染完成. 和preDispatch相似, 此事件也可能触发屡次 

六、dispatchLoopShutdown 分发循环结束以后触发 此时表示全部的业务逻辑都已经运行完成, 可是响应尚未发送 

定义插件 

以上只是对插件作了一个基本的介绍,若是此前没有接触过相似设计的可能一会儿稀里糊涂的,其实也不要紧,当前最重要的就是记住,有这么个印象,在后续咱们使用的过程中慢慢的就能接受了。 

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

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

[php]  view plain copy
 
  1. <?php  
  2.      class UserPlugin extends Yaf_Plugin_Abstract {  
  3.   
  4.      public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {  
  5.      }  
  6.   
  7.      public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {  
  8.      }  
  9.      }  



注册插件 

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

[php]  view plain copy
 
  1. <?php  
  2. class Bootstrap extends Yaf_Bootstrap_Abstract{  
  3.   
  4.         public function _initPlugin(Yaf_Dispatcher $dispatcher) {  
  5.             $user = new UserPlugin();  
  6.             $dispatcher->registerPlugin($user);  
  7.         }  
  8. }  



插件目录 

通常的, 插件应该放置在APPLICATION_PATH下的plugins目录, 这样在自动加载的时候, 加载器经过类名, 发现这是个插件类, 就会在这个目录下查找.固然, 插件也能够放在任何你想防止的地方, 只要你能把这个类加载进来就能够 

这就是插件的使用过程,对于上面咱们作一个总结,用代码来讲话。 

首先咱们定义好本身的插件类: app

[php]  view plain copy
 
  1. /**  
  2. * 插件类定义 
  3. * UserPlugin.php 
  4. */   
  5. class UserPlugin extends Yaf_Plugin_Abstract {   
  6.     //在路由以前触发,这个是7个事件中, 最先的一个. 可是一些全局自定的工做, 仍是应该放在Bootstrap中去完成   
  7.     public function routerStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {   
  8.         echo "Plugin routerStartup called <br/>\n";   
  9.     }   
  10. //路由结束以后触发,此时路由必定正确完成, 不然这个事件不会触发   
  11.     public function routerShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {   
  12.         echo "Plugin routerShutdown called <br/>\n";   
  13.     }   
  14. //分发循环开始以前被触发   
  15.     public function dispatchLoopStartup(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {   
  16.         echo "Plugin DispatchLoopStartup called <br/>\n";   
  17.     }   
  18. //分发以前触发    若是在一个请求处理过程当中, 发生了forward, 则这个事件会被触发屡次   
  19.     public function preDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {   
  20.         echo "Plugin PreDispatch called <br/>\n";   
  21.     }   
  22. //分发结束以后触发,此时动做已经执行结束, 视图也已经渲染完成. 和preDispatch相似, 此事件也可能触发屡次   
  23.     public function postDispatch(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {   
  24.         echo "Plugin postDispatch called <br/>\n";   
  25.     }   
  26.   //分发循环结束以后触发,此时表示全部的业务逻辑都已经运行完成, 可是响应尚未发送   
  27.     public function dispatchLoopShutdown(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {   
  28.         echo "Plugin DispatchLoopShutdown called <br/>\n";   
  29.     }   
  30.      
  31.     public function preResponse(Yaf_Request_Abstract $request, Yaf_Response_Abstract $response) {   
  32.         echo "Plugin PreResponse called <br/>\n";   
  33.     }   
  34. }  



而后注册咱们的插件,在上一节中咱们讲到过Bootstrap的使用,这回咱们要用上它了,就是在Bootstrap注册插件 

框架


 
  1. class Bootstrap extends Yaf_Bootstrap_Abstract{   
  2.   /** 
  3.    * 注册一个插件 
  4.    * 插件的目录是在application_directory/plugins 
  5.    */   
  6.   public function _initPlugin(Yaf_Dispatcher $dispatcher) {   
  7.     $user = new UserPlugin();   
  8.     $dispatcher->registerPlugin($user);   
  9.   }   
  10. }  



就这样,插件就会在咱们的项目运行过程当中自动调用相关的Hook,咱们能够在这些Hook中部署本身的业务逻辑,好比用户是否须要登陆,权限判断等。oop

相关文章
相关标签/搜索