@lexstile

Как и где можно проверить, есть ли для изменения поля в laravel requests?

Задача - если нет полей для изменения (с фронта не пришли поля из списка), вернуть ошибку с соответствующим текстом, что данные для изменения не переданы или т. п.
Попробовал через required_without_all, но это не только выглядит костыльно, но и не работает с полями при передаче значения nullable.

class DisheUpdateRequest extends FormRequest
{
    public function rules()
    {
        return [
            'category_id' => [
                'required_without_all:'. $this->getWithoutName('category_id'),
                'nullable',
                'numeric',
                Rule::exists('categories', 'id')->where(function ($query) {
                    # проверка принадлежности категории и блюда к одному меню
                    return $query->where('menu_id', $this->menu->id);
                }),
            ],
            'name' => ['required_without_all:'. $this->getWithoutName('name'), 'string', 'min:1', 'max:255'],
            'description' => ['required_without_all:'. $this->getWithoutName('description'), 'nullable', 'string', 'min:1', 'max:255'],
            'price' => ['required_without_all:'. $this->getWithoutName('price'), 'nullable', 'numeric', 'between:0,1000000'],
            'photo' => ['required_without_all:'. $this->getWithoutName('photo'), 'nullable', 'image', 'mimes:jpg,png', 'max:10240'],
            'order' => ['required_without_all:'. $this->getWithoutName('order'), 'numeric', 'min:0', 'max:32767'],
            'active' => ['required_without_all:'. $this->getWithoutName('active'), 'boolean'],
        ];
    }

    public function getWithoutName(string $field)
    {
        return implode(',', array_diff(['category_id', 'name', 'description', 'price', 'photo', 'order', 'active'], [$field]));
    }

    protected function prepareForValidation()
    {
        $this->merge([
            //
        ]);
    }

    public function failedValidation(Validator $validator)
    {
        throw new HttpResponseException(response()->json([
            'success' => false,
            'errors' => $validator->errors(),
        ])->setStatusCode(400));
    }
}
  • Вопрос задан
  • 163 просмотра
Решения вопроса 1
neuotq
@neuotq
Прокрастинация
Почему костыльно?
Почитайте про sometimes - здесь мы говорим что валидировать если поле есть в теле запроса
Ну и про усложнённую логику валидации.
Скорее всего вам просто нужно вместо nullable, сделать sometimes и тогда вы будете валидировать поле, только если оно есть в запросе.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы