Livewire技术问题:如何从中间件传递错误信息至页面组件?
解决Livewire组件无法显示中间件重定向错误信息的问题
问题原因
Laravel原生的withErrors方法会将错误信息存入session的默认错误存储,但Livewire组件的@error指令读取的是组件自身实例的错误集合,两者并不自动互通,因此中间件传递的错误无法被@error识别展示。
解决方案
在对应的Livewire登录组件中,添加mount方法,将session中的错误信息同步到组件的错误集合中:
组件代码修改
<?php namespace App\Livewire; use Livewire\Component; class Login extends Component { // 其他属性和方法... public function mount() { // 检查session中是否存在错误 if ($errors = session()->get('errors')) { // 将session中的错误同步到Livewire组件错误袋 if ($errors->has('login')) { $this->addError('login', $errors->first('login')); } } } // 登录方法... public function login() { // 原有登录逻辑... } public function render() { return view('livewire.login'); } }
通用化处理(可选)
如果需要同步所有session中的错误,可改为遍历所有错误项:
public function mount() { if ($errors = session()->get('errors')) { foreach ($errors->getBag('default')->all() as $key => $message) { $this->addError($key, $message); } } }
另一种替代方案(无需修改组件逻辑)
如果不想修改组件代码,也可以直接在视图中通过session读取错误信息:
修改Livewire组件的视图代码:
<form class="my-auto py-5" wire:submit="login"> ... {{-- 替换原来的@error指令,直接读取session错误 --}} @if(session('errors') && session('errors')->has('login')) <div class="alert alert-danger">{{ session('errors')->first('login') }}</div> @endif ... </form>
内容的提问来源于stack exchange,提问作者CarlosCarucce
相关产品推荐
相关产品推荐

