Laravel中redirect携带message时如何让Toast在跳转后显示?
解决Laravel跳转后Toast提示不持久的问题
你遇到的问题是更新条目后,Toast提示仅在跳转前短暂显示,无法在目标页面正常展示。核心原因是Session键名不匹配,同时需要确保提示代码在跳转后的页面正确渲染。
问题代码展示
控制器代码
public function update(UpdateItem $request, $id) { $vd = $request->validated(); $item = $this->itemService->updateItem(json_decode($vd['data'], true), $id, $vd['modele_id']); if ($request->wantsJson()) { return ['item' => $item]; } else { return redirect()->route('item-show', ['id' => $id])->with('message', "Objet modifié"); } }
Blade视图代码
@if($messages = session('messages') ) <script> @if( is_array($messages) ) @foreach ( $messages as $message ) window.showSuccess('{{ $message }}') @endforeach @else window.showSuccess('{{ $messages }}') @endif </script> @endif
解决方案
1. 统一Session键名
控制器中使用->with('message', ...)存入Session,但Blade里读取的是session('messages')(复数),两者键名不一致,导致跳转后无法读取到消息。
方案A:兼容多消息场景
修改控制器代码,将键名改为messages(复数),匹配Blade的读取逻辑:
return redirect()->route('item-show', ['id' => $id])->with('messages', "Objet modifié");
此时Blade代码无需修改,它已经兼容单个字符串或数组类型的消息。
方案B:简化单消息逻辑
如果只需要单条提示,可简化Blade代码并匹配控制器的键名:
@if($message = session('message') ) <script> window.showSuccess('{{ $message }}') </script> @endif
控制器代码保持不变即可。
2. 确保提示代码在目标页面渲染
务必将这段Blade提示代码放在**跳转后的目标页面(item-show对应的视图)**中,而不是仅在提交表单的页面。因为跳转后会加载新页面,只有目标页面的脚本才会执行。
3. 验证JS函数存在性
确认window.showSuccess函数在目标页面已正确加载(比如引入了对应的Toast库或自定义JS),否则即使脚本渲染成功也不会弹出提示。
内容的提问来源于stack exchange,提问作者LoicJu
相关产品推荐
相关产品推荐

