Проверить наличие вложенного значения в 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 класс), что если MenuItem::MENU_ITEM_SIDE == true тогда MenuItem::MENU_ITEM_PRICING должен содержать подмассив с ключом с именем sideprice?

1 ответ

Решение

Вы можете добавить хуки после в запрос формы, просто переопределив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!');
        }
    });
}

Примечание: я еще не тестировал это полностью, но это дает вам представление.

Другие вопросы по тегам