Laravel中抛出关联数组错误信息并在Blade模板展示失败问题
解决方案:Laravel中结合ValidationException与SweetAlert/Toasts展示自定义错误
问题根源
你当前的代码报错是因为**ValidationException::withMessages的参数结构错误**,导致Blade中$message并非预期的数组,而是字符串,从而无法通过$message['title']访问属性。
withMessages要求传入的是「字段名 => 错误消息数组」的结构,你直接将关联数组赋值给'error'键,Laravel会自动将其转换为字符串形式的错误消息,而非保留数组结构。
方案一:修正ValidationException的传参方式
后端代码调整
将结构化的错误数据转为JSON字符串,作为error字段的错误消息元素:
throw ValidationException::withMessages([ 'error' => [ json_encode([ 'title' => '错误提示', 'type' => 'warning', 'text' => '具体错误内容' ]) ] ]);
Blade模板调整
在@error指令中,先解析JSON字符串为对象,再访问属性:
@error('error') // 解析后端传递的JSON错误数据 const errorData = JSON.parse('{!! $message[0] !!}'); $(document).Toasts('create', { title: `${errorData.title}!`, class: `bg-${errorData.type}`, autohide: true, delay: 5000, body: errorData.text, animationSpeed: 100, accordion: true, expandSidebar: false }) @enderror
方案二:使用Session Flash传递自定义错误(更推荐)
如果这不是表单字段的验证错误,而是全局自定义错误,用Session Flash传递数据会更直观,避免ValidationException的结构限制:
后端代码调整
// 存入自定义错误数据到Session session()->flash('custom_error', [ 'title' => '错误提示', 'type' => 'warning', 'text' => '具体错误内容' ]); // 抛出ValidationException(或直接redirect到目标页面) throw ValidationException::withMessages([]);
Blade模板调整
直接判断Session中是否存在自定义错误,再渲染Toasts:
@if(session()->has('custom_error')) const errorData = {!! json_encode(session('custom_error')) !!}; $(document).Toasts('create', { title: `${errorData.title}!`, class: `bg-${errorData.type}`, autohide: true, delay: 5000, body: errorData.text, animationSpeed: 100, accordion: true, expandSidebar: false }) @endif
内容的提问来源于stack exchange,提问作者Neithan Bravo
相关产品推荐
相关产品推荐

