Yii2登录后如何在main.php布局中访问LoginForm的$nhs变量
解决Yii2登录后在布局中访问LoginForm变量的问题
嘿,刚接触Yii2遇到这种场景很正常,我来给你拆解一下解决方案,分两种常用的实现方式,你可以根据需求选:
方式一:临时存储到Session(适合不需要持久化用户选择的场景)
这种方式简单直接,登录时把$nhs的值存入Session,之后在全局布局里直接从Session读取即可。
1. 修改LoginForm的login()方法
打开common\model\LoginForm.php,在登录验证通过后,把$nhs的值写入Session:
public function login() { if ($this->validate()) { // 将nhs值存入Session Yii::$app->session->set('user_nhs', $this->nhs); // 执行登录逻辑 return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0); } return false; }
2. 在布局main.php中读取Session值
打开frontend\views\layouts\main.php,在需要控制页面选项的位置,读取Session中的值并判断:
<?php if (!Yii::$app->user->isGuest): ?> <?php $nhsValue = Yii::$app->session->get('user_nhs', false); // 默认值设为false,防止Session不存在的情况 ?> <?php if ($nhsValue): ?> <!-- 展示NHS用户专属的页面选项 --> <li class="nav-item"> <a class="nav-link" href="/nhs-dashboard">NHS控制台</a> </li> <?php else: ?> <!-- 展示普通用户的页面选项 --> <li class="nav-item"> <a class="nav-link" href="/user-dashboard">个人控制台</a> </li> <?php endif; ?> <?php endif; ?>
3. 可选:退出时清除Session值
如果希望用户退出登录后,Session里的user_nhs被清除,可以修改frontend\controllers\SiteController.php的actionLogout()方法:
public function actionLogout() { // 移除Session中的nhs值 Yii::$app->session->remove('user_nhs'); Yii::$app->user->logout(); return $this->goHome(); }
方式二:持久化到用户表(适合需要记住用户选择的场景)
如果你希望用户下次登录时自动选中上次的nhs选项,可以把这个值存到用户表中,绑定到用户身份上。
1. 给用户表添加nhs字段
首先在你的用户表(比如user)里新增一个tinyint类型的nhs字段,长度设为1,默认值0。
2. 更新用户模型
打开用户身份模型(通常是common\models\User.php),确保nhs字段被识别:
// 如果是ActiveRecord模型,直接在rules里添加字段验证即可 public function rules() { return array_merge(parent::rules(), [ [['nhs'], 'boolean'], ]); }
3. 修改LoginForm的login()方法
在登录验证通过后,更新用户模型的nhs值:
public function login() { if ($this->validate()) { $user = $this->getUser(); // 更新用户的nhs字段 $user->nhs = $this->nhs; $user->save(false); // 跳过验证,只更新这个字段 // 执行登录 return Yii::$app->user->login($user, $this->rememberMe ? 3600*24*30 : 0); } return false; }
4. 在布局中读取用户身份的nhs值
在main.php里直接从当前登录用户的身份模型读取:
<?php if (!Yii::$app->user->isGuest): ?> <?php $nhsValue = Yii::$app->user->identity->nhs; ?> <?php if ($nhsValue): ?> <li class="nav-item"> <a class="nav-link" href="/nhs-dashboard">NHS控制台</a> </li> <?php else: ?> <li class="nav-item"> <a class="nav-link" href="/user-dashboard">个人控制台</a> </li> <?php endif; ?> <?php endif; ?>
额外检查:确保登录页面的单选按钮正确
最后确认一下frontend\views\site\login.php里的单选按钮代码是否正确,确保name属性对应LoginForm[nhs]:
<?= $form->field($model, 'nhs')->radioList([ true => '是(NHS用户)', false => '否(普通用户)' ])->label('用户类型') ?>
这样就能完美实现你想要的功能啦!
内容的提问来源于stack exchange,提问作者Alan Young
相关产品推荐
相关产品推荐

