`

Yii filter 详解

    博客分类:
  • php
 
阅读更多

filters()方法定义在CController里,用Gii生成Controller时里面就有filters方法,代码如下:

代码收藏代码
  1. publicfunctionfilters()
  2. {
  3. //returnthefilterconfigurationforthiscontroller,e.g.:
  4. returnarray(
  5. 'inlineFilterName',
  6. array(
  7. 'class'=>'path.to.FilterClass',
  8. 'propertyName'=>'propertyValue',
  9. ),
  10. );
  11. }

这个方法没有做什么实质性的动作,它只是把你将要执行的过滤方法方法名或者过滤类的类名返回给CController。 我们先看使用方法的方式,也即上面代码里的’inlineFilterName’含义,这个inlineFilterName意思是在当前控制器的类中有 一个inlineFilterName()方法,该方法里就是你要执行的过滤规则,比如:当前在TestController里:

代码收藏代码
  1. <?php
  2. classTestControllerextendsCController{
  3. //该方法判断用户是否登录
  4. publicfunctionfilterInlineFilterName($filterChain){
  5. if(Yii::app()->user->isGuest)
  6. Yii::app()->user->loginRequired();//封装了登录的url
  7. $filterChain->run();//参数$filterChain就是执行该filter的action实例,调用$filterChain->run()其实就是执行该action了。
  8. }
  9. publicfunctionfilters(){
  10. returnarray('inlineFilterName');
  11. }
  12. }
  13. ?>

Ok,上面的代码就是对当前控制器的所有action都执行了检查用户是否登录了操作,如果用户未登录则跳转到登录页,如果登录则继续执行action里的内容。这是利用在当前控制器下写方法的方式执行过滤,同样,写成类也是可以的,引入方式

代码收藏代码
  1. publicfunctionfilters()
  2. {
  3. //returnthefilterconfigurationforthiscontroller,e.g.:
  4. returnarray(
  5. array(
  6. 'class'=>'path.to.FilterClass',//类名
  7. 'propertyName'=>'propertyValue',//属性名,属性值
  8. ),
  9. );
  10. }

那可能有的哥们要问了,那要是我想让特定的方法检查是否登录了怎么做呢?下面就是我要说的了,同样,还是在TestController里:

代码收藏代码
  1. <?php
  2. classTestControllerextendsCController{
  3. //该方法判断用户是否登录
  4. publicfunctionfilterInlineFilterName($filterChain){//必须以filter开头,后跟名字
  5. if(Yii::app()->user->isGuest&&!in_array($filterChain->action->id,$this->inlineFilterNameAction()))
  6. Yii::app()->user->loginRequired();//封装了登录的url
  7. $filterChain->run();//参数$filterChain就是执行该filter的action实例,调用$filterChain->run()其实就是执行该action了。
  8. }
  9. publicfunctionfilters(){
  10. returnarray('inlineFilterName'),
  11. }
  12. publicfunctioninlineFilterNameAction(){//返回要执行过滤的action
  13. returnarray('action1','action2','action3');
  14. }
  15. }
  16. ?>

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

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

代码收藏代码
  1. publicfunctionfilterAccessControl($filterChain)
  2. {
  3. $filter=newCAccessControlFilter;
  4. $filter->setRules($this->accessRules());
  5. $filter->filter($filterChain);
  6. }

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

代码收藏代码
  1. publicfunctionaccessRules()
  2. {
  3. returnarray(
  4. 'allow',//or'deny'
  5. //可选规则,本规则适用于列出的所有动作ID(不区分大小写)
  6. //如果未指定此项,则规则适用于所有动作。
  7. 'actions'=>array('edit','delete'),
  8. //可选规则,本规则适用于列出的所有控制器ID(不区分大小写)
  9. 'controllers'=>array('post','admin/user'),
  10. //可选规则,本规则适用于列出的所有用户ID(不区分大小写)
  11. //使用*号表示所有用户,?号表示来宾用户,@表示通过身份验证的用户。
  12. 'users'=>array('thomas','kevin'),
  13. //可选规则,本规则适用于列出的所有角色(区分大小写)。
  14. 'roles'=>array('admin','editor'),
  15. //可选规则,本规则适用于列出的所有IP地址。
  16. //如127.0.0.1,127.0.0.*
  17. 'ips'=>array('127.0.0.1'),
  18. //可选规则,本规则适用于列出的所有请求类型(区分大小写)。
  19. 'verbs'=>array('GET','POST'),
  20. //可选规则,一个PHP表达式,其值表示此规则是否适用
  21. 'expression'=>'!$user->isGuest&&$user->level==2',
  22. //可选规则,显示自定义的错误消息
  23. //自1.1.1版后,此选项开始使用。
  24. 'message'=>'AccessDenied.',
  25. );
  26. }
分享到:
评论

相关推荐

    YII srbac_1.3

    **YII srbac_1.3 描述详解** `YII srbac_1.3` 是一个针对Yii框架的权限控制(Role-Based Access Control,RBAC)扩展,它为开发者提供了一套完整的权限管理系统,使应用可以更加灵活、安全地管理用户的访问权限。在...

    YII快速入门教程

    ### YII快速入门教程知识点详解 #### 一、基本概念 **1. 入口文件** - **定义**: 入口文件是启动Yii框架的第一个PHP文件。它负责加载Yii框架的核心文件并设置运行环境。 - **作用**: 初始化环境变量、加载配置...

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

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

    YII框架数据验证规则

    ### YII框架数据验证规则详解 #### 一、引言 在Web开发中,数据验证是确保应用程序安全性和用户体验的关键步骤之一。YII框架作为一款高效、安全且专业的PHP Web开发框架,提供了丰富的数据验证机制。本文将详细...

    详解Yii2.0 rules验证规则集合

    11. `filter`: 应用过滤器规则,例如,`[['username', 'email'], 'filter', 'filter' =&gt; 'trim']`,使用`trim`函数去除属性值的空白字符。 12. `in`: 验证属性值是否在指定范围内。例如,`['level', 'in', 'range' ...

    详解Yii2 rules 的验证规则

    11. `FilterValidator`:用于对输入值进行过滤,例如去除前后空格(trim)。 12. `ImageValidator`:用于验证上传的文件是否为图片以及图片的尺寸、类型等。 13. `RangeValidator`:用于校验输入值是否在指定的值域...

    up_160659_yii-user-management_wb1me.rar

    《Yii用户管理框架详解》 Yii,一个高效且灵活的PHP框架,被广泛应用于Web开发领域,尤其在构建大型企业级应用时表现出色。本文将深入探讨“up_160659_yii-user-management_wb1me.rar”这个压缩包中的知识点,主要...

    Yii CGridView用法实例详解

    例如,你可以通过定义 `buttons` 属性来自定义列的操作按钮,通过 `sortable` 设置列是否可排序,或者使用 `filter` 来添加列过滤条件。此外,还可以利用 `CButtonColumn` 的其他属性如 `deleteButtonOptions` 或 `...

    yii2-platform

    【Yii2 Framework 知识点详解】 Yii2 是一个基于组件、高性能的 PHP 框架,用于开发 Web 2.0 应用程序。它以其高效性、灵活性和丰富的特性集而广受开发者喜爱。"yii2-platform" 项目可能是针对 Yii2 框架的特定平台...

    YII Framework框架教程之安全方案详解

    使用CHtmlPurifier,你可以选择将其作为Widget或Filter,例如在视图中,可以通过以下方式应用: ```php $this-&gt;beginWidget('CHtmlPurifier'); ?&gt; //...这里显示用户输入的内容... $this-&gt;endWidget(); ?&gt; ```...

    yii-1.1.0-validator-cheatsheet.pdf

    ### Yii 1.1.0 验证器速查表详解 #### 一、引言 Yii 是一个高性能的 PHP 框架,用于开发 Web 应用程序。Yii 的一大特点是内置了大量的验证规则,这使得开发者能够方便快捷地对用户输入的数据进行有效性校验。本文将...

    php面试题及答案

    【PHP面试知识点详解】 在PHP面试中,面试官通常会关注应聘者的理论知识、实践经验以及问题解决能力。以下是一些常见的PHP面试题及其涉及的知识点: 1. **开源软件列举**: 开源软件在PHP开发中至关重要,如...

    PHPbianchengqibu

    - 使用`filter_var()`函数验证用户输入。 2. **防止SQL注入**: - 使用预处理语句或参数化查询。 3. **会话管理**: - 使用`session_start()`初始化会话。 4. **密码存储**: - 使用`password_hash()`函数加密...

    PHP语言教程和经典案例

    - **数组函数**:`array_push`添加一个或多个元素到数组末尾,`array_map`对数组中的每个元素应用回调函数,`array_filter`过滤数组中的元素等。 #### 五、字符串操作 - **字符串函数**:`strlen`获取字符串长度,`...

    GaukharIbrayeva-个人资料网站

    可以使用`filter_var`函数过滤和验证数据,防止注入攻击。 5. **会话管理**:PHP的`session_start`开启会话,`$_SESSION`数组存储用户状态信息,便于在多个页面间保持登录状态。 6. **文件操作**:PHP提供了强大的...

    PHP的任务

    【PHP任务详解】 PHP(Hypertext Preprocessor)是一种广泛使用的开源服务器端脚本语言,尤其适合Web开发,能够嵌入到HTML中使用。在PHP的任务中,我们通常会涉及以下几个核心领域: 1. **基础语法**:PHP的语法...

Global site tag (gtag.js) - Google Analytics