Лучший способ проверки запросов Laravel

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

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

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

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

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

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

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

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


person no0by5    schedule 15.03.2019    source источник
comment
Код поможет нам определить, подойдет ли вам простое наследование ООП. Наверное, да, но трудно сказать   -  person apokryfos    schedule 15.03.2019
comment
Код представляет собой стандартную валидацию laravel, в ней нет ничего особенного.   -  person no0by5    schedule 15.03.2019


Ответы (3)


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

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
           ]);
       }
}

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

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

person apokryfos    schedule 16.03.2019
comment
Я думаю, что это лучший способ. Но StoreRequest должен расширять BaseRequest, а не FormRequest. - person no0by5; 18.03.2019
comment
@ no0by5 да, ты прав, упустил эту деталь. Спасибо - person apokryfos; 18.03.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: чтобы получить лучший код, вам следует подумать о разделении кода и создании определенных классов.

person Kenny Horna    schedule 15.03.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.

person ceejayoz    schedule 15.03.2019