Skip to main content

Laravel Form Request, как использовать один класс для обновления и создания записи

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

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

<?php
 
namespace App\Http\Requests;
 
use Illuminate\Foundation\Http\FormRequest;
 
class UserRequest extends FormRequest
{
 
    public function authorize()
    {
        return true;
    }
 
    public function rules()
    {
        return [
            'email' => 'required|email',
            'first_name' => 'required',
            'last_name' => 'required',
            'gender' => 'required',
            'password' => 'required|min:6',
        ];
    }
 
}

Метод rules() возвращает набор правил валидации в виде массива. Таким образом мы можем проверить, какой HTTP метод использовался при запросе и изменить правила валидации.

Для обновления нам не нужно указывать пароль, это поле нужно только при создании, потому мы просто добавим условие в котором проверим HTTP метод.

<?php
 
namespace App\Http\Requests;
 
use Illuminate\Foundation\Http\FormRequest;
 
class UserRequest extends FormRequest
{
 
    public function authorize()
    {
        return true;
    }
 
    public function rules()
    {
        $rules = [
            'email' => 'required|email',
            'first_name' => 'required',
            'last_name' => 'required',
            'gender' => 'required',
        ];
 
        if ($this->getMethod() == 'POST') {
            $rules['password'] = 'required|min:6';
        }
        
        return $rules;
    }
 
}
            


Как мы знаем, в laravel для создания записи используется метод POST, а для обновления PUT / PATCH.

После простых манипуляций класс можно использовать при обновлении / создании записи.

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *