• 技术文章 >后端开发 >php教程

    YII Framework的filter过滤器用法分析_php实例

    2016-06-07 17:08:06原创376
    本文实例讲述了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  
     * @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 $filterChain->run() 
       * 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程序设计有所帮助。

    php入门到就业线上直播课:查看学习

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。

    前端(VUE)零基础到就业课程:点击学习

    清晰的学习路线+老师随时辅导答疑

    自己动手写 PHP MVC 框架:点击学习

    快速了解MVC架构、了解框架底层运行原理

    专题推荐:YII Framework filter 过滤器
    上一篇:PHP如何使用Memcached_php实例 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • ❤️‍🔥共22门课程,总价3725元,会员免费学• ❤️‍🔥接口自动化测试不想写代码?• 你知道如何用PHP实现多进程吗• PHP与MySQL连接的方法总结• 求解:phpcms模板怎样转码?该怎么解决• php 之 cookie 跟 session 简单解读(笔记)• php怎的快捷知道某个函数在哪个文件用过
    1/1

    PHP中文网