Comment on page
Валидация
Разработчики модулей создавая модули часто сталкиваются с задачей валидации форм, которые отправляет пользователь.
Например, практически в любой форме есть поля, обязательные для заполнения. Так же есть поля, значения которых нужно проверить на наличие в базе данных, в некоторых полях может находиться файл, размер которого нам нужно проверить, ссылка, правильность которой тоже нужно проверить или же email адрес в котором, например, нужно проверить не только корректность текста до и после символа @, но и наличие MX записей для указанного домена.
Для избавления от частых рутинных операций и упрощения кода в JohnCMS встроены различные, часто используемые базовые валидаторы.
Валидатор проверяет входные данные на соответствие настройкам правил валидации. Если данные не соответствуют правилам, валидатор возвращает false и так же позволяет получить информацию о том, какие именно требования не выполнены.
В JohnCMS используется laminas-validator, большинство существующих правил, которые описаны в официальной документации будут работать и в JohnCMS, но есть правила для которых требуются дополнительные зависимости и эти правила могут не работать, но таких как правило единицы и они редко используются.
При просмотре документации по валидаторам вам может показаться, что это достаточно громоздко, но не спешите, работа с валидатором в JohnCMS сильно упрощена, к тому же реализованы некоторые дополнительные валидаторы, которые вам скорее всего пригодятся.
Давайте рассмотрим пример и разберемся в некоторых деталях.
<?php
require 'system/bootstrap.php';
// Массив полей и значений
$data = [
'test' => '',
'number' => 100,
'email' => '[email protected]',
'model' => 110,
];
// Настройки валидатора
$rules = [
// Название поля => [ правила валидации и их параметры ]
'test' => [
'NotEmpty',
'StringLength' => [
'min' => 6,
'max' => 80,
],
],
'number' => [
'NotEmpty',
'LessThan' => ['max' => 90],
],
'email' => [
'EmailAddress' => [
'useMxCheck' => true,
],
],
'model' => [
'ModelExists' => [
'model' => \Johncms\Users\User::class,
'field' => 'id',
],
],
];
// Валидация
$validator = new \Johncms\Validator\Validator($data, $rules);
if ($validator->isValid()) {
echo 'OK';
} else {
d($validator->getErrors());
}
Здесь массив $data содержит набор данных, которые будут проверяться. Часто это данные из формы, полученные методом POST или GET.
Массив $rules содержит набор правил и их настройку. В качестве ключа указывается название поля из массива $data, а в качестве массива со значениями используется валидатор или набор валидаторов и их настройки.
Например в первом правиле проверяется значение поля под названием test, к нему применяется валидатор NotEmpty и StringLength. Валидатор NotEmpty проверяет не пустое ли значение в поле test, а валидатор StringLength проверяет длину значения. В данном случае длина значения должна быть от 6 до 80 символов.
Как видите, валидатор может не иметь настроек, а может иметь настройки. Если валидатор не имеет настроек или же вам подходят настройки по умолчанию, то вы может е передать только название валидатора. Если вам нужно дополнительно настроить валидатор, просто передаете массив настроек.
Многие популярные валидаторы мы рассмотрим отдельно. Пока можете попробовать выполнить код выше.
Для этого в корне вашего сайта создайте файл test.php и вставьте в него этот код. После этого откройте в браузере страницу site.ru/test.php. Вы увидите следующий результат:
Array
(
[test] => Array
(
[isEmpty] => Поле является обязательным и не может быть пустым
)
[number] => Array
(
[notLessThan] => The input is not less than '90'
)
[email] => Array
(
[emailAddressInvalidMxRecord] => 'example.ru' Похоже, что записи MX или A для адреса электронной почты не действительны
)
[model] => Array
(
[modelNotFound] => Нет записей, соответствующих введенным данным
)
)
Как видно из результата, массив $data не прошел проверку. Валидатор вернул массив полей и правила валидации, которые не прошли проверку. Вы можете изменить в нем значения и понаблюдать за результатом, а так же поэкспериментировать с другими правилами.