Валидация (проверка) данных формы — очень важный фактор защиты от нежелательных данных в приложении. Фреймворк 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.
