Webzone Публикации Использование валидации

Использование валидации

09:25 , 31 Октябрь 2018

Laravel поставляется с простой, удобной системой валидации (проверки входных данных на соответствие правилам) и получения сообщений об ошибках - классом Validation.

 

Простейший пример валидации

$validator = Validator::make(
    array('name' => 'Дейл'),
    array('name' => 'required|min:5')
);

 

Первый параметр, передаваемый методу make - данные для проверки. Второй параметр - правила, которые к ним должны быть применены.

 

Использование массивов для указания правил

 

Несколько правил могут быть разделены либо прямой чертой (|), либо быть отдельными элементами массива.

$validator = Validator::make(
    array('name' => 'Дейл'),
    array('name' => array('required', 'min:5'))
);

 

Проверка нескольких полей

$validator = Validator::make(
    array(
        'name' => 'Дейл',
        'password' => 'плохойпароль',
        'email' => 'email@example.com'
    ),
    array(
        'name' => 'required',
        'password' => 'required|min:8',
        'email' => 'required|email|unique'
    )
);

 

Как только был создан экземпляр Validator, метод fails (или passes) может быть использован для проведения проверки.

if ($validator->fails())
{
    // Переданные данные не прошли проверку
}

 

Если Validator нашёл ошибки, вы можете получить его сообщения таким образом:

$messages = $validator->messages();

 

Вы также можете получить массив правил, данные которые не прошли проверку, без самих сообщений:

$failed = $validator->failed();

 

Проверка файлов

Класс Validator содержит несколько изначальных правил для проверки файлов, такие как size, mimes и другие. Для выполнения проверки над файлами просто передайте эти файлы вместе с другими данными.

 

 

Хук после валидации

Laravel после завершения валидации может запустить вашу функцию-замыкание, в которой вы можете, например, проверить что-то особенное или добавить какое-то своё сообщение об ошибке. Для этого служит метод after():

$validator = Validator::make(...);

$validator->after(function($validator)
{
    if ($this->somethingElseIsInvalid())
    {
        $validator->errors()->add('field', 'Something is wrong with this field!');
    }
});

if ($validator->fails())
{
    //
}

Вы можете добавить несколько after, если это нужно.

 

 

 

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

Писать полный код валидации каждый раз, когда нужно провалидировать данные - это неудобно. Поэтому Laravel предоставляет несколько решений для упрощения этой процедуры.

 

Базовый контроллер App\Http\Controllers\Controller включает в себя трейт ValidatesRequests, который уже содержит методы для валидации:

/**
 * Сохранить пост в блоге.
 *
 * @param  Request  $request
 * @return Response
 */
public function store(Request $request)
{
    $this->validate($request, [
        'title' => 'required|unique|max:255',
        'body' => 'required',
    ]);

    //
}

 

Если валидация проходит, код продолжает выполняться. Если нет - бросается исключение Illuminate\Contracts\Validation\ValidationException. Если вы не поймаете это исключение, его поймает фреймворк, заполнит flash-переменные сообщениями об ошибках валидации и средиректит пользователя на предыдущую страницу с формой - сам !

 

В случае AJAX-запроса редиректа не происходит, фреймворк отдает ответ с HTTP-кодом 422 и JSON с ошибками валидации.

 

Код, приведенный выше, аналогичен вот этому::

/**
 * Сохранить пост в блоге.
 *
 * @param  Request  $request
 * @return Response
 */
public function store(Request $request)
{
    $v = Validator::make($request->all(), [
        'title' => 'required|unique|max:255',
        'body' => 'required',
    ]);

    if ($v->fails())
    {
        return redirect()->back()->withErrors($v->errors());
    }

    //
}

 

 

Изменения формата ошибок

Если вы хотите кастомизировать сообщения об ошибках валидации, которые сохраняются во флэш-переменных сессии при редиректе, перекройте метод formatValidationErrors в вашем контроллере:

/**
 * {@inheritdoc}
 */
protected function formatValidationErrors(\Illuminate\Validation\Validator $validator)
{
    return $validator->errors()->all();
}

 

 

 

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

Для реализации более сложных сценариев валидации вам могут быть удобны так называемые Form Requests. Это специальные классы HTTP-запроса, содержащие в себе логику валидации. Они обрабатывают запрос до того, как он поступит в контроллер.

 

Чтобы создать класс запроса, используйте artisan-команду make:request:

php artisan make:request StoreBlogPostRequest

 

Класс будет создан в папке app/Http/Requests. Добавьте необходимые правила валидации в его метод rules:

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()
{
    return [
        'title' => 'required|unique|max:255',
        'body' => 'required',
    ];
}

 

Для того, чтобы фреймворк перехватил запрос перед контроллером, добавьте этот класс в аргументы необходимого метода контроллера:

