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

Laravel 必填校验跳转至index Blade,如何在原表单页显示字段错误提示

问题根因

你将表单校验逻辑全量包裹在try...catch代码块中,Laravel框架在校验不通过时会主动抛出Illuminate\Validation\ValidationException异常,该异常被你定义的全局捕获Exception的逻辑拦截,因此没有触发Laravel默认的「校验失败自动重定向回表单页、将错误信息和用户输入存入session」的机制,直接走到了catch分支跳转至participants.index页面。

修复方案

方案1(推荐):将校验逻辑移至try块外

参数校验本身属于请求预处理逻辑,不需要纳入业务异常捕获范围,调整后代码如下:

public function store(Request $request)
{
    $user_roleId = Auth::user()->role_id;

    // 预处理role_id参数
    $roleid = $request->input('roles');
    if(empty($roleid)){
        $roleid='3';
    }else{
        if($roleid=='Admin'){
            $roleid='1';    
        }else if($roleid=='Regional Admin'){
            $roleid='2'; 
        }else{
            $roleid='3'; 
        }
    } 
    $request->merge(['role_id' => ''.$roleid.'']);

    // 校验逻辑移到try块外部
    $this->validate($request, [
        'first_name' => 'required',
        'last_name' => 'required',
        'email' => 'required|email|unique:users,email',
        'password' => 'required|same:confirm-password',
        'roles' => 'required',
        'image_id' => 'image|mimes:jpeg,png,jpg,gif,svg|max:2048',
        'role_id'=>'required',
        'region_id'=>'required',
        'profile_type'=>'required',
        'gender'=>'required',
        'email_verified_at'=>'required',
        'date_of_birth'=>['required','date',  function ($attribute, $value, $fail) {
            $age=Carbon::parse($value)->diff(Carbon::now())->y;
            if($age<18||$age>45){
                $fail('Âge invalide. l\'âge devrait être 18-45');
            }
        },]
    ]);

    try{
        $input = $request->all();
        
        if ($image = $request->file('image_id')) {
            $destinationPath = 'propics/';
            $profileImage = date('YmdHis') . "." . $image->getClientOriginalExtension();
            $image->move($destinationPath, $profileImage);
            $input['image_id'] = $profileImage;
        }

        if($user_roleId=='1'){
            $input['region_id']= $input['region_id']+1;
        }
        
        $input['profile_type']= $input['profile_type']+1;
        $input['password'] = Hash::make($input['password']);

        $user = User::create($input);
        $user->assignRole($request->input('roles'));

        return redirect()->route('participants.index')
                        ->with('success',__('texts.Participant created successfully.'));
    }
    catch (Exception $e){
        return redirect()->route('participants.index')
        ->with('failed',__('texts.An error has been occured.'));
    }
}

方案2:异常分支排除校验异常

如果不想调整原有代码结构,也可以在catch分支中对异常类型做判断,遇到校验异常直接抛出走框架默认处理逻辑:

catch (Exception $e){
    // 校验异常直接抛出,触发框架默认重定向逻辑
    if ($e instanceof \Illuminate\Validation\ValidationException) {
        throw $e;
    }
    return redirect()->route('participants.index')
    ->with('failed',__('texts.An error has been occured.'));
}
补充说明

你现有Blade中的错误展示逻辑是正确的,修复后校验不通过会自动跳转回表单页,对应字段下方会自动展示错误提示,不需要额外修改Blade代码,也不需要使用HTML原生required属性。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 21:09:02