检查Laravel表单请求验证中嵌套值的存在

问题描述 投票:0回答:1

我有以下验证规则:


    [
            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',
        ]

它们在我需要实现的这个测试案例之前都可以正常工作:

定价aka MenuItem::MENU_ITEM_PRICING是一个数组数组。我需要检查当MenuItem::MENU_ITEM_SIDE作为true传递时,pricing数组必须包含一个带有该特定项目某些值的子数组。

Ex:


    [
        MenuItem::MENU_ITEM_SIDE => false,
         MenuItem::MENU_ITEM_PRICING => []
    ]

上一个示例是有效的。但是:

Ex:


    [
        MenuItem::MENU_ITEM_SIDE => true,
         MenuItem::MENU_ITEM_PRICING => []
    ]

无效,应该是:


Ex:

[
    MenuItem::MENU_ITEM_SIDE => false,
     MenuItem::MENU_ITEM_PRICING => [['sideprice' => 2.20]]
]

How can I check (within my `FormRequest` class`) that if `MenuItem::MENU_ITEM_SIDE == true` then `MenuItem::MENU_ITEM_PRICING` should contain a subarray with a key named `sideprice`?

Thanks



php laravel laravel-6 laravel-validation laravel-formrequest
1个回答
0
投票
您可以将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!'); } }); }

注意:我还没有对它进行全面测试,但是它给了你这个主意。
© www.soinside.com 2019 - 2024. All rights reserved.