最稳方式是控制器内用 $this->id 和 $this->action->id;视图中用 $this->context->id 和 $this->context->action->id;行为中需先判断 $this->owner instanceof \yii\web\controller 再获取。

Yii 2.0 怎么在控制器里拿到当前控制器名和动作名
直接用 $this->id 和 $this->action->id,这是最稳、最轻量的方式,不依赖路由解析或 URL 拆解,也不受伪静态或模块嵌套影响。
常见错误是去解析 $_SERVER['REQUEST_URI'] 或用 Yii::$app->requestedRoute 再手动分割——这在带模块(如 admin/user/index)或别名路由时极易出错。
-
$this->id返回的是控制器 ID(小写、无Controller后缀),比如site对应SiteController -
$this->action->id是当前动作 ID(同样小写,无action前缀),比如访问index方法就返回index - 如果在视图中使用,得通过
$this->context->id和$this->context->action->id
在行为(Behavior)或组件里怎么安全获取
行为没有 $this->id,也不能直接访问 $this->action,必须通过绑定的 owner(通常是控制器)来间接拿。
典型错误是假设 $this->owner 一定存在或一定是控制器——比如在 console 应用里挂到 Application 实例上,$this->owner 就不是控制器。
- 先判断
if ($this->owner instanceof \yii\web\Controller) - 再取
$this->owner->id和$this->owner->action->id - 如果 owner 可能为空或类型不确定,加空值检查:
!empty($this->owner) && $this->owner->action
Yii::$app->controller 为什么有时是 null
这个属性只在 Web 请求生命周期中由 Application::run() 自动设置,在 console 应用、单元测试、或者自定义入口(比如 CLI 脚本里手动 new Controller)时,它就是 null。
很多人误以为只要用了 Yii 就一定有 Yii::$app->controller,结果一上线就抛 Trying to get property 'id' of non-object 错误。
- 优先用
$this->id(在控制器/视图内)或$this->owner->id(在行为中) - 非必要不依赖
Yii::$app->controller,尤其不要在 config 文件或 bootstrap 阶段读它 - 如果真要兜底,加判断:
Yii::$app->controller ? Yii::$app->controller->id : 'unknown'
想记录日志或权限校验时,要不要拼接完整路由
需要完整路由(如 site/index)时,用 Yii::$app->requestedRoute 最准确;但要注意它返回的是路由字符串,不是实时计算出来的,而是框架在匹配完路由规则后确定的最终值。
容易踩的坑是把它和 $this->id . '/' . $this->action->id 混用——前者含模块前缀(如 admin/user/create),后者不含(只是 user + create)。
- 权限控制建议用
Yii::$app->requestedRoute,因为 RBAC 规则是按完整路由配的 - 日志记录推荐组合:
$this->id . '/' . $this->action->id(稳定)+Yii::$app->requestedRoute(可选,用于调试) - 不要用
Yii::$app->getUrlManager()->parseRequest()重复解析,性能差且可能破坏当前请求上下文
$this->id 的做法,基本都在给自己埋兼容性雷。











