Yii过滤器简介
过滤器是一段代码,可被配置在控制器动作执行之前或之后执行。例如, 访问控制过滤器将被执行以确保在执行请求的动作之前用户已通过身份验证;性能过滤器可用于测量控制器执行所用的时间。
一个动作可以有多个过滤器。过滤器执行顺序为它们出现在过滤器列表中的顺序。过滤器可以阻止动作及后面其他过滤器的执行。
过滤器有两种写法:
基于方法的过滤器 基于自定义过滤器类的过滤器无论哪种过滤器,都必须在控制器中重写控制器的public function filters()方法,设置哪个过滤器对哪个动作起作用。
基于方法的过滤器
编写基于方法的过滤器,要经过三步:
在控制器中编写动作(Action);
在控制器中编写过滤器函数,函数名必须以filter为前缀,如:function filterAccessControl();
重写父类CController的filters()方法,定义过滤器与动作的关系;
实例:
<?php class UserController extends CController{ ** * 第一步:创建动作 */ function actionAdd(){ echo "actionAdd"; } /** * 第二步:创建基于方法的过滤器 */ public function filterAddFilter($filterChain) { echo "基于方法的过滤器UserController.filterAdd<br>"; $filterChain->run(); } /** * 第三步:重写父类CController的filters()方法,定义过滤器与动作的关系 * @see CController::filters() */ public function filters(){ return array( //定义过滤器与动作的关联关系 'addFilter + add', // array( // 'application.filters.TestFilter', // ), ); } }
自定义过滤器类
自定义过滤器类,需要单独写一个过滤器类,并继承CFilter类,重写CFilter类下的部分方法。大家可以看一下CFilter类的代码,该类代码不多,还是很容易看懂的。
自定义过滤器实例:
<?php class TestFilter extends CFilter{ /** * Performs the pre-action filtering. * @param CFilterChain $filterChain the filter chain that the filter is on. * @return boolean whether the filtering process should continue and the action * should be executed. */ protected function preFilter($filterChain) { echo "--->TestFilter.preFilter.<br>"; 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.<br>"; } }
在控制器中注册该自定义过滤器与动作的绑定关系:
/*** 第三步:重写父类CController的filters()方法,定义过滤器与动作的关系 * @see CController::filters() */ ublic function filters(){ return array( //定义过滤器与动作的关联关系 'addFilter + add', array( 'application.filters.TestFilter', ), );
新闻热点
疑难解答