В этой статье вы узнаете про PHP библиотеку Validation, которая нужна для валидации данных, что может быть полезно, если вы не хотите сами их все проверять.
Также если вас интересуют различные PHP библиотеки, то почитайте статью «PHP DiDOM Библиотека для парсинга HTML страниц», возможно тоже будет интересно.
Уcтановка Validation:
Для того чтобы установить эту библиотеку, вам нужно использовать Composer, и вписать не большой код в терминал или командную строку Windows:
1 | composer require respect/validation |
Дальше приступаем к работе.
Работа с Validation:
Тут стоит сказать, что по сути я дам вам перевод нескольких страниц из официальной документации, то всё равное будет интересно.
Сопоставимые значения:
Для определенных типов вы не можете делать сравнения из коробки в PHP, но Validation поддерживает некоторые из них.
Вы можете выполнить сравнение со следующими типами данных:
- Countable: любой объект, реализующий интерфейс Countable.
- DateTimeInterface.
- Числовые типы.
- Строка из одного символа.
- Примитивные типы в целом: сравнение нормальной работы, сделанные PHP.
- Строка времени: формат даты и времени, который может быть проанализирован PHP.
Ниже вы можете увидеть несколько примеров:
1 2 3 4 5 6 7 8 9 10 11 | v::min(100)->validate($collection); // true if it has at least 100 items v::dateTime() ->between(new DateTime('yesterday'), new DateTime('tomorrow')) ->validate(new DateTime('now')); // true v::numericVal()->max(10)->validate(5); // true v::stringVal()->between('a', 'f')->validate('d'); // true v::dateTime()->between('yesterday', 'tomorrow')->validate('now'); // true |
Конкретный API:
Существует множество микрофреймворков, которые полагаются на магические методы. В этой части мы собираемся изучить Respect\Validation API без плавных интерфейсов или магических методов. Мы будем использовать традиционный подход внедрения зависимостей.
1 2 3 4 | use Respect\Validation\Validator as v; $usernameValidator = v::alnum()->noWhitespace()->length(1, 15); $usernameValidator->validate('alganet'); // true |
Если вы var_dump($usernameValidator)
, вы увидите состав объектов с Respect\Validation\Rules\Alnum
, Respect\Validation\Rules\NoWhitespace
и Respect\Validation\Rules\Length
. Для каждого правила есть конкретный объект, а цепочка только строит структуру. Вы можете построить его самостоятельно:
1 2 3 4 5 6 7 8 | use Respect\Validation\Rules; $usernameValidator = new Rules\AllOf( new Rules\Alnum(), new Rules\NoWhitespace(), new Rules\Length(1, 15) ); $usernameValidator->validate('alganet'); // true |
Это по-прежнему очень простой API. Вы можете использовать его в любом контейнере внедрения зависимостей или протестировать его так, как хотите. Вложение все еще возможно:
1 2 3 4 5 6 7 8 9 | use Respect\Validation\Rules; $usernameValidator = new Rules\AllOf( new Rules\Alnum(), new Rules\NoWhitespace(), new Rules\Length(1, 15) ); $userValidator = new Rules\Key('name', $usernameValidator); $userValidator->validate(['name' => 'alganet']); // true |
Пользовательские правила:
Вы также можете создавать и использовать свои собственные правила. Для этого вам нужно будет создать правило и исключение для правила.
Чтобы создать правило, вам нужно создать класс, который расширяет класс AbstractRule и находится в namespace
Rules. При вызове правила будет выполнена логика внутри метода проверки. Вот как должен выглядеть класс:
1 2 3 4 5 6 7 8 9 10 11 | namespace My\Validation\Rules; use Respect\Validation\Rules\AbstractRule; final class Something extends AbstractRule { public function validate($input): bool { // Do something here with the $input and return a boolean value } } |
Каждое правило должно иметь исключение. Исключения должны называться именем правила, за которым следует слово Exception. Процесс создания Exception подобен созданию правила, но в классе Exception нет методов. Вместо этого вы создаете одно статическое свойство, содержащее массив со следующей информацией:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | namespace My\Validation\Exceptions; use Respect\Validation\Exceptions\ValidationException; final class SomethingException extends ValidationException { protected $defaultTemplates = [ self::MODE_DEFAULT => [ self::STANDARD => 'Validation message if Something fails validation.', ], self::MODE_NEGATIVE => [ self::STANDARD => 'Validation message if the negative of Something is called and fails validation.', ], ]; } |
Итак, в конце концов, структура папок для ваших правил и исключений должна выглядеть примерно так, как показано ниже. Обратите внимание, что папки (и пространства имен) указаны во множественном числе, а фактические правила и исключения — в единственном числе.
1 2 3 4 5 6 | My +-- Validation +-- Exceptions +-- SomethingException.php +-- Rules +-- Something.php |
Все классы в Validation созданы классом Factory
. Если вы хотите, чтобы Validation выполняла ваше правило (или правила) в цепочке, вы должны перезаписать Factory
по умолчанию.
1 2 3 4 5 6 | Factory::setDefaultInstance( (new Factory()) ->withRuleNamespace('My\\Validation\\Rules') ->withExceptionNamespace('My\\Validation\\Exceptions') ); v::something(); // Try to load "My\Validation\Rules\Something" if any |
Вывод:
В этой статье вы прочитали про PHP библиотеку Validation, которая нужна для валидации, думаю для многих было это интересно, если вы заинтересовались этой библиотекой, то зайдите на страницу GitHub.