Laravel验证规则咨询:如何根据a的值控制b的必填与空值要求
嘿,这个需求我之前也碰到过,确实Laravel自带的required_with/required_without没法直接满足,不过有两种很实用的方法能完美解决,给你拆解下:
方法一:用Laravel原生条件验证规则
这是最简便的方式,直接用Laravel提供的requiredIf和prohibitedIf规则组合就能实现需求:
$request->validate([ 'a' => 'required|in:x,y,z', 'b' => [ // 当a的值为x时,b必须填写 'requiredIf:a,x', // 当a的值不为x时,b必须为空(prohibited规则会拒绝任何非空值) 'prohibitedIf:a,!=,x', ], ]);
兼容性说明
如果你的Laravel版本低于8.x(没有prohibited规则),可以用nullable|max:0替代prohibitedIf,效果是一样的:
'b' => [ 'requiredIf:a,x', 'nullable|max:0', ],
max:0会强制字符串长度为0,也就是必须为空值。
方法二:自定义验证规则(适合需要复用的场景)
如果这个验证逻辑要在多个地方用到,自定义规则会更优雅。
首先生成规则类:
php artisan make:rule BDependsOnA
然后在生成的app/Rules/BDependsOnA.php里编写验证逻辑:
namespace App\Rules; use Illuminate\Contracts\Validation\Rule; class BDependsOnA implements Rule { protected $aValue; // 接收a字段的值作为参数 public function __construct($aValue) { $this->aValue = $aValue; } public function passes($attribute, $value) { if ($this->aValue === 'x') { // a为x时,b不能为空 return !empty($value); } else { // a不为x时,b必须为空 return empty($value); } } // 自定义错误提示信息 public function message() { return '当a为x时b必须填写,当a不为x时b必须为空。'; } }
最后在验证时使用这个规则:
$request->validate([ 'a' => 'required|in:x,y,z', 'b' => [new \App\Rules\BDependsOnA($request->input('a'))], ]);
表单请求类中的用法
如果是在表单请求类(比如App\Http\Requests\YourRequest)里,只需要通过$this->input('a')传递参数即可:
public function rules() { return [ 'a' => 'required|in:x,y,z', 'b' => [new \App\Rules\BDependsOnA($this->input('a'))], ]; }
内容的提问来源于stack exchange,提问作者rap-2-h
相关产品推荐
相关产品推荐

