Laravel自定义表单验证问题:after闭包未执行如何解决?
问题原因及解决方法
核心原因
你的代码在添加完after验证闭包后,立刻执行了dd('NO!'),直接终止了程序流程,根本没有触发验证逻辑的执行,所以after闭包里的代码自然不会被运行。
另外,after闭包内部还存在变量错误:你使用了未定义的$validator变量,应该用闭包参数传入的$v。
修复后的代码
<?php namespace App\Http\Controllers; use Auth; use Illuminate\Http\Request; use Illuminate\Support\Facades\DB; use Inertia\Inertia; use Redirect; use Response; use Validator; class MyController extends Controller { public function store(Request $req) { $v = Validator::make($req->all(), [ 'contract_ref' => 'required' ]); $v->after(function($v) use(&$req){ // dd('custom validations'); // 调试完成后可移除 // 修正变量错误,使用闭包参数$v操作错误信息 if (empty($req->div_id)) { $v->errors()->add('div_id', 'Please select a Division'); }; }); // 移除提前终止程序的dd,让验证逻辑正常执行 if ($v->fails()) { // 自定义验证失败处理逻辑,比如返回上一页并携带错误信息 return redirect()->back()->withErrors($v); } // 或者直接调用validate(),Laravel会自动处理验证失败的跳转/响应 $v->validate(); // 此处编写验证通过后的业务逻辑 } }
关键说明
after闭包只有在验证器执行验证操作(调用fails()、validate()或passes()方法)时才会被触发,必须保证这些方法在after闭包定义之后调用,且中间不能有终止程序的代码。- 闭包内操作错误信息时,必须使用闭包参数传入的验证器实例,避免使用未定义变量导致报错。
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

