Yii框架之过滤器filter

php相关 / 2012年11月10日 18时39分 / 12725人浏览
过滤器(filter) 过滤器是一段代码,可被配置在控制器动作执行之前或之后执行。 一个动作可以有多个过滤器。如有多个过滤器,则按照它们出现在过滤器列表中的顺序依次执行。过滤器可以阻止动作及后面其他过滤器的执行。 过滤器可以定义为一个控制器类的方法。过滤器方法名必须以 filter 开头。例如,现有的 filterAccessControl 方法定义了一个名为 accessControl 的过滤器。过滤器方法必须为如下结构: public function filterAccessControl($filterChain) { // 调用 $filterChain->run() 以继续后续过滤器与动作的执行。 } $filterChain (过滤器链)是一个 CFilterChain 的实例,代表与所请求动作相关的过滤器列表。在过滤器方法中,我们可以调用 $filterChain->run() 以继续执行后续过滤器和动作。 如 动作 一样,过滤器也可以是一个对象,它是 CFilter 或其子类的实例。如下代码定义了一个新的过滤器类: class PerformanceFilter extends CFilter { protected function preFilter($filterChain) { // 动作被执行之前应用的逻辑 return true; // 如果动作不应被执行,此处返回 false } protected function postFilter($filterChain) { // 动作执行之后应用的逻辑 } } 要对动作应用过滤器,我们需要覆盖 CController::filters() 方法。此方法应返回一个过滤器配置数组。例如: class PostController extends CController { ...... public function filters() { return array( 'postOnly + edit, create', //将postOnly过滤器应用于edit和create动作(这是基于方法的过滤器) array( //使用了数组来配置过滤器 'application.filters.PerformanceFilter - edit, create', //将application.filters.PerformanceFilter过滤器应用于除了edit和create之外的所有动作(这是基于对象的过滤器) 'unit'=>'second', //初始化过滤器对象中的unit属性值为second ), ); } } 上述代码指定了两个过滤器: postOnly 和 PerformanceFilter。 postOnly 过滤器是基于方法的(相应的过滤器方法已在 CController 中定义);而 performanceFilter 过滤器是基于对象的。路径别名 application.filters.PerformanceFilter 指定过滤器类文件是 protected/filters/PerformanceFilter。我们使用一个数组配置 PerformanceFilter ,这样它就可被用于初始化过滤器对象的属性值。此处 PerformanceFilter 的 unit 属性值将被初始为 second。 使用加减号,我们可指定哪些动作应该或不应该应用过滤器。上述代码中, postOnly 应只被应用于 edit 和 create 动作,而 PerformanceFilter 应被应用于 除了 edit 和 create 之外的动作。如果过滤器配置中没有使用加减号,则此过滤器将被应用于所有动作。