Laravel中重定向返回成功/错误消息问题排查
嗨,我来帮你解决这个问题!我之前也碰到过类似的情况,重定向带消息不显示通常是几个常见的小问题导致的,咱们一步步排查:
1. 先确认路由有没有用对中间件
Laravel的会话(Session)功能完全依赖web中间件组里的StartSession和ShareErrorsFromSession这两个中间件。如果你的路由没在web中间件下,会话数据根本存不进去也读不出来。
- 如果你是在
routes/web.php里定义的路由,那默认已经自动应用了web中间件,没问题; - 要是你自己写了路由组,记得手动加上
web中间件:Route::middleware('web')->group(function () { Route::get('/index', 'Controller@index'); });
2. 修正视图里的Session调用
你视图里的代码看起来有截断(<...部分),而且用Session::get()的话需要确保已引入Session门面,不如用更简洁的辅助函数session()试试,同时把代码补全:
@if(session('yes')) <div class="alert alert-success alert-dismissible fade show" role="alert"> {{ session('yes') }} <button type="button" class="close" data-dismiss="alert" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> @endif
另外Laravel 5.8+还支持@session指令,写法更清晰:
@session('yes') <div class="alert alert-success alert-dismissible fade show" role="alert"> {{ $value }} <button type="button" class="close" data-dismiss="alert" aria-label="Close"> <span aria-hidden="true">×</span> </button> </div> @endsession
3. 检查重定向的目标路由是否正确
你用的action('Controller@index'),得确保控制器的类名是准确的!比如是不是应该是SubscriptionController@index而不是泛泛的Controller@index?如果路由指向错误,重定向到了别的页面,自然看不到消息。
4. 确认Session驱动和存储权限
看看.env文件里的SESSION_DRIVER,默认是file,这个没问题,但要确保storage/framework/sessions目录有读写权限,不然Session数据存不进去。可以用命令给目录加权限:
chmod -R 755 storage/framework/sessions
5. 检查控制器里有没有提前输出内容
如果在return redirect()之前,你用了echo、dd()或者其他输出内容的代码,会导致HTTP头提前发送,Session就没法正常写入了。确认控制器里重定向是最后一步操作,没有提前输出任何东西。
最后可以做个小测试:在控制器里临时加一行session()->put('test', 'Hello World'),然后在视图里输出{{ session('test') }},如果能显示,说明Session功能正常,那问题就出在重定向的with方法上;如果不能显示,那就是Session的基础配置有问题,回到第一步排查中间件。
内容的提问来源于stack exchange,提问作者Beradin Bicaku

