You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 02:51:57