当前位置:首页 > CMS教程 > 其它CMS > 列表

YII Framework的filter过滤器用法分析

发布:smiling 来源: PHP粉丝网  添加日期:2021-07-24 16:15:46 浏览: 评论:0 

这篇文章主要介绍了YII Framework的filter过滤器用法,结合实例形式分析了filter过滤器的功能,使用技巧与相关注意事项,需要的朋友可以参考下

本文实例讲述了YII Framework的filter过滤器用法,分享给大家供大家参考,具体如下:

首先看官方给出的说明文档,什么是过滤器,过滤器的作用,过滤器的规则,过滤器的定义方法等等。

然后对过滤器进行一个总结。

http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.controller

过滤器是一段代码,可被配置在控制器动作执行之前或之后执行。例如, 访问控制过滤器将被执行以确保在执行请求的动作之前用户已通过身份验证;性能过滤器可用于测量控制器执行所用的时间。

一个动作可以有多个过滤器。过滤器执行顺序为它们出现在过滤器列表中的顺序。过滤器可以阻止动作及后面其他过滤器的执行

过滤器可以定义为一个控制器类的方法。方法名必须以 filter 开头。例如,现有的 filterAccessControl 方法定义了一个名为 accessControl 的过滤器。 过滤器方法必须为如下结构:

  1. public function filterAccessControl($filterChain
  2.   // 调用 $filterChain->run() 以继续后续过滤器与动作的执行。 

其中的 $filterChain (过滤器链)是一个 CFilterChain 的实例,代表与所请求动作相关的过滤器列表。在过滤器方法中, 我们可以调用 $filterChain->run() 以继续执行后续过滤器和动作。

过滤器也可以是一个 CFilter 或其子类的实例。如下代码定义了一个新的过滤器类:

  1. class PerformanceFilter extends CFilter 
  2.   protected function preFilter($filterChain
  3.   { 
  4.     // 动作被执行之前应用的逻辑 
  5.     return true; // 如果动作不应被执行,此处返回 false 
  6.   } 
  7.   protected function postFilter($filterChain
  8.   { 
  9.     // 动作执行之后应用的逻辑 
  10.   } 

要对动作应用过滤器,我们需要覆盖 CController::filters() 方法,此方法应返回一个过滤器配置数组,例如:

  1. class PostController extends CController 
  2.   ...... 
  3.   public function filters() 
  4.   { 
  5.     return array
  6.       'postOnly + edit, create'
  7.       array
  8.         'application.filters.PerformanceFilter - edit, create'
  9.         'unit'=>'second'
  10.       ), 
  11.     ); 
  12.   } 

上述代码指定了两个过滤器: postOnly 和 PerformanceFilter,postOnly 过滤器是基于方法的(相应的过滤器方法已在 CController 中定义); 而 performanceFilter 过滤器是基于对象的。路径别名application.filters.PerformanceFilter 指定过滤器类文件是protected/filters/PerformanceFilter,我们使用一个数组配置 PerformanceFilter,这样它就可被用于初始化过滤器对象的属性值,此处 PerformanceFilter 的 unit 属性值将被初始为 second。

使用加减号,我们可指定哪些动作应该或不应该应用过滤器。上述代码中, postOnly 应只被应用于 edit 和create 动作,而 PerformanceFilter 应被应用于 除了 edit 和 create 之外的动作。 如果过滤器配置中没有使用加减号,则此过滤器将被应用于所有动作。

过滤器功能:

用于对访问者和数据的过滤和对访问操作的记录

使用方法:

一作为controller的一个方法。方法名以filter开头。

  1. public function filterAccessControl($filterChain
  2. {  
  3. echo "--->filterAccessControl"
  4.   $filterChain->run(); 

二定义对立的filter类,要求extends CFilter。

CFilter

  1. <?php  
  2. /**  
  3.  * CFilter is the base class for all filters.  
  4.  *  
  5.  * A filter can be applied before and after an action is executed.  
  6.  * It can modify the context that the action is to run or decorate the result that the  
  7.  * action generates.  
  8.  *  
  9.  * Override {@link preFilter()} to specify the filtering logic that should be applied  
  10.  * before the action, and {@link postFilter()} for filtering logic after the action.  
  11.  *  
  12.  * @author Qiang Xue <qiang.xue@gmail.com>  
  13.  * @version $Id: CFilter.php 2799 2011-01-01 19:31:13Z qiang.xue $  
  14.  * @package system.web.filters  
  15.  * @since 1.0  
  16.  */ 
  17. class CFilter extends CComponent implements IFilter  
  18. {  
  19.   /**  
  20.    * Performs the filtering.  
  21.    * The default implementation is to invoke {@link preFilter}  
  22.    * and {@link postFilter} which are meant to be overridden  
  23.    * child classes. If a child class needs to override this method,  
  24.    * make sure it calls <code>$filterChain->run()</code>  
  25.    * if the action should be executed.  
  26.    * @param CFilterChain $filterChain the filter chain that the filter is on.  
  27.    */ 
  28.   public function filter($filterChain)  
  29.   {  
  30.     if($this->preFilter($filterChain))  
  31.     {  
  32.       $filterChain->run();  
  33.       $this->postFilter($filterChain);  
  34.     }  
  35.   }  
  36.   /**  
  37.    * Initializes the filter.  
  38.    * This method is invoked after the filter properties are initialized  
  39.    * and before {@link preFilter} is called.  
  40.    * You may override this method to include some initialization logic.  
  41.    * @since 1.1.4  
  42.    */ 
  43.   public function init()  
  44.   {  
  45.   }  
  46.   /**  
  47.    * Performs the pre-action filtering.  
  48.    * @param CFilterChain $filterChain the filter chain that the filter is on.  
  49.    * @return boolean whether the filtering process should continue and the action  
  50.    * should be executed.  
  51.    */ 
  52.   protected function preFilter($filterChain)  
  53.   {  
  54.     return true;  
  55.   }  
  56.   /**  
  57.    * Performs the post-action filtering.  
  58.    * @param CFilterChain $filterChain the filter chain that the filter is on.  
  59.    */ 
  60.   protected function postFilter($filterChain)  
  61.   {  
  62.   }  

下面举例说明两种filter规则的使用:

SiteController.php

  1. <?php  
  2. class SiteController extends Controller  
  3. {  
  4.   public function init()  
  5.   {  
  6.     //$this->layout='mylayout';  
  7.   }  
  8.   public function filters()  
  9.     {  
  10.       return array(  
  11.         'AccessControl - create',  
  12.         array(  
  13.           'application.filters.MyFilter + create',  
  14.         ),  
  15.       );  
  16.   }  
  17.   public function filterAccessControl($filterChain)  
  18.   {      
  19.       echo "--->filterAccessControl";  
  20.       $filterChain->run();  
  21.   }  
  22.   public function actionCreate() {  
  23.     echo "--->create action";  
  24.   }  
  25.   public function actionPrint() {  
  26.     echo "--->print action";  
  27.   }  
  28. /www/yii_dev/testwebap/protected# tree 
  29. ├── commands 
  30. │   ├── shell 
  31. │   ├── TestCommand.php 
  32. │   └── TestCommand.php~ 
  33. ├── components 
  34. │   ├── Controller.php 
  35. │   └── UserIdentity.php 
  36. ├── config 
  37. │   ├── console.php 
  38. │   ├── main.php 
  39. │   └── test.php 
  40. ├── controllers 
  41. │   ├── post 
  42. │   │   └── UpdateAction.php 
  43. │   ├── SiteController.php 
  44. │   ├── TestTestController.php 
  45. │   └── UserController.php 
  46. ├── filters 
  47. │   └── MyFilter.php 

MyFilter.php

  1. <?php  
  2. class MyFilter extends CFilter  
  3. {  
  4.   protected function preFilter ($filterChain)  
  5.   {  
  6.     // logic being applied before the action is executed      
  7.     echo "-->MyFilter-->pre";  
  8.     return true; // false if the action should not be executed  
  9.   }  
  10.   protected function postFilter ($filterChain)  
  11.   {  
  12.     echo "-->MyFilter-->post";  
  13.   }  
  14. }  
  15. http://www.localyii.com/testwebap/index.php?r=site/print 
  16.  
  17. --->filterAccessControl--->print action 
  18.  
  19. http://www.localyii.com/testwebap/index.php?r=site/create 

-->MyFilter-->pre--->create action-->MyFilter-->post

  1. public function filters() 
  2.   return array
  3.     'AccessControl - create'
  4.     array
  5.       'application.filters.MyFilter + create,print'
  6.     ), 
  7.   ); 

http://www.localyii.com/testwebap/index.php?r=site/print

--->filterAccessControl-->MyFilter-->pre--->print action-->MyFilter-->post

以上可以看到filter的具体执行流程。

在filters中有-、+

具体功能是

+表示仅仅作用于这一些action

-后边跟action名称列表,表示排除在外。

如果没有-、+则会应用的所有的action

Tags: Framework filter

分享到: