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
相关产品推荐
相关产品推荐

