Способы валидации данных

Валидация данных в Laravel

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

Различные способы валидации в Laravel:

  1. Валидация в контроллере
  2. Валидация запроса
  3. Валидация в модели
  4. Ручная валидация

1. Валидация в контроллере

В этом способе мы можем проверить запрос, отправленный пользователем, непосредственно в контроллере с помощью метода $this->validate(). Большинство разработчиков использует этот метод. Если проверка не пройдена, то автоматически делается редирект назад со всеми ошибками валидации.

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class PostController extends Controller
{
   
    public function store(Request $request)
    {
    	$rules = ['title' => 'required|min:10', 'description' => 'required'];
        $this->validate( $request, $rules);

        // валидация пройдена, теперь ваш код

    }
}

Этот чистый и простой способ. Он подходит, когда пользовательская форма небольшая. Рекомендуется, если у вас в форме не более 3-5 полей. Всё несложное в одном месте.

2. Валидация запроса

В этом способе мы проверяем запрос пользовательской формы, создав отдельный класс валидации запроса. Это способ позволяет многократное использование. Мы должны создать класс валидации с нашими правилами и внедрить экземпляр класса в метод, где будем проверять данные.

Создаем класс валидации запроса с помощью artisan-команды:

php artisan make:request PostRequest

Класс PostRequest:

use Illuminate\Foundation\Http\FormRequest;

class PostRequest extends FormRequest
{

    public function authorize()
    {
    	// можем проверить множество вещей
        return true;
    }

    public function rules()
    {
    	return [
    		'title'=> 'required|min:10',
    		'post_status'=> 'required|in:Published,Draft,Pending',
    		'description' => 'required'
    	];
    }

}

Если мы хотим использовать один и тот же класс валидации для различных видов HTTP-запросов, например, POST, PUT, PATCH, DELETE, то тогда мы должны сделать как показано ниже.

use Illuminate\Foundation\Http\FormRequest;

class PostRequest extends FormRequest
{

    public function authorize()
    {
    	// можем проверить множество вещей
        return true;
    }

    public function rules()
    {
    switch ($this->method()) {
        case 'GET':
        case 'DELETE': {
            return [
            	'id'=>'required|exists:posts,id'
            ];
        }
        case 'POST': {
            return [
        		'title'=> 'required|min:10',
        		'description' => 'required'
            ];
        }
        case 'PUT':
        case 'PATCH': {
            return [
            	'id'=>'required|exists:posts,id'
        		'title'=> 'required|min:10',
        		'description' => 'required'
            ];
        }
        default:
            break;
    }
    }

}

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

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

use App\Http\Requests\PostRequest;

class PostController extends Controller
{
   
    public function store(PostRequest $request)
    {
        // валидация пройдена, теперь ваш код

    }

    public function update(PostRequest $request)
    {
        // валидация пройдена, теперь ваш код

    }
}

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

3. Валидация в модели

В этом способе валидация будет происходить в самой модели.

Модель

namespace App;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Validator;

class Post extends Model
{

    protected $rules = array(
        'title'=> 'required|min:10'
    );

    public function validate($inputs) {
        $v = Validator::make($inputs, $this->rules);
        if($v->passes()) return true;
        $this->errors = $v->messages();
        return false;
    }
}

Контроллер

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;

class PostController extends Controller
{
   
    public function store(Request $request)
    {
        $post = new Post();
        if(!$post->validate($request->all())) return redirect()->back();

        // ваш код

    }

}

Просто еще один способ валидации. Тем не менее, рекомендую использовать способ 2.

4. Ручная валидация

Этот способ использует фасады Laravel. Предположим, что нужно проверить импортированные Excel-данные. Пользователь просто подгружает Excel-файл с данными, а мы должны их проверить. Тогда мы делаем ручную валидацию через фасад валидации.

$rules = [
    'id' => "required|exists:users,
    'name' => 'required'
];

foreach ($excelRows as $key => $row) {
    
    $validator = Validator::make($row, $rules);

    if ($validator->fails()) {
        $isValid = false;
        break;
    } else {
        $isValid = true;
    }
}

Иногда бывает нужно проверить какие-либо пользовательские данные. Тогда и пригодится этот способ валидации через фасад.

Вывод

Laravel из коробки имеет очень мощные и удобные правила валидации. Нужно просто их использовать согласно потребностям нашего приложения. Я рассказал как это можно сделать разными способами. Надеюсь, что вам было всё понятно.

Автор: Harun
Перевод: Алексей Широков

Наш Телеграм-канал — следите за новостями о Laravel.