Yii2中Yii::$app->session->set()失效,Flash值不显示求助
数据已成功存入数据库,但重定向到新页面后无法显示Flash提示;查看日志发现Session中没有任何设置的内容。相关配置及代码如下:
1. main.php 配置
'components' => [ ... 'session' => [ 'class' => 'yii\web\Session', 'cookieParams' => [ 'httpOnly' => true, 'lifetime' => 30 * 24 * 60 * 60, ], 'name' => 'advanced-frontend-rasha', ],
2. AbcController 代码(三种写法均尝试)
if($model->save()){ $session = Yii::$app->session; $session->set('step', 'careers/step2'); $session->set('registrationStep2', 2); $session->setFlash('success', $successMessage); return $this->redirect(['careers/step2']); }else{ Yii::$app->session->setFlash('error', $errorMessage); return $this->render('step1', ['model' => $model]); }
3. 视图代码
<?php if (Yii::$app->session->hasFlash('success')) { ?> <div class="alert alert-success" role="alert"> <p> <?= Yii::$app->session->getFlash('success') ?></p> </div> <?php } ?> <?php if (Yii::$app->session->hasFlash('error')) { ?> <div class="alert alert-danger" role="alert"> <p> <?= Yii::$app->session->getFlash("error") ?></p> </div> <?php } ?>
4. 日志代码
$session = Yii::$app->session; Yii::info('Session name: '.$date->date('Y/m/d H:i') . $session->name, 'session'); Yii::info('Session : '.$date->date('Y/m/d H:i') . $session->get('step'), 'session'); Yii::info('Session value2: '.$date->date('Y/m/d H:i') . $session->get('registrationStep2'), 'session'); Yii::info('All session values2: '.$date->date('Y/m/d H:i') . print_r($session->getAllFlashes(), true), 'session');
5. app.log 日志内容
2023-11-24 00:04:05 [::1][40][-][info][session] Session name: advanced-frontend-rasha
in C:\xampp\htdocs\rasha\frontend\views\careers\step2.php:28
in C:\xampp\htdocs\rasha\frontend\controllers\CareersController.php:159
2023-11-24 00:04:05 [::1][40][-][info][session] Session value:
in C:\xampp\htdocs\rasha\frontend\views\careers\step2.php:39
in C:\xampp\htdocs\rasha\frontend\controllers\CareersController.php:159
2023-11-24 00:04:05 [::1][40][-][info][session] Session value2:
in C:\xampp\htdocs\rasha\frontend\views\careers\step2.php:40
in C:\xampp\htdocs\rasha\frontend\controllers\CareersController.php:159
2023-11-24 00:04:05 [::1][40][-][info][session] All session values2: Array
(
)
解决思路
1. 确认Session已正确初始化
Yii默认自动开启Session,但如果有自定义逻辑干扰,可手动确保Session激活:
if (!Yii::$app->session->isActive) { Yii::$app->session->open(); }
2. 检查Session Cookie的路径/域名配置
若重定向前后路径或域名不一致,Cookie无法携带,需补充配置:
'cookieParams' => [ 'httpOnly' => true, 'lifetime' => 30 * 24 * 60 * 60, 'path' => '/', // 覆盖整个站点路径 'domain' => $_SERVER['HTTP_HOST'], // 适配当前域名 ],
3. 排查重定向前的意外输出
如果设置Session前有任何输出(比如空格、echo、var_dump),会导致Cookie无法发送,Session写入失败。检查控制器、视图文件开头是否有多余字符,确保redirect前无任何输出。
4. 修正Flash消息的读取逻辑
Yii的Flash默认是一次性的,调用getAllFlashes()会直接清空Flash。若日志中先调用了该方法,视图将无法读取,可修改日志代码保留Flash:
Yii::info('All session values2: '.$date->date('Y/m/d H:i') . print_r($session->getAllFlashes(false), true), 'session');
5. 验证Session存储路径权限
确保PHP的Session存储目录(或自定义路径)有读写权限,可在配置中指定项目内的存储路径:
'session' => [ 'class' => 'yii\web\Session', 'savePath' => '@runtime/sessions', // 确保该目录有读写权限 // 其他配置... ],
6. 确认重定向路由的正确性
检查['careers/step2']是否指向正确的控制器动作,避免跨应用(如frontend和backend)的Session隔离问题。
内容的提问来源于stack exchange,提问作者Mehdi Hashemi

