应通过 yii::$app->user->identity->username 获取并用 html::encode() 转义输出用户名,先判断 isguest 确保登录态,避免裸输出、直接查库或未转义访问;控制器传参适用于非登录态等定制场景。

在 Yii2.0.14 中,模板页面(视图)输出用户名,核心是“从控制器安全传值 → 在视图中正确渲染”,同时兼顾常见场景如登录态判断、防 XSS、多来源支持(如 User 组件、模型字段、会话变量等)。不复杂但容易忽略细节。
确保用户已登录并获取用户名
Yii2 默认通过 Yii::$app->user 管理认证状态。模板中不应直接访问 session 或 cookie,而应依赖 IdentityInterface 实现的安全接口:
-
Yii::$app->user->isGuest判断是否未登录(推荐前置检查) -
Yii::$app->user->identity->username获取当前登录用户的 username 字段(前提是 User 模型实现了IdentityInterface,且数据库字段为username) - 若字段名不同(如
nick_name或realname),请确认模型中username属性或重写getUsername()方法
在视图中安全输出用户名
永远不要裸用 = $username ?>,必须转义防止 XSS:
- 使用
yii\helpers\Html::encode():= Html::encode(Yii::$app->user->identity?->username ?? '游客') ?> - 简写方式(需提前
use yii\helpers\Html;):= Html::encode($user->username ?? '') ?>(当控制器显式传入 $user 变量时) - 若用户名含 HTML 标签且需保留格式(极少数情况),改用
Html::decode()或yii\helpers\HtmlPurifier过滤,但非常规做法
控制器传参方式(适合非登录态或定制化场景)
当用户名来自其他逻辑(如后台管理页查某用户、访客昵称、API 返回对象),推荐由控制器明确传递:
- 控制器中:
return $this->render('profile', ['username' => $model->nick_name]); - 视图中:
= Html::encode($username) ?>(更清晰、可测、避免隐式依赖) - 注意:避免在视图里调用查询 DB 或复杂逻辑,保持视图职责单一
布局文件中统一显示(如顶部导航栏)
常用位置如 views/layouts/main.php,建议封装成小部件或直接内联处理:
-
推荐写法:
<?php if (!Yii::$app->user->isGuest): ?>欢迎,= Html::encode(Yii::$app->user->identity->username) ?><?php endif; ?> - 加空合并(PHP 7.4+)防 Notice:
= Html::encode(Yii::$app->user->identity?->username ?? '未知用户') ?> - 避免:
= Yii::$app->user->identity->username ?>(无转义、可能报错、XSS 风险)











