Проверьте наличие вложенного значения в Laravel Проверка запроса формы - PullRequest
0 голосов
/ 01 марта 2020

У меня есть следующие правила проверки:

[
    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 должен содержать подмассив с некоторыми значениями для этого элемента c.

Пример:

[
    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 Ответ

1 голос
/ 01 марта 2020

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...