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

Laravel如何返回自定义验证类的错误消息并展示给用户

自定义类中返回验证错误的实现方法

完全可以实现,和控制器内写验证的错误展示效果完全一致,常用两种实现方案:

方案1:抛Laravel原生验证异常(推荐)

Laravel全局自带ValidationException异常捕获机制,只要抛出这个异常,框架会自动把错误信息闪存到session的$errors变量中,自动重定向回提交页,和你平时调用Validator门面验证失败的处理逻辑完全一致,不需要修改前端已有的错误展示代码。如果是AJAX请求,框架也会自动返回422状态码和JSON格式的错误信息,不需要额外写适配逻辑。

修改自定义类代码如下:

namespace App\Classes;

use Illuminate\Validation\ValidationException;

class MyTestClass
{
    public function myCustomValidation($a = null, $b = null)
    {
        if (empty($a))
        {
            throw ValidationException::withMessages([
                'custom_field' => 'error 1' // 数组键名可自定义,对应前端取错误的字段标识
            ]);
        }
        elseif (empty($b))
        {
            throw ValidationException::withMessages([
                'custom_field' => 'error 2'
            ]);
        }
        else
        {
            return $a + $b;
        }
    }
}

控制器原有逻辑不需要额外加判断,正常调用即可:

public function store()
{
    $customStuff = new MyTestClass();
    $variable =  $customStuff->myCustomValidation(5);
    
    return view('test.index', compact('variable'));
}

Blade模板中正常读取错误信息即可:

@if ($errors->any())
    <div class="alert">
        @foreach ($errors->all() as $error)
            <p>{{ $error }}</p>
        @endforeach
    </div>
@endif

方案2:返回结构化结果手动处理

如果需要灵活控制错误处理逻辑,可以让自定义方法返回带状态标识的结构化数据,在控制器中判断结果后手动返回带错误的重定向:
修改自定义类方法:

namespace App\Classes;

class MyTestClass
{
    public function myCustomValidation($a = null, $b = null)
    {
        if (empty($a))
        {
            return [
                'is_valid' => false,
                'msg' => 'error 1'
            ];
        }
        elseif (empty($b))
        {
            return [
                'is_valid' => false,
                'msg' => 'error 2'
            ];
        }
        else
        {
            return [
                'is_valid' => true,
                'data' => $a + $b
            ];
        }
    }
}

控制器中增加结果判断逻辑:

public function store()
{
    $customStuff = new MyTestClass();
    $checkResult =  $customStuff->myCustomValidation(5);
    
    if (!$checkResult['is_valid']) {
        return back()->withErrors(['custom_field' => $checkResult['msg']]);
    }

    return view('test.index', ['variable' => $checkResult['data']]);
}

两种方案最终前端展示效果完全一致,第一种代码更简洁,不需要在多层调用时重复写判断逻辑,只要是Laravel框架的HTTP请求生命周期内抛出的ValidationException都会被自动处理,适配控制器、服务层、自定义类等所有场景。

内容的提问来源于stack exchange,提问作者Klapsius

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:39:14