PHP Yii框架过滤器用法详解

Yii过滤器简介

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

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

过滤器有两种写法:

  • 基于方法的过滤器
  • 基于自定义过滤器类的过滤器
无论哪种过滤器,都必须在控制器中重写控制器的public function filters()方法,设置哪个过滤器对哪个动作起作用。

基于方法的过滤器

编写基于方法的过滤器,要经过三步:

  1. 在控制器中编写动作(Action);
  2. 在控制器中编写过滤器函数,函数名必须以filter为前缀,如:function filterAccessControl();
  3. 重写父类CController的filters()方法,定义过滤器与动作的关系;

实例:

";
				$filterChain->run();
			}
			/** 
			* 第三步:重写父类CController的filters()方法,定义过滤器与动作的关系 
			* @see CController::filters() 
			*/
			public function filters(){
				return array(
			//定义过滤器与动作的关联关系
					'addFilter + add',
// 					array(
// 							'application.filters.TestFilter',					
// 					),
					
			);
		}
	}



自定义过滤器类

自定义过滤器类,需要单独写一个过滤器类,并继承CFilter类,重写CFilter类下的部分方法。大家可以看一下CFilter类的代码,该类代码不多,还是很容易看懂的。

自定义过滤器实例:

TestFilter.preFilter.
"; return true; } /** * Performs the post-action filtering. * @param CFilterChain $filterChain the filter chain that the filter is on. */ protected function postFilter($filterChain) { echo "--->TestFilter.postFilter.
"; } }

在控制器中注册该自定义过滤器与动作的绑定关系:

/**

		 * 第三步:重写父类CController的filters()方法,定义过滤器与动作的关系
		 * @see CController::filters()
		 */
		public function filters(){
			return array(
				//定义过滤器与动作的关联关系
					'addFilter + add',
 					array(
 							'application.filters.TestFilter',					
 					),
					
			);
		}


我自定义了一个过滤器:TestFilter,继承了CFilter类,重写了CFilter类的两个主要方法:preFilter(前控制器,在动作执行前运行)和postFilter(后控制器,在动作执行后运行)。

两种控制器的执行顺序

假设我将上面编写的自定义过滤器类与动作actionAdd绑定,那么,自定义过滤器继承自父类CFilter两个方法:preFilter和postFilter,与绑定的actionAdd之间的执行顺序是怎样的呢?

经过试验,执行顺序为:CFilter::preFilter--------->UserController::actionAdd--------->CFilter::postFilter。

也就是说,在动作执行前后都可以执行过滤操作。

那么文章开头说“过滤器可以阻止动作及后面其他过滤器的执行”是怎么做到的呢?

看了CFilter::preFilter的官方注释就知道了:

@return boolean whether the filtering process should continue and the action should be executed。


CFilter::preFilter函数默认return true;即,默认执行后面的动作和后过滤器。如果在自定义过滤器类中,重写CFilter::preFilter方法,并return false;就可以阻止后面的动作和过滤器执行了!

自定义过滤器类的执行过程我们搞清楚了,那么过滤器函数呢?过滤器函数没有前和后之分,只有一个,那么它肯定是执行的,经过试验,过滤器函数相当于自定义过滤器类中的前过滤器,即过滤器函数在绑定的动作之前执行。

最后一个问题,如果有个过滤器函数和自定义过滤器类都绑定同一个动作,那么过滤器的执行顺序是什么样子的呢?经过试验,结果如下:

  • 过滤器函数和自定义过滤器类都会执行;
  • 过滤器函数先于自定义过滤器类的CFilter::preFilter之前执行;
  • 执行顺序为:UserController::filterAddFilter()--------->CFilter::preFilter--------->UserController::actionAdd--------->CFilter::postFilter。




你可能感兴趣的:(PHP)