`
hudeyong926
  • 浏览: 2033260 次
  • 来自: 武汉
社区版块
存档分类
最新评论

YII 过滤器 filters

 
阅读更多

Yii中的过滤器是指,通过配置,在一个控制器的动作被执行之前或者之后执行的一小段代码 。一个例子是,如果我们想要在某个动作执行后额外记录些什么,或者执行一些审核逻辑,可以编写一个简单的审计过滤器来进行这个动作之后的处理任务。

  • beforeValidate 和afterValidate
  • 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 afterFind() {
    if ($this->getScenario() == 'findYuan') {
        $this->proxy_charges = $this->proxy_charges / 100;
    }
    return parent::afterFind();
}

protected function beforeSave() {
    if ($this->isNewRecord) {
        $this->reg_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);
}

Filter过滤器主要是控制访问

YII自定义登录过滤器

<?php

class SessionCheckFilter extends CFilter
{
    protected function preFilter($filterChain)
    {
        if (Yii::app()->user->id > 0) {
            $filterChain->run();
        } else {
            Yii::app()->getController()->redirect(array('user/login'));
        }
        return true;
    }
}

 然后在你的Controller中通过filters方法使用,所有XXController继承Controller即可

<?php

class Controller extends CController
{

    public function filters()
    {
        return array(
            array('application.filters.SessionCheckFilter - login, register')
        );
    }
}

 

<?php

class TestController extends CController
{
    //该方法判断用户是否登录 
    public function filterInlineFilterName($filterChain)
    {
        if (Yii::app()->user->isGuest && !in_array($filterChain->action->id, $this->inlineFilterNameAction())) {
            Yii::app()->user->loginRequired(); //封装了登录的url
        }

        $filterChain->run(); //参数$filterChain就是执行该filter的action实例,调用$filterChain->run()其实就是执行该action了。
    }

    public function filters()
    {
        return array('inlineFilterName');
    }

    public function inlineFilterNameAction()
    { //返回要执行过滤的action
        return array('action1', 'action2', 'action3');
    }
}

这样就可以做到对指定的action添加自定义的过滤规则了。

其实,Yii里已经封装好了一个过滤类,这里带大家看看它是怎样实现的,其实原理和上面一模一样。我们先来看看CController里的public void filterAccessControl(CFilterChain $filterChain) 方法:

public function filterAccessControl($filterChain)
{
    $filter=new CAccessControlFilter;
    $filter->setRules($this->accessRules());
    $filter->filter($filterChain);
}

可以看到,它是以filter开头的函数,大家知道它是干嘛的了吧?该方法实例化了一个CAccessControlFilter 类,该类就是处理过滤规则的,然后把$this->accessRules()作为一个参数付给 $filter->setRules()方法。 下面来看看accessRules()方法的写法:

public function accessRules()
{
    return array(
        'allow', // or 'deny'
        //可选规则,本规则适用于列出的所有动作ID(不区分大小写)
        //如果未指定此项,则规则适用于所有动作。
        'actions' => array('edit', 'delete'),
        //可选规则,本规则适用于列出的所有控制器ID(不区分大小写)
        'controllers' => array('post', 'admin/user'),
        //可选规则,本规则适用于列出的所有用户ID(不区分大小写)
        //使用*号表示所有用户,?号表示来宾用户,@表示通过身份验证的用户。
        'users' => array('thomas', 'kevin'),
        //可选规则,本规则适用于列出的所有角色(区分大小写)。
        'roles' => array('admin', 'editor'),
        //可选规则,本规则适用于列出的所有IP地址。
        //如127.0.0.1, 127.0.0.*
        'ips' => array('127.0.0.1'),
        //可选规则,本规则适用于列出的所有请求类型(区分大小写)。
        'verbs' => array('GET', 'POST'),
        //可选规则,一个PHP表达式,其值表示此规则是否适用
        'expression' => '!$user->isGuest && $user->level==2',
        //可选规则,显示自定义的错误消息
        //自1.1.1版后,此选项开始使用。
        'message' => 'Access Denied.',
    );
}

好了,这下对Yii的过滤规则大家了解了吧?试着写写吧

 

 

分享到:
评论

相关推荐

    PHP的Yii框架中过滤器相关的使用总结

    在Yii框架中,过滤器是其中的一个重要组成部分,它允许开发者对特定的控制器动作进行预处理和后处理操作。 在Yii中,过滤器主要用于以下几种场景: 1. 访问控制:确保用户在执行动作之前已经通过身份验证。 2. 性能...

    YII Framework的filter过滤器用法分析

    YII框架中的filter过滤器是该框架提供的一个强大功能,它允许开发者在控制器动作执行之前或之后执行一段自定义的代码,用以完成如访问控制、性能监控、数据验证等任务。过滤器的实现方式可以是通过控制器类中的特定...

    yii2-filters:Yii Framework 2.0有用过滤器的集合

    AjaxFilter 如果应用的操作接收到非AJAX请求,则此筛选器将引发异常(BadRequestHttpException)。 用法 要使用AjaxFilter,请在... 此过滤器禁用csrf验证。 通常用于反馈操作(例如,在收到付款服务的响应时)。 用法

    Yii控制器中filter过滤器用法分析

    本文中的"filters"方法定义了三个过滤规则:"accessControl"用于执行CRUD操作的访问控制,"postOnly+delete"表示只允许通过POST请求进行删除操作,"projectContext+createindexadmin"表示在创建、列表、管理页面时...

    Yii净化器CHtmlPurifier用法示例(过滤不良代码)

    过滤器(Filters)是Yii中非常实用的功能,可以对特定的控制器动作执行前进行操作。比如,我们可以在过滤器中对特定的字段进行净化处理。 ```php public function filters() { return array( 'accessControl', //...

    yii blog全中文注释0.85版

    你还可以看到如何使用行为(Behaviors)、过滤器(Filters)来实现这些功能。 至于中文注释,这将帮助中文开发者更好地理解代码逻辑,尤其对Yii框架不熟悉的人来说,这将极大地提高学习效率。注释通常会解释关键...

    Yii 2.0.9 advanced zip

    还有其强大的行为(Behaviors)和过滤器(Filters)功能,允许开发者以面向对象的方式实现跨控制器的功能。 在部署方面,Yii 2.0.9 支持多种服务器环境,包括Apache和Nginx,并且可以通过配置文件轻松调整。对于...

    yii2.0中文手册

    - 授权则可以通过访问控制过滤器(Access Control Filter, ACF)和角色基础访问控制(Role-Based Access Control, RBAC)来实现。 7. **缓存管理**: - Yii 2.0 支持多种缓存策略,如文件、数据库、APC等,可以...

    Yii2.0框架behaviors方法使用实例分析

    本文实例讲述了Yii2.0框架behaviors方法使用。...过滤器就是对不同用户角色的控制;  如(游客-&gt;最普通的平民,用户-&gt;已经注册的用户,管理员-&gt;拥有一切权限)  然而 Yii2自带的权限控制默认只支持两个角色: g

    yii2框架restful url接口 认证内容的开发的分享

    此外,Yii2还提供了`\yii\filters\RateLimiter`过滤器,用于限制用户对API的访问频率,防止恶意攻击或滥用。我们还可以利用`\yii\filters\PageCache`和`\yii\filters\ContentNegotiator`来实现响应缓存和内容协商,...

    详解PHP的Yii框架的运行机制及其路由功能

    控制器会创建一个 action(动作) 实例并为该动作执行相关的 Filters(访问过滤器)。 如果任何一个过滤器验证失败,该动作会被取消。 如果全部的过滤器都通过,该动作就会被执行。 动作会加载一个数据模型,...

    在yii中新增一个用户验证的方法详解

    在Yii中,这可以通过访问控制过滤器(Access Control Filter, ACF)实现。 例如,下面是一个简单的带有访问控制的Controller: ```php class AdminDefaultController extends CController { public function ...

    简介PHP的Yii框架中缓存的一些高级用法

    页面缓存由 yii\filters\PageCache 类提供支持,该类是一个过滤器。它可以像这样在控制器类中使用: public function behaviors() { return [ [ 'class' =&gt; 'yii\filters\PageCache', 'only' =&gt; ['index'], '...

    yii权限控制的方法(三种方法)

    Yii框架为开发者提供了多种权限控制机制,其中三种常见的方法为通过内置的accessControl过滤器、使用第三方插件和混合模式控制权限。下面详细介绍这三种方法的实现技巧和实例分析。 首先,介绍通过内置的access...

    YII框架行为behaviors用法示例

    比如,YII框架预定义了 yii\filters\AccessControl 行为,用于控制对控制器动作的访问权限。 从提供的示例文件中,我们可以了解到YII框架行为的具体使用方法: 首先,在文件 frontend/libs/FilterTest.php 中定义...

Global site tag (gtag.js) - Google Analytics