仅当另一个字段通过验证时才验证该字段(在Laravel 8中)



我有一个问题,如果另一个规则通过/失败,如何添加/删除规则?

public function rules()
{
$rules = [
'description' => 'required|unique:orders,description',
'user_id' => 'required|unique:users,id',
'supplier_id' => 'required',
'warehouse_id' => 'required|unique:warehouse,id',
'warehouse_qty' => 'required'

];

return $rules;
}

例如,如果";仓库_ id">规则失败,则没有必要评估"strong>"规则;仓库_数量字段的规则(因为在数据库中找不到仓库id(。

或者如果";user_id">字段的规则成功,则应该激活新规则,例如对于"strong>";user_name"和";user_phone">字段。

谢谢!

要仅在另一个字段通过验证时才验证该字段,有多种解决方案。

方法#2(推荐(

自Laravel 5.3.23;只需将依赖于另一个字段规则的任何字段验证移动到Controller的withValidator(...)方法中,如:

use IlluminateSupportFacadesValidator;
// ...
public function withValidator($validator)
{
$validator->after(function ($validator) {
// Skip if any previous field was invalid.
if ($validator->failed()) return;
// Actual validation (for fields depending on previous).
Validator::make($this->input(), [
'warehouse_qty' => ['required']
])->validate();
});
}

这样做的优点是,可以像往常一样简单地使用现有规则(而不是像下面的方法那样重写"required"规则的源代码(。

另请参阅相关的Laracast帖子。

注意如果未定义rules()方法,withValidator(...)从不被调用(并且调用$this->input()可能导致函数未定义错误(。

方法#1(旧答案(

由于Laravel 5.6和更高版本,我们可以做以下操作:

use IlluminateSupportFacadesValidator;
// ...
public function rules()
{
$result = [
// ...
'warehouse_id' => 'required|unique:warehouse,id',
];
if (Validator::make($this->input(), $result)->passes()) {
$result['warehouse_qty'] = [
function ($attribute, $value, $fail) {
if (empty($value)) {
$fail('The '.$attribute.' is required.');
}
},
];
}
return $result;
}

注意要使以上内容发挥作用,字段顺序很重要,并且closure应该添加到它所依赖的字段后面的数组中。

-------===-------

虽然以上是自定义方法(针对特定问题(,但对于相同字段的规则,这样做是内置的Laravel。

  1. 如果通过了另一个规则,则添加一个规则很容易:
    • 规则从左到右执行
    • 使用管道(|字符(分隔规则
    • 而且,只要左边的规则通过,后面的规则就会被添加和/或执行
  2. 如果另一个规则失败,则删除一个规则也可以通过管道实现。

    因为失败规则之后的任何规则都会被忽略。

  3. 但与上述两种说法相反的说法是不可能的:
    • 如果上一条规则失败,我们将无法添加和/或执行下一条规则
    • 如果上一条规则通过,我们不能删除下一条规则
    • 至少,并非没有自定义功能

感谢所有为我的问题提供解决方案的人,尤其是Top Master,因为他的解释向我展示了另一种观点。

我终于能够解决我的问题,这就是我的解决方案。如果有人能改进代码,那是受欢迎的。

public function rules()
{   
$rules = [
'description' => 'required|unique:orders,description',
'user_id' => 'required|unique:users,id',
'supplier_id' => 'required'
];

$rules = $this->validateItems($rules);

return $rules;
}
public function validateItems($rules){

$rules["warehouse_id"] = ['required', 
'unique:warehouse,id'];

//Here I validate if the rules of the "warehouse_id" field fail or not.
$validator = Validator::make($this->input('warehouse_id'), [
"id" => ['required', 
'unique:warehouse,id']
]);
//If the validation doesn't fail, the "warehouse_qty" field is added to $rule                                 
if(!($validator->fails())){
$rules["warehouse_qty"] = ['required'];
}

}
return $rules;
}

相关内容

  • 没有找到相关文章

最新更新