YII Framework的filter过滤器用法分析

本文实例讲述了YII Framework的filter过滤器用法。分享给大家供大家参考,具体如下:

首先看官方给出的说明文档,什么是过滤器,过滤器的作用,过滤器的规则,过滤器的定义方法等等。

然后对过滤器进行一个总结。

http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.controller

过滤器是一段代码,可被配置在控制器动作执行之前或之后执行。例如, 访问控制过滤器将被执行以确保在执行请求的动作之前用户已通过身份验证;性能过滤器可用于测量控制器执行所用的时间。

一个动作可以有多个过滤器。过滤器执行顺序为它们出现在过滤器列表中的顺序。过滤器可以阻止动作及后面其他过滤器的执行

过滤器可以定义为一个控制器类的方法。方法名必须以 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',
      array(
        'application.filters.PerformanceFilter - edit, create',
        'unit'=>'second',
      ),
    );
  }
}

上述代码指定了两个过滤器: postOnly 和 PerformanceFilter。 postOnly 过滤器是基于方法的(相应的过滤器方法已在 CController 中定义); 而 performanceFilter 过滤器是基于对象的。路径别名application.filters.PerformanceFilter 指定过滤器类文件是protected/filters/PerformanceFilter。我们使用一个数组配置 PerformanceFilter ,这样它就可被用于初始化过滤器对象的属性值。此处 PerformanceFilter 的 unit 属性值将被初始为 second。

使用加减号,我们可指定哪些动作应该或不应该应用过滤器。上述代码中, postOnly 应只被应用于 edit 和create 动作,而 PerformanceFilter 应被应用于 除了 edit 和 create 之外的动作。 如果过滤器配置中没有使用加减号,则此过滤器将被应用于所有动作。

过滤器功能:

用于对访问者和数据的过滤和对访问操作的记录

使用方法:

一作为controller的一个方法。方法名以filter开头。

public function filterAccessControl($filterChain)
{
echo "--->filterAccessControl";
  $filterChain->run();
}

二定义对立的filter类,要求extends CFilter。

CFilter

<?php
/**
 * CFilter is the base class for all filters.
 *
 * A filter can be applied before and after an action is executed.
 * It can modify the context that the action is to run or decorate the result that the
 * action generates.
 *
 * Override {@link preFilter()} to specify the filtering logic that should be applied
 * before the action, and {@link postFilter()} for filtering logic after the action.
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @version $Id: CFilter.php 2799 2011-01-01 19:31:13Z qiang.xue $
 * @package system.web.filters
 * @since 1.0
 */
class CFilter extends CComponent implements IFilter
{
  /**
   * Performs the filtering.
   * The default implementation is to invoke {@link preFilter}
   * and {@link postFilter} which are meant to be overridden
   * child classes. If a child class needs to override this method,
   * make sure it calls <code>$filterChain->run()</code>
   * if the action should be executed.
   * @param CFilterChain $filterChain the filter chain that the filter is on.
   */
  public function filter($filterChain)
  {
    if($this->preFilter($filterChain))
    {
      $filterChain->run();
      $this->postFilter($filterChain);
    }
  }
  /**
   * Initializes the filter.
   * This method is invoked after the filter properties are initialized
   * and before {@link preFilter} is called.
   * You may override this method to include some initialization logic.
   * @since 1.1.4
   */
  public function init()
  {
  }
  /**
   * Performs the pre-action filtering.
   * @param CFilterChain $filterChain the filter chain that the filter is on.
   * @return boolean whether the filtering process should continue and the action
   * should be executed.
   */
  protected function preFilter($filterChain)
  {
    return true;
  }
  /**
   * Performs the post-action filtering.
   * @param CFilterChain $filterChain the filter chain that the filter is on.
   */
  protected function postFilter($filterChain)
  {
  }
}

下面举例说明两种filter规则的使用:

SiteController.php

<?php
class SiteController extends Controller
{
  public function init()
  {
    //$this->layout='mylayout';
  }
  public function filters()
    {
      return array(
        'AccessControl - create',
        array(
          'application.filters.MyFilter + create',
        ),
      );
  }
  public function filterAccessControl($filterChain)
  {
      echo "--->filterAccessControl";
      $filterChain->run();
  }
  public function actionCreate() {
    echo "--->create action";
  }
  public function actionPrint() {
    echo "--->print action";
  }

/www/yii_dev/testwebap/protected# tree
.
├── commands
│   ├── shell
│   ├── TestCommand.php
│   └── TestCommand.php~
├── components
│   ├── Controller.php
│   └── UserIdentity.php
├── config
│   ├── console.php
│   ├── main.php
│   └── test.php
├── controllers
│   ├── post
│   │   └── UpdateAction.php
│   ├── SiteController.php
│   ├── TestTestController.php
│   └── UserController.php
├── filters
│   └── MyFilter.php
 MyFilter.php

<?php
class MyFilter extends CFilter
{
  protected function preFilter ($filterChain)
  {
    // logic being applied before the action is executed
    echo "-->MyFilter-->pre";
    return true; // false if the action should not be executed
  }
  protected function postFilter ($filterChain)
  {
    echo "-->MyFilter-->post";
  }
}

http://www.localyii.com/testwebap/index.php?r=site/print

--->filterAccessControl--->print action

http://www.localyii.com/testwebap/index.php?r=site/create

-->MyFilter-->pre--->create action-->MyFilter-->post

public function filters()
{
  return array(
    'AccessControl - create',
    array(
      'application.filters.MyFilter + create,print',
    ),
  );
}

http://www.localyii.com/testwebap/index.php?r=site/print
--->filterAccessControl-->MyFilter-->pre--->print action-->MyFilter-->post

以上可以看到filter的具体执行流程。

在filters中有-、+
具体功能是
+表示仅仅作用于这一些action
-后边跟action名称列表。表示排除在外。
如果没有-、+则会应用的所有的action

更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》

希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。

(0)

相关推荐

