Проверка запроса формы Laravel с оператором switch

У меня есть приложение Laravel, и я использую проверку формы запроса.

Я реализовал следующее:

 public function rules(){
      return [
            'item_name'=>'required',
            'item_description'=> 'required',
        ];
    }

В контроллере у меня следующее:

public function storeItem(storeItem $request) {
        $validated = $request->validated();
         ...
         ...     

        }
    }

Это работает правильно, но поскольку для некоторых элементов требуются не все переменные $ request, я хотел бы реализовать оператор switch следующим образом:

public function rules()
{
    $item_type = $this->route('item_type');
    switch($item_type) {
        case 'type1':
             return [
                'item_name'=>'required',
                'item_description'=> 'required',
            ];
            break;
         case 'type2':
             return [
                'item_name'=>'required',
                'item_amount'=> 'required',
                'item_favorite'=> 'required',
            ];
            break;
    }
}

Я получаю сообщение об ошибке:

Argument 2 passed to Illuminate\Validation\Factory::make() must be of the type array, null given

Это сообщение об ошибке предполагает, что я не возвращаю массив, но у меня есть операторы возврата для каждого случая переключения, поэтому я не уверен, почему я вижу это сообщение eeror.

Есть идеи, как это можно решить? Если оператор switch - не лучший вариант, есть ли другая идея?

$request типа storeItem?
nice_dev 28.12.2018 19:37

Да, документировано здесь (laravel.com/docs/5.7/validation#form-request-validation). В нем упоминается: «Все, что вам нужно сделать, это напечатать запрос на метод вашего контроллера». Эта часть работает нормально. Это оператор Switch, который вызывает проблемы

wiwa1978 28.12.2018 19:39

Справедливо. На самом корпусе коммутатора есть строка 'item_type'. Вероятно, вы захотите передать туда переменную, иначе она не будет соответствовать ни одному регистру и по умолчанию ничего не будет.

nice_dev 28.12.2018 19:44

Это все еще осталось, я отредактировал исходный пост. Проблема все еще существует

wiwa1978 28.12.2018 19:48

Что, если $item_type не является ни type1, ни type2?

nice_dev 28.12.2018 19:51

Вы должны добавить футляр default или return array(); в конце вашего метода.

nice_dev 28.12.2018 19:53

Кроме того, если есть только 2 условия / значения, я не вижу необходимости в переключении.

nice_dev 28.12.2018 19:53
break после return тривиален.
nice_dev 28.12.2018 19:56

Спасибо за ваши предложения. Вариант по умолчанию есть, но не показан в исходном сообщении. А пока я нашел решение. Мой случай переключения должен быть основан на переключателе ($ this-> request-> get ('item_type')).

wiwa1978 28.12.2018 20:01

Хорошо, не могу этого понять, так как я не знаю, что происходит в коде. Кроме того, вам всегда нужно упоминать код минимальный, полный, поддающийся проверке, чтобы получить лучший ответ.

nice_dev 28.12.2018 20:06

Спасибо за предложение

wiwa1978 28.12.2018 20:17
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
11
1 627
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот решение:

public function rules()
{
    switch($this->request->get('item_type')) {
        case 'Type1':
             return [
              'item_name'=>'required',
              'item_description'=> 'required',
            ];
            break;
         case 'Type2':
             return [
                 'item_name'=>'required',
                 'item_amount'=> 'required',
                 'item_favorite'=> 'required',
            ];
            break;

        default:
            return [
                'item_name'=>'required',
            ];
    }
}

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