Валидация (проверка) данных формы — очень важный фактор защиты от нежелательных данных в приложении. Фреймворк Laravel для этого предоставляет простые, легкие и эффективные правила. В этой статье я покажу вам различные способы валидации. После обсуждения каждого метода я расскажу, когда использование метода предпочтительнее.
Различные способы валидации в Laravel:
- Валидация в контроллере
- Валидация запроса
- Валидация в модели
- Ручная валидация
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.