Лучший способ проверить Laravel Requests - PullRequest
1 голос
/ 15 марта 2019

В моем контроллере ресурсов у меня есть хранилище и функция обновления с почти такими же правилами проверки. Поскольку моя проверка немного сложнее, я создал Запрос для этого.

Но поскольку правила проверки немного отличаются, мне нужно создать два Запроса:

  • один для хранения
  • один для обновления.

Но у меня почти одинаковый массив в двух разных местах, и если я решу изменить его, мне придется редактировать два разных файла. Есть ли лучший способ сделать это?

Я думал о создании дополнительного класса Request, в котором есть массив с общими правилами, а классы для запросов на сохранение и обновление наследуются от этого класса и используют массив из базового класса для составления правил проверки.

Но добавить дополнительный класс и наследовать его мне кажется слишком сложным, просто потому, что одно или несколько правил отличаются.

Другой способ, о котором я подумал, - это проверить только общие правила в классе Request и добавить дополнительную проверку в функции store и update, но тогда проверка будет выполняться в двух разных местах, что сделает проект более запутанным .

Я использую Laravel версии 5.8

Ответы [ 3 ]

3 голосов
/ 15 марта 2019

Как говорит @apokryfos, трудно сказать без контекста, но если вы не хотите использовать наследование, вы можете проверить метод запроса внутри класса запроса, чтобы добавить / удалить элементы из массива проверки:

/** YourCustomFormRequest.php */

    //

    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules()
    {
       $rules = ['here', 'goes', 'your', 'common', 'rules'];

       if ($this->isMethod('post'))
       {
           array_merge($rules, ['a', 'specific', 'rule']);           
       }

       if ($this->isMethod('put')) // or 'patch'
       {
           array_merge($rules, ['another', 'specific', 'rule']);           
       }


        return $rules;
    }

    //

Логика заключается в том, что когда вы создаете объект, вы должны сделать запрос POST, но при обновлении вы используете PUT / PATCH, поэтому мы просто получаем используемый метод для добавления /удалите условия из массива проверки.

Пока не тестировали его, но это должно сработать.


PS: Для того, чтобы получить лучший код, вы должны рассмотреть возможность отделения кодаи создавать конкретные классы.

2 голосов
/ 16 марта 2019

Я предлагаю наследование:

abstract class BaseRequest extends FormRequest {

        public function rules() {
              return [ /* common rules */ ]; 
        }
}

class StoreRequest extends BaseRequest {

       public function rules() {
           return array_merge(parent::rules(), [
               /* extra rules including overrides
           ]);
       }
}

Вы можете сделать то же самое для запроса на обновление. Это создает центральное место для управления общими чертами в запросе.

Сказанное без реального кода, мы не можем знать, что наиболее подходит для вашего случая.

1 голос
/ 15 марта 2019

Вы можете проверить наличие в запросе чего-либо, что указывает на обновление. Например:

public function rules() {
    $rules = [];

    // these rules apply to both
    $rules['title'] = ['required'];

    if($this->input('id')) {
        // these rules only apply to updates
        $rules['something_specific_to_updates'] = ['foo'];
    } else {
        // these rules only apply to new records
        $rules['something_specific_to_new_records'] = ['bar'];
    }

    return $rules;
}

Вы также можете посмотреть на $this->route('id'), чтобы посмотреть значение параметра маршрута, а не значение в $this->input POST данных формы.

...