Валидация
Валидация
Валидация — это проверка данных на соответствие заданным условиям и ограничением. Она выполняется с помощью правил валидации. Все правила, указанные в конкретной валидации, обязательны. При нарушении одного из правил валидация не состоится. Валидированию подвергаются данные, полученные из внешних источников. Все данные, которые приходят от пользователя, должны быть проверены — это защищает приложение от сбоев. В Laravel есть несколько подходов для проверки данных. Базовый вариант — валидация данных в контроллере при помощи набора правил. Базовый контроллер содержит трейт ValidatesRequests, в котором есть метод validate

Этот метод принимает два обязательных параметра: объект класса Request и массив, в котором содержится набор правил валидации. Ключи этого массива соответствуют названиям элементов формы, ожидаемых в объекте Request. В значениях массива указывается строка, содержащая правила валидации для соответствующего элемента.
Когда валидация не проходит (одно или несколько правил не выполняются), то выбрасывается исключение. Если его не отловить, то данные об ошибках валидации будут сохранены во флеш-сообщения (те, которые после действий пользователей выводятся на экран только один раз). Тогда последует редирект на страницу, с которой был совершен запрос.
Пример массива с правилами валидации:
return ["user_name" => ['required', 'string', 'min:2', 'max:200'],"email" => ['required', 'string', 'email:rfc,dns'],"phone" => ['required', 'string', 'min:17', 'max:17'],"total" => ['required', 'integer']];
Рассмотрим некоторые правила валидации:
● alpha — правило проверяет, состоит ли указанное поле только из букв;
● alpha_dash — правило указывает, что поле должно содержать только буквенные и цифровые символы, а также тире и подчеркивания;
● alpha_num — правило указывает, что поле должно содержать только буквенные и цифровые символы;
● date — правило проверяет переданное значение на возможность его конвертации в дату;
● email — правило проверяет, что данные соответствуют валидному email;
● integer — правило проверяет, что передано целое число;
● min:value — проверяемое поле должно быть меньше или равно максимальному значению value. Для переданного числа проверяется соответствие указанному целочисленному значению, для строки — количеству переданных символов, для массива — переданному количеству элементов, для файла — количеству килобайтов;
● max:value — работает, как правило, min, но проверяет, что поле имеет минимальное значение value;
● required — правило указывает, что поле должно присутствовать во входных данных и не быть пустым;
● unique:table,column — правило проверяет, что поле не существует в таблице table в колонке column;
● exists:table,column — правило проверяет, что переданное значение содержится в поле column таблицы table.
Вывод ошибок валидации
Для вывода ошибок валидации воспользуемся переменной $errors, в которую при заполнении шаблона добавляется объект класса Illuminate\Support\
ViewErrorBag, содержащий ошибки валидации.
Пример вывода ошибок в blade:
@if ($errors->any())@foreach ($errors->all() as $error)<x - alert type = "danger" :message = "$error" />@endforeach@endif
Добавим изменения в класс div`a - @error("age") is-invalid @enderror:
<div ><label for="age"><b> Возраст:</b></label><input name="age" type="text"class="form-control @error("age") is-invalid @enderror"value = "{{old("age")}}" placeholder = "Полных лет" required ></div >
Русификация ошибок валидации
Для русификации нужно указать приложению, что следует использовать русский язык по умолчанию, и добавить в папку с файлами языков русифицированные данные. Их можно скачать по ссылке: Здесь

Добавленные файлы сообщений приложения на русском языке:


В сообщениях указываются названия элементов формы — это не информативно для пользователя. Также обратим внимание на то, что title было заменено на "Наименование".
Рассмотрим подробнее файл с переводом на русский язык сообщений валидации:

В каждом сообщении для каждого правила содержится плейсхолдер :attribute — метка в тексте, которая будет заменена при добавлении сообщения. На это место подставляется название элемента формы. Но почему тогда вместо title указано «Наименование»? Ответ можно найти в этом же файле:

Таким образом, добавляя другие данные в указанный массив, можно подставлять нужные имена вместо названий элементов.
Но добавление данной информации в массив attributes приведет к глобальной подстановке. Добавление локальных имен для названия элементов формы Добавим еще один статический метод в модель News, который будет содержать в качестве ключей названия элементов формы добавления новости, а значений — их правильные имена.

Как этот метод использовать?
Еще раз внимательно рассмотрим метод для валидации данных. Он может принимать два необязательных параметра: $messages и $customAttributes.

В $messages можно передать сообщения, которые должны возвращать ошибки валидации. Поскольку нас вполне устраивают сообщения из добавленного перевода, будем в него передавать пустой массив. Сейчас нас интересует $customAttributes. В него передадим наш массив, который вернется из метода attributeNames.

