怎么在YII Framework中使用filter过滤器

这期内容当中小编将会给大家带来有关怎么在YII Framework中使用filter过滤器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

过滤器可以定义为一个控制器类的方法。方法名必须以 filter 开头。例如,现有的 filterAccessControl 方法定义了一个名为 accessControl 的过滤器。 过滤器方法必须为如下结构:

怎么在YII Framework中使用filter过滤器

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过滤器了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注恰卡编程网行业资讯频道。

发布于 2021-04-03 22:30:58
收藏
分享
海报
0 条评论
169
上一篇:如何在Python3.5中使用多进程 下一篇:如何在PHP中使用nl2br()函数
目录

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码