/**
 * Сохранить пост в блоге.
 *
 * @param  StoreBlogPostRequest  $request
 * @return Response
 */
public function store(StoreBlogPostRequest $request)
{
    // Валидация успешно пройдена
}

При грамотном использовании валидации запросов вы можете быть уверены, что в ваших контроллерах всегда находятся только отвалидированные входные данные !

 

В случае неудачной валидации фреймворк заполняет флэш-переменные ошибками валидации и возврашает редирект на предыдущую страницу. В случае AJAX-запроса отдается ответ с кодом 422 и JSON с ошибками валидации.

 

 

Контроль доступа

Классы Form Request также содержат метод authorize. В этом методе вы можете проверять, разрешено ли пользователю совершать это действие, обновлять данный ресурс. Например, если пользователь пытается отредактировать комментарий к посту, является ли он его автором ?

/**
 * Determine if the user is authorized to make this request.
 *
 * @return bool
 */
public function authorize()
{
    $commentId = $this->route('comment');

    return Comment::where('id', $commentId)
                  ->where('user_id', Auth::id())->exists();
}

 

Обратите внимание на вызов метода route() выше. Этод метод дает вам доступ к параметрам в урле (в данном случае это {comment}), определенным в роуте:

Route::post('comment/{comment}');

 

Если метод authorize возвращает false, фреймворк формирует ответ с HTTP-кодом 403 и сразу же отсылает его. Метод контроллера не выполняется.

 

Если ваша логика авторизации и проверки доступа находится в контроллере, просто верните true в этом методе:

/**
 * Determine if the user is authorized to make this request.
 *
 * @return bool
 */
public function authorize()
{
    return true;
}

 

 

Изменения формата ошибок во флэш-переменных

 

Если вы хотите кастомизировать сообщения об ошибках валидации, которые сохраняются во флэш-переменных сессии при редиректе, переопределите метод formatValidationErrors в базовом классе запросов (App\Http\Requests\Request):

/**
 * {@inheritdoc}
 */
protected function formatValidationErrors(\Illuminate\Validation\Validator $validator)
{
    return $validator->errors()->all();
}

 

 

 

Работа с сообщениями об ошибках

 

После вызова метода messages объекта Validator вы получите объект MessageBag, который имеет набор полезных методов для доступа к сообщениям об ошибках.

 

Получение первого сообщения для поля

echo $messages->first('email');

 

Получение всех сообщений для одного поля

foreach ($messages->get('email') as $message)
{
    //
}

 

Получение всех сообщений для всех полей

foreach ($messages->all() as $message)
{
    //
}

 

Проверка на наличие сообщения для поля

if ($messages->has('email'))
{
    //
}

 

Получение ошибки в заданном формате

echo $messages->first('email', '

:message

');

Примечание: по умолчанию сообщения форматируются в вид, который подходит для Twitter Bootstrap.

Получение всех сообщений в заданном формате

foreach ($messages->all('
  • :message
  • ') as $message) { // }

 

 

Ошибки и шаблоны

Как только вы провели проверку, вам понадобится простой способ, чтобы передать ошибки в шаблон. Laravel позволяет удобно сделать это. Например, у нас есть такие роуты:

Route::get('register', function()
{
    return View::make('user.register');
});

Route::post('register', function()
{
    $rules = array(...);

    $validator = Validator::make(Input::all(), $rules);

    if ($validator->fails())
    {
        return redirect('register')->withErrors($validator);
    }
});

 

Заметьте, что когда проверки не пройдены, мы передаём объект Validator объекту переадресации Redirect с помощью метода withErrors. Этот метод сохранит сообщения об ошибках в одноразовых flash-переменных сессии, таким образом делая их доступными для следующего запроса.

 

Однако, заметьте, мы не передаем в View::make('user.register'); переменные $errors в шаблон. Laravel сам проверяет данные сессии на наличие переменных и автоматически передает их шаблону, если они доступны. Таким образом, важно помнить, что переменная $errors будет доступна для всех ваших шаблонов всегда, при любом запросе.. Это позволяет вам считать, что переменная $errors всегда определена и может безопасно использоваться. Переменная $errors - экземпляр класса MessageBag.

 

Таким образом, после переадресации вы можете прибегнуть к автоматически установленной в шаблоне переменной $errors:

first('email'); ?>

 

 

Именованные MessageBag

Если у вас есть несколько форм на странице, то вы можете выбрать имя объекта MessageBag, в котором будут возвращаться тексты ошибок, чтобы вы могли их корректно отобразить для нужной формы.

return redirect('register')->withErrors($validator, 'login');

 

 

Получить текст ошибки из MessageBag с именем login:

login->first('email'); ?>    

 

Источник

 

Вопросы / Комментарии / Отзывы


Требуется аккаунт чтобы написать комментарии :)