  • Yii查询生成器(Query Builder)用法实例教程

    本文为yii官网英文文档的翻译版本,主要介绍了Yii查询生成器(Query Builder)的用法.分享给大家供大家参考之用.具体如下: 首先,Yii的查询生成器提供了用面向对象的方式写SQL语句.它允许开发人员使用类的方法和属性来指定一个SQL语句的各个部分.然后,组装成一个有效的SQL语句,可以通过调用DAO数据访问对象的描述方法为进一步执行.以下显示了一个典型的使用查询生成器建立一个select语句: $user = Yii::app()->db->createCommand() -&g

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

    本文实例讲述了Yii控制器中filter过滤器用法.分享给大家供大家参考,具体如下: 指定过滤动作,(如下projectContext()方法在新建,列表,管理页面调用时使用) public function filters() { return array( 'accessControl', // perform access control for CRUD operations 'postOnly + delete', // we only allow deletion via POST

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

    Yii过滤器简介 过滤器是一段代码,可被配置在控制器动作执行之前或之后执行.例如, 访问控制过滤器将被执行以确保在执行请求的动作之前用户已通过身份验证:性能过滤器可用于测量控制器执行所用的时间. 一个动作可以有多个过滤器.过滤器执行顺序为它们出现在过滤器列表中的顺序.过滤器可以阻止动作及后面其他过滤器的执行. 过滤器有两种写法: 基于方法的过滤器 基于自定义过滤器类的过滤器 无论哪种过滤器,都必须在控制器中重写控制器的public function filters()方法,设置哪个过滤器对哪个动

  • Yii控制器中操作视图js的方法

    本文实例讲述了Yii控制器中操作视图js的方法.分享给大家供大家参考,具体如下: //YII framework路径 Yii::getFrameworkPath(); //protected/runtime Yii::app()->getRuntimePath(); //protected/venders目录 Yii::import('application.venders.*'); //或在protected/config/main.php说明 'import'=>array( //....

  • yii2.0之GridView自定义按钮和链接用法

    本文实例讲述了yii2.0之GridView自定义按钮和链接用法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: <?= GridView::widget([         'dataProvider' => $dataProvider,         //'filterModel' => $searchModel,         'columns' => [             ['class' => 'yii\grid\SerialColumn'

  • 从零开始学YII2框架(五)快速生成代码工具 Gii 的使用

    Yii2 框架 之所以称之为高效快速开发的一款框架,是因为有一个神奇的工具Gii 用过Yii1框架的Coder都知道,Gii可以为你快速生成代码,也就是说搭建一个可以增删改查的WebApp可能一行代码都不用写. 当然作为Coder,不写代码怎么能实现我们想要的功能呢. 上次介绍了如何安装Yii框架,本次介绍一下如何使用gii工具快速实现CRUD功能. 框架安装完成后可以通过如下链接访问Gii工具 http://localhost/yii2test/backend/web/index.php?r=

  • Yii使用find findAll查找出指定字段的实现方法

    本文以实例形式展示了Yii使用find findAll查找出指定字段的实现方法,分享给大家供大家参考之用.具体方法如下: 总所周知,采用如下方法: modelName::model() -> find() //找出的是一个对象 modelName::model() -> findALL() //找出的是一个对象集合的数组 可以找出对象与对象集合的数组,那么如何找出我所需要的字段的数据,而不是全部字段的数据呢?之前我是这么做的: $criteria = new CDbCriteria; $cri

  • Yii中render和renderPartial的区别

    以下由我们在信易网络公司开发项目的时候终结出的一些经验 在进行页面输出渲染的时候. 1.render 输出父模板的内容,将渲染的内容,嵌入父模板.| 2.renderPartial 则不输出父模板的内容.只对本次渲染的局部内容,进行输出. 同时还有个重要的区别: render 函数内部默认执行processOutput($output)函数, 会将把组件,比如 CTreeView 里面注册到 CClientScript 里面的 需要的脚本进行渲染输出. 而renderPartial() 默认不自

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

    本文实例讲述了Yii净化器CHtmlPurifier用法.分享给大家供大家参考,具体如下: 1. 在控制器中使用: public function actionCreate() { $model=new News; $purifier = new CHtmlPurifier(); $purifier->options = array( 'URI.AllowedSchemes'=>array( 'http' => true, 'https' => true, ), 'HTML.All

  • 详解PHP的Yii框架中的Controller控制器

    控制器是 MVC 模式中的一部分, 是继承yii\base\Controller类的对象,负责处理请求和生成响应. 具体来说,控制器从应用主体接管控制后会分析请求数据并传送到模型, 传送模型结果到视图,最后生成输出响应信息. 操作 控制器由 操作 组成,它是执行终端用户请求的最基础的单元,一个控制器可有一个或多个操作. 如下示例显示包含两个操作view and create 的控制器post: namespace app\controllers; use Yii; use app\models\

  • Yii框架form表单用法实例

    本文实例讲述了Yii框架form表单用法.分享给大家供大家参考.具体方法如下: 使用表单 在 Yii 中处理表单时,通常需要以下步骤: 1. 创建用于表现所要收集数据字段的模型类. 2. 创建一个控制器动作,响应表单提交. 3. 在视图脚本中创建与控制器动作相关的表单. 一.创建模型 在编写表单所需的 HTML 代码之前,我们应该先确定来自最终用户输入的数据的类型,以及这些数据应符合什么样的规则.模型类可用于记录这些信息.正如模型章节所定义的,模型是保存用户输入和验证这些输入的中心位置. 取决于

随机推荐