在 yii2.0.50 行为中获取当前登录用户名,需通过 $this->owner 访问绑定组件(如 controller),再调用 yii::$app->user->identity 获取用户对象,判空后取 username;不可在构造函数中直接读取,推荐在 event_before_action 等后期事件中使用。

在 Yii2.0.50 的 Behavior(行为)中获取当前登录用户名,关键在于行为本身不自动持有用户上下文,必须通过 $this->owner 访问所绑定的组件,再从中提取用户信息。
确认行为已正确附加到 Component 子类
只有继承自 yii\base\Component(如 Controller、ActiveRecord、Application 等)的类才能附加 Behavior 并支持 $this->owner。若附加到普通 Object 类会报错。
- 确保你的行为类继承自
yii\base\Behavior - 确保它被附加到了 Controller 或其他 Component 实例上(例如在控制器的
behaviors()方法中配置)
通过 owner 获取 user 组件并读取 identity
在行为的方法内部(如 events()、自定义方法或事件处理器中),使用以下方式安全获取用户名:
-
$user = $this->owner->module->get('user', true)->identity;(推荐,兼容模块化结构) - 或更直接:
$user = Yii::$app->user->identity;(前提是行为运行在 Web 应用上下文中,且用户已登录) - 获取用户名:
$username = $user ? $user->username : null; - 务必先判空,避免未登录时访问
identity->username报错
注意 authKey 和自动登录的影响
如果项目启用了 enableAutoLogin,且用户凭 cookie 登录,Yii::$app->user->identity 仍可正常访问;但若仅依赖 session 且会话过期,identity 将为 null。
- 检查是否登录:
if (!Yii::$app->user->isGuest) { ... } - 不要在行为初始化阶段(如构造函数)直接读取
identity,此时$this->owner可能尚未完全初始化 - 如需在事件中使用(如
EVENT_BEFORE_ACTION),确保该事件触发时机晚于 user 组件初始化
简单示例:日志行为中记录操作人
假设你写了一个日志行为,想在每次控制器动作前记录当前用户名:
class LogUserBehavior extends Behavior
{
public function events()
{
return [
Controller::EVENT_BEFORE_ACTION => 'logUsername',
];
}
public function logUsername($event)
{
$user = Yii::$app->user->identity;
$username = $user ? $user->username : 'guest';
\Yii::info("Action triggered by: {$username}", 'app');
}
}
只要该行为附加在控制器上,就能可靠获取。











