Свои правила валидации в Laravel 5.7 – 5.8 за 3,5 минуты

Это моя первая запись на сайте. Сегодня я поделюсь с вами кое-чем полезным для Laravel-разработчиков.

![Laravel validation rules](/storage/uploads/photos/1/Screen Shot 2019-05-13 at 2.40.35 PM.png)

![Laravel validation rules](/storage/uploads/photos/1/Screen Shot 2019-05-13 at 2.40.35 PM.png)

Это моя первая запись на сайте. Сегодня я поделюсь с вами кое-чем полезным для Laravel-разработчиков.

Я предполагаю, что вы уже умеете устанавливать Laravel и сделали простую HTML-форму. Итак, вы узнаете, как:

  1. Создать собственный класс правила
  2. Задать сообщение об ошибке валидации
  3. Создать локализацию для сообщения об ошибке
  4. Использовать своё правило в контроллере через имя класса
  5. Использовать своё правило в контроллере через короткое имя

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

  • Полное имя
  • Номер телефона

Примерно так:

Сначала создадим правило валидации для поля с полным именем.

1. Создаём собственный класс правила валидации

Создадим новое правило командой artisan:

php artisan make:rule AlphaSpace

В папке ~laravel-project/app/rules появится новый файл.

Теперь добавьте логику в метод passes. Для нашей задачи используем такое регулярное выражение.

return preg_match('/^[\pL\s]+$/u', $value);

namespace App\Rules;
use Illuminate\Contracts\Validation\Rule;

class AlphaSpace implements Rule
{
    public function __construct()
    {
        //
    }

    public function passes($attribute, $value)
    {
        //
    }

    public function message()
    {
        return 'The validation error message.';
    }
}

3. Создаём локализацию для сообщения об ошибке

Чтобы задать сообщение об ошибке, используем метод message. Просто замените стандартное сообщение на:

return preg_match('/^[\pL\s]+$/u', $value);

Затем откройте файл локализации и найдите такие строки:

'custom' => [
    'attribute-name' => [
        'rule-name' => 'custom-message',
    ],
],

Над этими строками добавим локализацию нашего сообщения:

'alpha_space' => 'The :attribute must contain letters and spaces only!',

4. Используем правило в контроллере через имя класса

Проверим, работает ли это. Оберните существующие правила в массив и добавьте новое правило так.

$validatedData = $request->validate([
    	'name' => ['required','max:255', new AlphaSpace],
    	'email' => 'required|email',
    	'phone' => 'required|phone_number',
	]);

Если валидация не пройдёт и всё сделано верно, вы увидите сообщение об ошибке, которое задали ранее.

5. Используем правило в контроллере через короткое имя

А если хочется использовать нативный синтаксис Laravel? Есть хорошее решение.

Можно расширить класс Validator, добавив короткое имя правила в методе boot файла App\ServiceProvider.php. Получится примерно так.

public function boot()
{
	Validator::extend('alpha_space', 'App\\Rules\\AlphaSpace@passes');
}

После этого короткие имена правил можно использовать в контроллерах, form-request'ах и где угодно. Измените валидацию в контроллере так.

$validatedData = $request->validate([
    'name' => 'required|max:255|alpha_space',
    'email' => 'required|email',
    'phone' => 'required|phone_number',
]);

Если вам ближе видеоформат — посмотрите видеоверсию.

Если найдёте ошибки или знаете более удобный способ — напишите своё мнение в комментариях на моём YouTube-канале.

Спасибо за внимание.