От автора: при разработке различных веб-приложений очень часто необходимо валидировать, то есть проверять различные данные, к примеру, данные полученные от пользователей при заполнении полей некой формы. При этом, если приложение пишется с нуля без использования фреймворков, а практически все популярные фреймворки обладают встроенным механизмом валидации данных, то программистам придется самостоятельно создавать специальные методы или функции, а в некоторых случаях и целые библиотеки, которые помогут произвести правильную валидацию данных. Поэтому в данном уроке я хотел бы поговорить с Вами об одной очень интересной библиотеке классов, которая реализует достаточно удобный и легкий в использовании механизм проверки и валидации различных данных. Название данной библиотеки Respect/Validation.
Установка библиотеки
Скачать данную библиотеку можно непосредственно с сервиса gitHub, по адресу //github.com/Respect/Validation:
Но в данном уроке мы используем инструмент composer для установки валидатора. Для этого в командной строке переходим в каталог с тестовым сайтом и выполняем команду:
1 |
composer require respect/validation |
После завершения установки, необходимо из папки vendor подключить файл autoload.php:
1 |
require "vendor/autoload.php"; |
Итак, библиотека установлена и можно приступать к валидации данных.
Методы валидации
Для начала валидации необходимо получить объект класса Validator для выбранного правила валидации. Правила валидаци определены в специальных классах библиотеки и определяют, по какому принципу будет проверяться некоторое значение. Список всех доступных правил приведен на следующей странице: //github.com/Respect/Validation/blob/master/docs/VALIDATORS.md
При этом правила отображаются в виде ссылок на страницы детального описания каждого из них. Теперь давайте проверим, что значение параметра valid передаваемое через адресную строку, соответствует адресу электронной почты. Для этого создаем объект класса Validator, для правила email (данное правило проверяет соответствует ли проверяемое значение адресу электронной почты).
1 |
$validator = Respect\Validation\Validator::email(); |
Далее у полученного объекта вызываем метод validate(), который возвращает TRUE, если валидация выполнена успешно, и FALSE в случае неудачи:
1 2 3 4 5 |
$isValid = $validator->validate($item); if(!$isValid) { exit('Not Valid'); } |
Где параметр $item – это проверяемое значение. При этом метод validate(), только возвращает результат проверки, а если нужно сгенерировать исключение, вместе с определенным сообщением о результате валидации, то в этом случае необходимо использовать метод assert():
1 2 3 4 5 6 7 8 |
try{ $validator->assert($item); } catch(\Respect\Validation\Exceptions\NestedValidationExceptionInterface $ex){ echo $ex->getFullMessage(); exit(); } |
Если валидация данных не выполняется, метод assert(), генерирует исключение специального информационного класса \Respect\Validation\Exceptions\NestedValidationExceptionInterface, и его конструктору передает сообщение соответствующее каждому определенному правилу валидации.
К примеру, если проверяемое значение не содержит строки соответствующей адресу электронной почты, то на экране мы увидим следующее:
Для проверки неких значений, мы можем использовать несколько правил, просто вызывая их по цепочке:
1 2 3 4 5 6 7 8 9 |
$validator = Respect\Validation\Validator::alnum()->noWhitespace()->length(1,15); try{ $validator->assert($item); } catch(\Respect\Validation\Exceptions\NestedValidationExceptionInterface $ex){ echo $ex->getFullMessage(); exit(); } |
В данном примере, мы проверяем, что проверяемое значение соответствует строке, содержащей только буквы английского алфавита или цифры, без пробелов и при этом длина строки лежит в пределах от 1 до 15 символов. Если валидация не будет выполнена хотя бы по одному из правил – значит, будет сгенерировано исключение с отображением соответствующего сообщения.
Для валидации свойств определённых классов, используется метод attribute(), в котором описываются правила валидации для каждого свойства класса в отдельности:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$user = new stdClass; $user->name = 'Alexandre'; $user->birthdate = '1985-07-01'; $validator = Respect\Validation\Validator:: attribute('name', Respect\Validation\Validator::string()->length(1,32)) ->attribute('birthdate', Respect\Validation\Validator::date()); try{ $validator->assert($user); } catch(\Respect\Validation\Exceptions\NestedValidationExceptionInterface $ex){ echo $ex->getFullMessage(); exit(); } |
Если для валидации используется несколько правил, то в блоке catch(), моно получить массив с данными по сообщениям от каждого используемого правила:
1 2 3 4 5 6 7 8 |
$validator = Respect\Validation\Validator::alnum()->noWhitespace()->length(1,15); try{ $validator->assert($item); } catch(\Respect\Validation\Exceptions\NestedValidationExceptionInterface $ex){ echo '<pre>'; print_r($ex->findMessages(array('alnum','noWhitespace','length'))); echo ' |
’;
exit();
}
Как Вы видите для каждого правила зарезервировано определенное сервисное сообщение, которое мы можем заменить на собственное, для этого достаточно передать значения для каждой ячейки массива, что передается в качестве параметра методу findMessages():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$validator = Respect\Validation\Validator::alnum()->noWhitespace()->length(1,15); try{ $validator->assert($item); } catch(\Respect\Validation\Exceptions\NestedValidationExceptionInterface $ex){ echo '<pre>'; $arr = array( 'alnum'=>'Пользовательское сообщение 1', 'noWhitespace'=>'Пользовательское сообщение 2', 'length'=>'Пользовательское сообщение 3' ); print_r($ex->findMessages($arr)); echo ' |
’;
exit();
}
На этом данный урок заверен. Всего Вам доброго и удачного кодирования!!!
Комментарии (1)