Yii中的过滤器是指,通过配置,在一个控制器的动作被执行之前或者之后执行的一小段代码 。一个例子是,如果我们想要在某个动作执行后额外记录些什么,或者执行一些审核逻辑,可以编写一个简单的审计过滤器来进行这个动作之后的处理任务。
beforeValidate 和
beforeSave 和 afterSave : 这两个将在保存 AR 实例之前和之后被调用。
beforeDelete 和 afterDelete : 这两个将在一个 AR 实例被删除之前和之后被调用。
afterConstruct : 这个将在每个使用 new 操作符创建 AR 实例后被调用 。
beforeFind : 这个将在一个 AR 查找器被用于执行查询(例如 find() , findAll() )之前被调用。
afterFind : 这个将在每个 AR 实例作为一个查询结果创建时被调用。
CWebUser
afterLogin() 用户成功登录后被调用的方法。 CWebUser
afterLogout() 用户登出后被调用的方法。 CWebUser
beforeLogin() 在用户登录那一时刻前被调用的方法。 CWebUser
beforeLogout() 当用户调用logout注销时,将调用该方法。
model中
protected function beforeSave() {
if($this->isNewRecord){
$this->reg_date = $this->modify_date = time();
$this->passwd = $this->hasPassword($this->passwd1);
$this->credit = 0;
}else
$this->modify_date = time();
if($this->getScenario() == 'changePassword' || $this->getScenario() == 'resetPassword'){
$this->passwd = $this->hasPassword($this->passwd1);
}
return parent::beforeSave();
}
protected function beforeFind() {
parent::beforeFind();
$this->getDbCriteria()->addColumnCondition(array('type'=>self::TYPE_WIKI));
return true;
}
protected function afterSave(){
parent::afterSave();
if(!$this->isNewRecord){
$this->dbConnection->createCommand('DELETE FROM PostTag WHERE postId='.$this->id)->execute();
}
return true;
}
一个普遍的例子就是,当我们要求执行某个特定的控制器动作之前,用户必须已经登录,那么可以写一个简单的访问过滤器在这个动作执行之前来检查这个要求。
beforeAction
afterAction
controller中
public function beforeAction($action){
if(Yii::app()->user->isGuest&&$action->getId()!='login'){
$this->redirect(Yii::app()->loginUrl);
}
return parent::beforeAction($action);
}