Yii1.1用filters()方法+filterXxx()回调,需手动调用$filterChain->run();Yii2用behaviors()+ActionFilter类,支持beforeAction/afterAction钩子,返回true/false控制流程;截至2026年7月无官方Yii3,所谓Yii3多为误传或实验项目。

Yii 不同版本的控制器过滤器机制差异较大,不能混用写法。核心区别在于:Yii1.1 用 filters() 方法 + filterXxx() 回调;Yii2 用 behaviors() + ActionFilter 类;Yii3(即 Laravel 风格的 Yii 全新架构)尚未正式发布,当前无稳定版 Yii3——官方截至 2026 年仍维持 Yii2 主线,所谓“Yii3”多为误传或社区实验项目。
下面分版本说明正确用法:
Yii1.1 中过滤器的正确写法
过滤器定义在控制器中,通过 filters() 返回配置数组,对应方法必须以 filter 开头,且需手动调用 $filterChain->run() 继续执行。
class PostController extends Controller
{
public function filters()
{
return array(
'accessControl', // 内置访问控制
'postOnly + create, update', // 仅对 create/update 动作启用 postOnly 过滤
'myCustomFilter - delete', // myCustomFilter 对除 delete 外所有动作生效
);
}
public function filterMyCustomFilter($filterChain)
{
// 执行前逻辑,比如日志、权限预检
if (!Yii::app()->user->isGuest) {
$filterChain->run(); // 放行
} else {
throw new CHttpException(403, '请先登录');
}
}
public function actionDelete()
{
echo '删除操作';
}
}⚠️ 注意:filterMyCustomFilter 必须是 public 方法,参数固定为 $filterChain,且必须显式调用 run(),否则后续动作不执行。
Yii2 中过滤器的正确写法
完全转向行为(behaviors()),过滤器是独立类(继承 yii\base\ActionFilter),支持 beforeAction/afterAction 钩子,返回 true/false 控制流程。
// common/filters/LogTimeFilter.php
namespace common\filters;
use yii\base\ActionFilter;
class LogTimeFilter extends ActionFilter
{
public function beforeAction($action)
{
\Yii::info("开始执行 {$action->id}", 'timing');
return parent::beforeAction($action); // 必须返回父类结果
}
public function afterAction($action, $result)
{
\Yii::info("完成执行 {$action->id}", 'timing');
parent::afterAction($action, $result);
}
}控制器中启用:
class PostController extends Controller
{
public function behaviors()
{
return [
'logTime' => [
'class' => 'common\filters\LogTimeFilter',
'only' => ['index', 'view'], // 可选:只对指定动作生效
],
'access' => [
'class' => \yii\filters\AccessControl::className(),
'rules' => [
[
'allow' => true,
'actions' => ['index'],
'roles' => ['?'], // 游客可访问
],
[
'allow' => true,
'actions' => ['update', 'delete'],
'roles' => ['@'], // 登录用户
],
],
],
];
}
}✅ 关键点:
-
beforeAction返回false会中断执行,返回true或parent::beforeAction()才继续; -
only/except控制作用范围,比 Yii1.1 的+/-更清晰; - ACF(AccessControl)等内置过滤器直接作为行为配置,无需额外方法。
关于“Yii3”的说明
截至 2026 年 7 月,没有官方发布的 Yii3 框架。Yii 官方路线图明确:Yii2 是长期支持(LTS)主线,Yii 2.0.x 系列持续维护(最新为 2.0.49),而所谓“Yii3”实为部分开发者对基于 Symfony 或 Laravel 架构重构的非官方设想,或混淆了 Yii-Framework Next(已归档)等实验性仓库。
目前生产环境应统一使用 Yii2,并关注其 2.1 版本规划(向后兼容演进,非重写)。
如你看到“Yii3 过滤器写法”,大概率是文档过时、命名错误,或是将其他框架(如 Laravel Middleware)误标为 Yii3。
不复杂但容易忽略:版本混淆会导致语法报错、行为失效或安全漏洞,务必确认 composer.json 中 yiisoft/yii2 的实际版本号。


















