我有一个问题,如果另一个规则通过/失败,如何添加/删除规则?
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。
- 如果通过了另一个规则,则添加一个规则很容易:
- 规则从左到右执行
- 使用管道(
|
字符(分隔规则 - 而且,只要左边的规则通过,后面的规则就会被添加和/或执行
- 如果另一个规则失败,则删除一个规则也可以通过管道实现。
因为失败规则之后的任何规则都会被忽略。
- 但与上述两种说法相反的说法是不可能的:
- 如果上一条规则失败,我们将无法添加和/或执行下一条规则
- 如果上一条规则通过,我们不能删除下一条规则
- 至少,并非没有自定义功能
感谢所有为我的问题提供解决方案的人,尤其是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;
}