检查 Laravel 表单请求验证中是否存在嵌套值
Check existence of nested value in Laravel Form Request Validation
我有以下验证规则:
[
MenuItem::MENU_ITEM_NAME => 'required|unique:menu_items,name',
MenuItem::MENU_ITEM_DESCRIPTION => 'nullable',
MenuItem::MENU_ITEM_CATEGORY => 'required|exists:categories,id',
MenuItem::MENU_ITEM_SIDE => 'nullable|boolean',
MenuItem::MENU_ITEM_SIDE_ONLY => 'nullable|boolean',
MenuItem::MENU_ITEM_IMAGE => 'nullable',
MenuItem::MENU_ITEM_AVAILABLE => 'nullable|boolean',
MenuItem::MENU_ITEM_ACTIVE => 'nullable|boolean',
MenuItem::MENU_ITEM_PRICING => 'required',
]
在我需要实施的这个测试用例之前它们工作正常:
定价又名 MenuItem::MENU_ITEM_PRICING
是数组的数组。我需要检查当 MenuItem::MENU_ITEM_SIDE
作为 true
传递时,pricing
数组必须包含一个子数组,其中包含该特定项目的一些值。
例如:
[
MenuItem::MENU_ITEM_SIDE => false,
MenuItem::MENU_ITEM_PRICING => []
]
前面的例子是有效的。但是:
[
MenuItem::MENU_ITEM_SIDE => true,
MenuItem::MENU_ITEM_PRICING => []
]
无效,应该是:
[
MenuItem::MENU_ITEM_SIDE => false,
MenuItem::MENU_ITEM_PRICING => [['sideprice' => 2.20]]
]
我如何检查(在我的 FormRequest
class 中)如果 MenuItem::MENU_ITEM_SIDE == true
那么 MenuItem::MENU_ITEM_PRICING
应该包含一个带有名为 sideprice
的键的子数组?
您可以将 after hooks 添加到您的表单请求中,只需重写 withValidator
方法,如下所示:
/**
* Configure the validator instance.
*
* @param \Illuminate\Validation\Validator $validator
* @return void
*/
public function withValidator($validator)
{
// Check using `sometimes` method
$validator->sometimes("{MenuItem::MENU_ITEM_PRICING}.*.sideprice", 'required', function ($input) {
return $input->${MenuItem::MENU_ITEM_SID};
});
// Or check using `after` method
$validator->after(function ($validator) {
if ($this->input(MenuItem::MENU_ITEM_SID, false)
&& ! \Illuminate\Support\Arr::has($this->input(MenuItem::MENU_ITEM_PRICING, []), '*.sideprice')) {
$validator->errors()->add('field', 'Something is wrong with this field!');
}
});
}
注意:我还没有完全测试过这个,但它给了你想法。
我有以下验证规则:
[
MenuItem::MENU_ITEM_NAME => 'required|unique:menu_items,name',
MenuItem::MENU_ITEM_DESCRIPTION => 'nullable',
MenuItem::MENU_ITEM_CATEGORY => 'required|exists:categories,id',
MenuItem::MENU_ITEM_SIDE => 'nullable|boolean',
MenuItem::MENU_ITEM_SIDE_ONLY => 'nullable|boolean',
MenuItem::MENU_ITEM_IMAGE => 'nullable',
MenuItem::MENU_ITEM_AVAILABLE => 'nullable|boolean',
MenuItem::MENU_ITEM_ACTIVE => 'nullable|boolean',
MenuItem::MENU_ITEM_PRICING => 'required',
]
在我需要实施的这个测试用例之前它们工作正常:
定价又名 MenuItem::MENU_ITEM_PRICING
是数组的数组。我需要检查当 MenuItem::MENU_ITEM_SIDE
作为 true
传递时,pricing
数组必须包含一个子数组,其中包含该特定项目的一些值。
例如:
[
MenuItem::MENU_ITEM_SIDE => false,
MenuItem::MENU_ITEM_PRICING => []
]
前面的例子是有效的。但是:
[
MenuItem::MENU_ITEM_SIDE => true,
MenuItem::MENU_ITEM_PRICING => []
]
无效,应该是:
[
MenuItem::MENU_ITEM_SIDE => false,
MenuItem::MENU_ITEM_PRICING => [['sideprice' => 2.20]]
]
我如何检查(在我的 FormRequest
class 中)如果 MenuItem::MENU_ITEM_SIDE == true
那么 MenuItem::MENU_ITEM_PRICING
应该包含一个带有名为 sideprice
的键的子数组?
您可以将 after hooks 添加到您的表单请求中,只需重写 withValidator
方法,如下所示:
/**
* Configure the validator instance.
*
* @param \Illuminate\Validation\Validator $validator
* @return void
*/
public function withValidator($validator)
{
// Check using `sometimes` method
$validator->sometimes("{MenuItem::MENU_ITEM_PRICING}.*.sideprice", 'required', function ($input) {
return $input->${MenuItem::MENU_ITEM_SID};
});
// Or check using `after` method
$validator->after(function ($validator) {
if ($this->input(MenuItem::MENU_ITEM_SID, false)
&& ! \Illuminate\Support\Arr::has($this->input(MenuItem::MENU_ITEM_PRICING, []), '*.sideprice')) {
$validator->errors()->add('field', 'Something is wrong with this field!');
}
});
}
注意:我还没有完全测试过这个,但它给了你想法。