Прежде чем работать с какими-то данными, их нужно, для начала, проверить. Для этого существует механизм валидации в Laravel.
Работаем с контроллером для категорий CategoryController и методом update(). Путь: project.loc\app\Http\Controllers\Blog\Admin\CategoryController.php
.
Прописываем правила
Прежде чем начать обрабатывать данные, полученные в $request, создадим правила для валидации. Добавляем в файл следующую конструкцию в самое начало метода update().
public function update(Request $request, $id)
{
$rules = [
'title' => 'required|min:5|max:200',
'slug' => 'max:200',
'description' => 'string|max:500|min:3',
'parent_id' => 'required|integer|exists:blog_categories,id'
];
...
Правила:
- title. Оно обязательно. Если не пришло - будет возвращена ошибка. Минимум символов - 5 символов. Максимум символов - 200 символов;
- slug. Может быть, а может и не быть. Максимум символов - 200;
- description. Задаем тип - строка. Максимум символов - 500. Минимум символов - 3;
- parent_id. Обязательно. Должно быть число. Правило проверки в базе - id обязательно должно быть в таблице blog_categories.
Способы валидации
1. Через контроллер Validate
Подключаем в начале файла контроллер:
use Illuminate\Support\Facades\Validator;
Прописываем после правил:
$validateData = $this->validate($request, $rules);
Применив это, все инпуты из формы будут проходить проверку согласно правилам и если присутствуют несоответствия то будет возвращена ошибка в специально отведенном месте (из прошлых уроков).
2. Через Request
Подключать валидатор не нужно. Используем объект $request
:
$validateData = $request->validate($rules);
3. Через валидатор
По сути, это самый "чистый" вариант для валидации т.к. и 1 и 2 варианты, в конечном варианте, используют валидатор.
Пишем код:
$validator = \Validator::make($request->all(), $rules);
$validatedData[] = $validator->passes();
$validatedData[] = $validator->validate();
$validatedData[] = $validator->valid();
$validatedData[] = $validator->failed();
$validatedData[] = $validator->errors();
$validatedData[] = $validator->fails();
- 1 строка. Передаем валидатору не объект $request, а массив инпутов через $request->all() и правила вторым параметром.
- 2 строка. passes() - и выполнит проверку и вернет true/false соответственно. В сравнении со вторым способом валидации, passes() не будет совершать каких либо действий типа редиректа withErrors() как бы это произошло во втором способе. Если же мы хотим какие-то свои действия произвести в процессе валидации то используем passes().
- 3 строка. validate() - то же самое, что и во втором и первом способе.
- 4 строка. valid(). Вернет массив валидных данных, которые прошли првоерку.
- 5 строка. failed(). Вернет массив неправильных данных.
- 6 строка. errors(). Массив со всеми ошибками.
- 7 строка. fails(). Вернет true если хоть где то есть ошибки.
4. Через FormRequest
Самый оптимальный вариант.
Запускаем команду в консоль
php artisan make:request BlogCategoryUpdateRequest
После этого будет создан файл poligon.local\app\Http\Requests\BlogCategoryUpdateRequest.php
с уже заготовленным наполнением, но нам нужно привести ег ок следующему виду:
<?php
namespace App\Http\Requests;
use Illuminate\Foundation\Http\FormRequest;
class BlogCategoryUpdateRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
//return auth()->check();
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'title' => 'required|min:5|max:200',
'slug' => 'max:200',
'description' => 'string|max:500|min:3',
'parent_id' => 'required|integer|exists:blog_categories,id'
];
}
}
- 16 - 17 строки. Добавили для дальнейшего использования директиву аутентификации (пока закомментированную).
- 27 - 32 строки. Перенесли из CategoryController правила в метод rule().
Теперь необходимо заменить принимаемый объект в CategoryController в методе update() на вновьсозданный и комментируем все предыдущие виды валидаций. В общем, метод update() будет иметь следующий вид:
public function update(BlogCategoryUpdateRequest $request, $id)
{
/*$rules = [
'title' => 'required|min:5|max:200',
'slug' => 'max:200',
'description' => 'string|max:500|min:3',
'parent_id' => 'required|integer|exists:blog_categories,id'
];*/
//$validateData = $this->validate($request, $rules);
//$validateData = $request->validate($rules);
/*$validator = \Validator::make($request->all(), $rules);
$validatedData[] = $validator->passes();
$validatedData[] = $validator->validate();
$validatedData[] = $validator->valid();
$validatedData[] = $validator->failed();
$validatedData[] = $validator->errors();
$validatedData[] = $validator->fails();
dd($validatedData);*/
$item = BlogCategory::find($id);
if(empty($item)) {
return back()->withErrors(['msg' => "Запись id=[] не найдена"])->withInput();
}
$data = $request->all();
$result = $item->fill($data)->save();
if($result) {
return redirect()->route('blog.admin.categories.edit', $item->id)->with(['success' => 'Успешно сохранено']);
}else{
return back()->withErrors(['msg' => 'ошибка сохранения'])->withInput();
}
}
На этом с валидацией покончено. Подробнее инфу можно смотреть с помощью хелпера PHPStorm и в документации.