原文地址:http://blog.sina.com.cn/s/blog_815611fb0101fahq.html
过滤器执行顺序为它们出现在过滤器列表中的顺序。
在yii protected/filters/下载新建 AuthFilter.php文件
<?php
class AuthFilter extends CFilter
{
protected function preFilter($filterChain)
{
// 动作被执行之前应用的逻辑
$user = Yii::app()->getUser();
$controller=Yii::app()->controller->id; //获取当前控制器名
$action=Yii::app()->controller->action->id;; //获取当前动作名
if($user->isGuest)
{
if($controller!='site')
{
//如果控制器不是 site 就跳转到登录界面
Yii::app()->controller->redirect(array('/site/login'));
}
else
{
//如果控制器是 site 就继续执行
return true;
}
}
else{
//如果已登录就继续执行
return true;
}
//return true; // 如果动作不应被执行,此处返回 false
}
protected function postFilter($filterChain)
{
// 动作执行之后应用的逻辑
}
}
?>
这个过滤器代码文件的放置位置由下面代码指定
class PostController extends CController
{
......
public function filters()
{
return array(
array(
'application.filters.AuthFilter', // 指定自定义过滤器类的位置为:protected/filters/PerformanceFilter
'unit'=>'second'//初始化 PerformanceFilter 的 unit 属性值将被初始为 second)
);
}
}
也可以放在控制器的父类Controler.php中(路径是 protected/components/Controler.php)
这样就不用每个控制器都要写了,但是如果集成Controler的控制器重写了filters()方法,必须在方法中也要声明 'application.filters.AuthFilter',
<?php
/**
* Controller is the customized base controller class.
* All controller classes for this application should extend from this base class.
*/
class Controller extends CController
{
/**
* @var string the default layout for the controller view. Defaults to '//layouts/column1',
* meaning using a single column layout. See 'protected/views/layouts/column1.php'.
*/
public $layout='//layouts/column1';
/**
* @var array context menu items. This property will be assigned to {@link CMenu::items}.
*/
public $menu=array();
/**
* @var array the breadcrumbs of the current page. The value of this property will
* be assigned to {@link CBreadcrumbs::links}. Please refer to {@link CBreadcrumbs::links}
* for more details on how to specify this property.
*/
public $breadcrumbs=array();
public function filters()
{
return array(
//'accessControl',
array(
'application.filters.AuthFilter',
)
);
}
}