怎么在YII Framework中使用filter过滤器
这期内容当中小编将会给大家带来有关怎么在YII Framework中使用filter过滤器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
过滤器可以定义为一个控制器类的方法。方法名必须以 filter 开头。例如,现有的 filterAccessControl 方法定义了一个名为 accessControl 的过滤器。 过滤器方法必须为如下结构:
publicfunctionfilterAccessControl($filterChain) { //调用$filterChain->run()以继续后续过滤器与动作的执行。 }
其中的 $filterChain (过滤器链)是一个 CFilterChain 的实例,代表与所请求动作相关的过滤器列表。在过滤器方法中, 我们可以调用 $filterChain->run() 以继续执行后续过滤器和动作。
过滤器也可以是一个 CFilter 或其子类的实例。如下代码定义了一个新的过滤器类:
classPerformanceFilterextendsCFilter { protectedfunctionpreFilter($filterChain) { //动作被执行之前应用的逻辑 returntrue;//如果动作不应被执行,此处返回false } protectedfunctionpostFilter($filterChain) { //动作执行之后应用的逻辑 } }
要对动作应用过滤器,我们需要覆盖 CController::filters() 方法。此方法应返回一个过滤器配置数组。例如:
classPostControllerextendsCController { ...... publicfunctionfilters() { returnarray( '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开头。
publicfunctionfilterAccessControl($filterChain) { echo"--->filterAccessControl"; $filterChain->run(); }
二定义对立的filter类,要求extends CFilter。
CFilter
<?php /** *CFilteristhebaseclassforallfilters. * *Afiltercanbeappliedbeforeandafteranactionisexecuted. *Itcanmodifythecontextthattheactionistorunordecoratetheresultthatthe *actiongenerates. * *Override{@linkpreFilter()}tospecifythefilteringlogicthatshouldbeapplied *beforetheaction,and{@linkpostFilter()}forfilteringlogicaftertheaction. * *@authorQiangXue<qiang.xue@gmail.com> *@version$Id:CFilter.php27992011-01-0119:31:13Zqiang.xue$ *@packagesystem.web.filters *@since1.0 */ classCFilterextendsCComponentimplementsIFilter { /** *Performsthefiltering. *Thedefaultimplementationistoinvoke{@linkpreFilter} *and{@linkpostFilter}whicharemeanttobeoverridden *childclasses.Ifachildclassneedstooverridethismethod, *makesureitcalls<code>$filterChain->run()</code> *iftheactionshouldbeexecuted. *@paramCFilterChain$filterChainthefilterchainthatthefilterison. */ publicfunctionfilter($filterChain) { if($this->preFilter($filterChain)) { $filterChain->run(); $this->postFilter($filterChain); } } /** *Initializesthefilter. *Thismethodisinvokedafterthefilterpropertiesareinitialized *andbefore{@linkpreFilter}iscalled. *Youmayoverridethismethodtoincludesomeinitializationlogic. *@since1.1.4 */ publicfunctioninit() { } /** *Performsthepre-actionfiltering. *@paramCFilterChain$filterChainthefilterchainthatthefilterison. *@returnbooleanwhetherthefilteringprocessshouldcontinueandtheaction *shouldbeexecuted. */ protectedfunctionpreFilter($filterChain) { returntrue; } /** *Performsthepost-actionfiltering. *@paramCFilterChain$filterChainthefilterchainthatthefilterison. */ protectedfunctionpostFilter($filterChain) { } }
下面举例说明两种filter规则的使用:
SiteController.php
<?php classSiteControllerextendsController { publicfunctioninit() { //$this->layout='mylayout'; } publicfunctionfilters() { returnarray( 'AccessControl-create', array( 'application.filters.MyFilter+create', ), ); } publicfunctionfilterAccessControl($filterChain) { echo"--->filterAccessControl"; $filterChain->run(); } publicfunctionactionCreate(){ echo"--->createaction"; } publicfunctionactionPrint(){ echo"--->printaction"; }
/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.phpMyFilter.php
<?php classMyFilterextendsCFilter { protectedfunctionpreFilter($filterChain) { //logicbeingappliedbeforetheactionisexecuted echo"-->MyFilter-->pre"; returntrue;//falseiftheactionshouldnotbeexecuted } protectedfunctionpostFilter($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
publicfunctionfilters() { returnarray( '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 Framework中使用filter过滤器了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注恰卡编程网行业资讯频道。
推荐阅读
-
PHP优秀框架Laravel和Yii大PK
-
怎么在Yii中使用relations实现数据关联查询
今天就跟大家聊聊有关怎么在Yii中使用relations实现数据关联查询,可能很多人都不太了解,为了让大家更加了解,小编给大家总结...
-
如何在Yii框架中使用响应组件
-
如何在Yii框架中使用函数
-
使用Yii 框架怎么创建一个控制器
这篇文章将为大家详细讲解有关使用Yii框架怎么创建一个控制器,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文...
-
如何在Yii框架中使用redis命令
如何在Yii框架中使用redis命令?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人...
-
Session与Cookie怎么在Yii框架中使用
Session与Cookie怎么在Yii框架中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过...