Laravel验证:测试场景下依赖字段的Unique规则失效求助
问题描述
业务逻辑要求bank_program_id与country的组合唯一,我在表单请求中使用了如下Unique验证规则:
'bank_program_id' => [ 'required', 'integer', 'exists:bank_programs,id', Rule::unique('bank_program_country', 'bank_program_id') ->where('country', $this->input('country')), ]
该规则在正常提交表单请求时可正常生效,但通过Validator::make($data, $request->rules())方式做测试时,无法阻止重复数据提交,求适配方案。
解决方案
问题出在$this->input('country')的取值逻辑上:在表单请求类内部执行时,$this指向请求实例,能正常获取请求中的country参数;但直接调用$request->rules()时,代码处于请求类外部上下文,$this->input('country')无法正确取到参数值,导致Unique规则的where条件失效。
提供两种适配方式:
方式一:用闭包动态绑定条件
把固定的where取值改成闭包形式,让验证器在执行时从待验证数据中动态获取country值,无论表单请求还是手动调用Validator都能生效:
'bank_program_id' => [ 'required', 'integer', 'exists:bank_programs,id', Rule::unique('bank_program_country', 'bank_program_id') ->where(function ($query) { $query->where('country', $this->input('country')); }), ]
方式二:测试时手动注入请求数据
如果不想修改原有规则,在测试调用Validator::make前,先给请求实例填充数据,确保$this->input('country')能取到值:
// 实例化你的表单请求类 $request = new YourFormRequest(); // 填充country参数到请求实例 $request->merge(['country' => $data['country']]); // 执行验证 $validator = Validator::make($data, $request->rules());
内容的提问来源于stack exchange,提问作者vdkt
相关产品推荐
相关产品推荐

