Введение
Валидация в Kohana 3.x осуществляется с помощью класса-валидатора, который обрабатывает ассоциативные массивы ключ=>значение. Например, через валидатор можно проверить следущий массив:
$a=array{ 'name' => 'Vasya',
'age' => 25,
'city' => 'Urupinsk' };
В терминах валидатора, ключ - это поле. Соответствующее ключу значение - это значение поля.
Через валидатор невозможно проверить одну отдельную переменную. Чтобы проверить содержимое одной переменной, придется сделать временный массив с полем, содержащим значение переменной.
В валидаторе для каждого поля задаются правила, по которым эти поля надо проверять. В качестве названия поля можно использовать значение TRUE, тогда правило будет проверять все поля.
После задания правил, дается команда проверки, которая проверит поля, и в случае если все проверки прошли нормально, возвратит истину, иначе ложь.
При валидации, для повышения безопасности, удаляются все поля, которые не подвергались валидации. Считается, что поле было провалидировано, если ему был присвоен ярлык, применён фильтр, правило или функция обратного вызова. Это предотвращает доступ к полям, которые небыли подвергнуты валидации.
Создание валидатора
Объект-валидатор можно создать используя метод Validation::factory. В качестве параметра передается проверяемый массив:
$postValidator = Validation::factory($_POST);
В данном примере $_POST -это массив данных, переданных через механизм POST. Далее в примерах будет показано, как валидировать данные, передаваемые при регистрации нового пользователя в какой-то абстрактной веб-системе.
Указание ярлыков
Ярлык (label) - это удобочитаемая интерпретация имени поля. Назначить полю ярлык можно с помощью метода label():
$postValidator->label('name', 'имя пользователя');
Установка ярлыка - это просто установка псевдонима имени поля. Например, для поля name можно установить заголовок «имя пользователя». Этот заголовок потом может использоваться в сообщениях об ошибке (например, «Вы не указали имя пользователя»).
Добавление правил
При создании проверочных правил необходимо задать имя проверяемого поля, метод проверки (или call-back функцию, которая осуществляет проверку), и массив параметров:
$postValidator->rule(<имя_поля>,
<проверяющий_метод>,
array(<параметр1>, <параметр2>, ...));
Если параметры не указывать, значение поля будет напрямую передано в проверяющий метод.
В качестве параметра можно использовать макроподстановку ':value', которая равна значению поля. Например, два следующих правила эквивалентны:
$postValidator->rule('name', 'not_empty');
$postValidator->rule('name', 'not_empty', array(':value'));
Проверочный метод можно задавать разными способами. Следующие три правила эквивалентны:
$postValidator->rule('number', 'phone');
$postValidator->rule('number', array('Valid', 'phone'));
$postValidator->rule('number', 'Valid::phone');
Фильтрация
Если параметры не указывать, значение поля будет напрямую передано в проверяющий метод.
Класс Validate предоставляет возможность задать функцию, которая будет предварительно обрабатывать значение поля. Эта функция-фильтр видоизменяет значение поля. Фильтр срабатывает перед применением проверочных правил.
Установка функции-фильтра производится с помощью метода filter().
Например, если нужно во всех полях убрать начальные и конечные пробелы, можно воспользоваться следующим кодом:
// Применяем фильтр на все поля
$validate->filter(TRUE, 'trim');
Первый параметр TRUE говорит о том, что нужно обрабатывать не отдельное поле, а все поля. Второй параметр 'trim' задает метод обработки - в данном случае это будет PHP-функция trim().
Запуск на проверку
Проверка выполняется с помощью метода check():
$postValidator->check()
Этот метод нужно запускать после прописывания правил, фильтров и ярлыков. Данный метод вернет FALSE, если были найдены какие-то ошибки, и TRUE, если ошибок небыло.
Стандартные проверки
Валидатор в Kohana проверяет значения массива с помощью правил, доступных в классе Valid.
Valid::not_empty
|
Значение должно быть непустым
|
Valid::regex
|
Значение должно удовлетворять регулярному выражению
|
Valid::min_length
|
Минимально допустимое количество символов в значения
|
Valid::max_length
|
Максимально допустимое количество символов в значения
|
Valid::exact_length
|
Значение должно содержать указанное количество символов
|
Valid::email
|
Значение должно содержать email-адрес
|
Valid::email_domain
|
Проверка наличия домена, указанного в строке с email адресом
|
Valid::url
|
Значение должно содержать правильно оформленный URL
|
Valid::ip
|
Значение должно содержать допустимый IP - адрес
|
Valid::phone
|
Значение должно содержать телефонный номер
|
Valid::credit_card
|
Значение должно содержать номер кредитной карточки
|
Valid::date
|
Значение должно содержать дату (и время)
|
Valid::alpha
|
Значение может содержать только символы букв
|
Valid::alpha_dash
|
Значение может содержать только символы букв и тире
|
Valid::alpha_numeric
|
Значение может содержать только буквы и цифры
|
Valid::digit
|
Значение может содержать только целое число
|
Valid::decimal
|
Значение должно быть десятичным числом или значением с плавающей точкой
|
Valid::numeric
|
Значение может содержать только символы цифр
|
Valid::range
|
Значение должно находиться в пределах указанного диапазона
|
Valid::color
|
Значение должно содержать цвет в HEX представлении
|
Valid::matches
|
Значение сравнивается со значением другого поля
|
Пример
Сделаем валидацию данных, находящихся в массиве $_POST, который содержит информацию, вводимую пользователем при регистрации в какой-то веб-службе. Вначале нужно создать объект-валидатор, передав ему в качестве параметра проверяемый массив $_POST:
$validator = Validation::factory($_POST);
Затем зададим такие правила:
$validator->rule('username', 'not_empty');
$validator->rule('username', 'regex', array(':value', '/^[a-z_.]++$/iD'));
$validator->rule('password', 'not_empty');
$validator->rule('password', 'min_length', array(':value', '6'));
$validator->rule('confirm', 'matches', array(':validation', 'confirm', 'password'));
$validator->rule('use_ssl', 'not_empty');
В качестве проверочного метода можно использовать не только проверки, поддерживаемые классом Valid, но и любую существующую PHP-функцию. Например, можно добавить такое правило:
$validator->rule('use_ssl', 'in_array', array(':value', array('yes', 'no')));
Указав в качестве проверочного метода 'in_array', мы просто используем PHP-функцию in_array() для проверки значения. В качестве первого параметра функции in_array() мы передаем значение поля 'use_ssl', используя макроподстановку ':value'. В качестве второго параметра передаем массив допустимых значений, как того требует функция in_array().
В качестве проверочного метода можно использовать любую написанную нами функцию, главное чтобы она была в области видимости. Прощще всего это сделать, описав функцию в глобальном пространстве.
В качестве проверочного метода можно использовать метод любого класса. Вот как это делается:
$validator->rule('username', 'User_Model::unique_username');
Здесь User_Model - это имя класса (необязательно должен быть класс модели, класс может быть любым, хотя обычно это все-таки модель). unique_username - это имя метода класса User_Model. Данный метод может быть описан примерно так:
public static function unique_username($username)
{
// Проверка, существет ли уже в базе данных
// указанное имnbsp;
return ! DB::select(array(DB::expr('COUNT(username)'), 'total'))
->from('users')
->where('username', '=', $username)
->execute()
->get('total');
}
На этом всё.
PS:
Официальное описание класса Validation можно найти на сайте Kohana здесь: http://kohanaframework.org/3.2/guide/kohana/security/validation.