YII Framework的filter过滤器用法分析
本文实例讲述了YIIFramework的filter过滤器用法。分享给大家供大家参考,具体如下:
首先看官方给出的说明文档,什么是过滤器,过滤器的作用,过滤器的规则,过滤器的定义方法等等。
然后对过滤器进行一个总结。
http://www.yiiframework.com/doc/guide/1.1/zh_cn/basics.controller
过滤器是一段代码,可被配置在控制器动作执行之前或之后执行。例如,访问控制过滤器将被执行以确保在执行请求的动作之前用户已通过身份验证;性能过滤器可用于测量控制器执行所用的时间。
一个动作可以有多个过滤器。过滤器执行顺序为它们出现在过滤器列表中的顺序。过滤器可以阻止动作及后面其他过滤器的执行
过滤器可以定义为一个控制器类的方法。方法名必须以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类,要求extendsCFilter。
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.php
MyFilter.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--->printaction
http://www.localyii.com/testwebap/index.php?r=site/create
-->MyFilter-->pre--->createaction-->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--->printaction-->MyFilter-->post
以上可以看到filter的具体执行流程。
在filters中有-、+
具体功能是
+表示仅仅作用于这一些action
-后边跟action名称列表。表示排除在外。
如果没有-、+则会应用的所有的action
更多关于Yii相关内容感兴趣的读者可查看本站专题:《Yii框架入门及常用技巧总结》、《php优秀开发框架总结》、《smarty模板入门基础教程》、《php日期与时间用法总结》、《php面向对象程序设计入门教程》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》及《php常见数据库操作技巧汇总》
希望本文所述对大家基于Yii框架的PHP程序设计有所帮助。