11. Валидация данных

21 Июня 2020 16:04 (Редактировано: 22 Июня 2020 01:03)

Прежде чем работать с какими-то данными, их нужно, для начала, проверить. Для этого существует механизм валидации в 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'
    ];
    ...

Правила:

  1. title. Оно обязательно. Если не пришло - будет возвращена ошибка. Минимум символов - 5 символов. Максимум символов - 200 символов;
  2. slug. Может быть, а может и не быть. Максимум символов - 200;
  3. description. Задаем тип - строка. Максимум символов - 500. Минимум символов - 3;
  4. 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. 1 строка. Передаем валидатору не объект $request, а массив инпутов через $request->all() и правила вторым параметром.
  2. 2 строка. passes() - и выполнит проверку и вернет true/false соответственно. В сравнении со вторым способом валидации, passes() не будет совершать каких либо действий типа редиректа withErrors() как бы это произошло во втором способе. Если же мы хотим какие-то свои действия произвести в процессе валидации то используем passes().
  3. 3 строка. validate() - то же самое, что и во втором и первом способе.
  4. 4 строка. valid(). Вернет массив валидных данных, которые прошли првоерку.
  5. 5 строка. failed(). Вернет массив неправильных данных.
  6. 6 строка. errors(). Массив со всеми ошибками.
  7. 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'
        ];
    }
}
  1. 16 - 17 строки. Добавили для дальнейшего использования директиву аутентификации (пока закомментированную).
  2. 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=[{$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 и в документации.