MyTetra Share
Делитесь знаниями!
Валидация в Kohana 3.2
Время создания: 07.10.2011 14:16
Автор: xintrea
Текстовые метки: kohana, validation, перевод
Раздел: Компьютер - Программирование - Язык PHP - Kohana
Запись: xintrea/mytetra_syncro/master/base/13179825867m1r2d00sn/text.html на raw.github.com

Валидация в Kohana осуществляется с помощью класса-валидатора, который обрабатывает ассоциативные массивы ключ=>значение. Например, через валидатор можно проверить следущий массив:

$a=array{ 'name' => 'Vasya',

'age' => 25,

'city' => 'Urupinsk' };

В терминах валидатора, ключ - это поле. Соответсвующее ключу значение - это значение поля.

Через валидатор невозможно проверить одну отдельную переменную. Чтобы проверить содержимое одной переменной, придется сделать временный массив с полем, содержащим значение переменной.

В валидаторе для каждого поля задаются правила, по которым эти поля надо проверять. В качестве названия поля можно использовать значение TRUE, тогда правило будет проверять значения всех полей.

После задания всех правил, дается команда проверки, которая проверит все поля, и в случае если все проверки прошли нормально, возвратит истину, иначе ложь.

Для повышения безопасности, объект Validate удалит из массива все поля, которые не подвергались валидации. Считается, что поле было провалидировано, если ему был присвоен ярлык, применён фильтр, правило или функция обратного вызова. Это предотвращает доступ к полям, которые небыли подвергнуты валидации.

Создание валидатора

Объект-валидатор можно создать используя метод Validation::factory. В качестве параметра передается проверяемый массив.

$postValidator = Validation::factory($_POST);

В данном приемере $_POST -это массив данных, переданных через механизм POST. Далее в примерах будет показано, как валидировать данные, передаваемые при регистрации нового пользователя в какой-то абстрактной веб-системе.

Указание ярлыков

Ярлык (label) - это удобочитаемая интерпретация имени поля. Назначить полю ярлык можно с помощью метода label():

$postValidator->label('name', 'username')

Установка ярлыка - это просто установка псевдонима имени поля. После установки ярлыка, в последующих командах можно вместо имени поля писать название ярлыка.

Добавление правил

При создании проверочных правил необходимо задать имя проверяемого поля, метод проверки (или 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)

{

// Проверка, существет ли уже в базе данных

// указанное имя пользователя

return ! DB::select(array(DB::expr('COUNT(username)'), 'total'))

->from('users')

->where('username', '=', $username)

->execute()

->get('total');

}

Так же в этом разделе:
 
MyTetra Share v.0.59
Яндекс индекс цитирования