Валидация

Функция валидации позволяет реализовать в приложении мощную и в то же время простую проверку информацию на правильность (валидность). Обычно этой информацией являются введенные пользователем данные: форма при регистрации, текст комментария, обратная связь. Kohana предоставляет класс Validation, который позволяет реализовать такую проверку.

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

Принцип работы
Валидация проводится над массивом данных, к каждому элементу которого может применяться правило — функция, определяющая, проходит ли поле проверку или нет. Например, при регистрации, для поля email мы можем применить правило email_unique, которая определит, не зарегистрирован ли уже в системе пользователь с таким email? Kohana содержит множество встроенных правил, как, например, проверка на длину поля или правильность email-адреса, но некоторые правила придется писать самостоятельно.

Для каждого поля можно установить заголовок (label), например, для поля username можно установить заголовок «Имя пользователя». Этот заголовок потом может использоваться для создания сообщения об ошибке (Например, «Пожалуйста, укажите Имя пользователя»).

При запуске валидации, если какое-то поле не проходит проверку, то функция возвращает FALSE, а вам становится доступен массив со списком ошибок, который можно красиво показать пользователю.

Использование
Для создания валидации нужно использовать метод Validation::factory($array), где $array — массив данных для проверки:

$validation = Validation::factory($_POST);
После создания экземпляра объекта валидации, вы можете обращаться к нему как к массиву, чтобы получить данные:

$validation = Validation::factory($_POST);
echo $validation[‘username’];
Изменять после создания вы их не сможете.

Правила
Для добавления правил используются методы rule($field, $rule, $params) — для добавления одного правила, и rules($field, $rules) — для добавления нескольких правил для одного поля. рассмотрим список передаваемых параметров:

$field — название поля, к которому будет применяться правило.
$rule — правило для поля. Может установлено одним из следующих способов:
Название метода класса Valid, который предоставляется Kohana и содержит большое количество встроенных правил, например, not_empty.
Название функции php, например in_array().
Название статического метода любого другого класса, например, Model_Category::check_id.
Массив, состоящий из экземпляра объекта и названия его метода, например, array($this, ‘check_id’).
Лямбда-функция php.
$param — массив параметров, которые будут переданы правилу как аргументы функции. Можно передать какие угодно значения, для автозамены доступны следующие:
:value — значение проверяемого поля (передается по умолчанию),
:field — название текущего поля,
:data — массив всех данных для текущей валидации,
:validation — текущий объект валидации.
Пример добавления правила, которое проверяет, чтобы поле username не было пустым (not_empty — встроенный метод Kohana класса Valid):

$validation->rule(‘username’, ‘not_empty’);
Пример передачи параметров функции php in_array():

$validation->rule(‘sex’, ‘in_array’, array(‘:value’, array(‘male’, ‘female’)));
Передача массива правил для поля:

$validation->rules(‘username’, array(
array(‘not_empty’),
array(‘min_length’, array(‘:value’, 3)),
));

Обратите внимание, если поле пустое, то никакое правило не вызовет для него ошибки, хоть и будет запущено. Таким образом, можно создавать «необязательные поля», которые будут проверяться, только если они заполнены. Чтобы сделать поле обязательным, необходимо добавить для него правило not_empty, которое сгенерирует ошибку, если оно пустое.

Пример создания обязательных и необязательных полей:

$validation = Validation::factory($_POST)
->rule(’email’, ‘not_empty’)
->rule(’email’, ’email’)
->rule(‘country’, ‘Model_Country::country_exists’);
Поле email — обязательное и проверка пройдет только если это действительно email, а вот поле country можно не указывать, но если же все-таки указать, то оно будет проверено методом Model_Country::country_exists.

Параметры
Класс валидации поддерживает привязку параметров, которые потом могут передаваться правилам. Привязка происходит через метод bind($key, $value), где $key — название параметра, $value — его значение:

$validation->bind(‘:roles’, $roles);
Также можно передать сразу массив параметров:

$validation->bind(array(
‘:roles’ => $roles,
‘:token’ => $this->get_token(),
));
После привязки параметров, они становятся доступны при добавлении правил:

$validation->bind(‘:db’, $this->db)
->rule(’email’, ’email_unique’, array(‘:value’, ‘:db’));
Заголовки
Если вы собираетесь генерировать сообщения об ошибках, скорее всего вам понадобятся заголовки. Чтобы установить заголовок, используйте метод label($field, $label):

$validation->label(‘username’, ‘Имя пользователя’);
Чтобы установить сразу несколько заголовков для нескольких полей, используйте метод labels($labels):

$validation->labels(array(
‘username’ => ‘Имя пользователя’,
‘password’ => ‘Пароль’,
));
Запуск

Если у вас включено профилирование, то класс валидации будет подсчитывать время выполнения каждого запуска.

Запуск проверки происходит через метод check(), который в случае успешной проверки возвратит TRUE, иначе — FALSE:

$status = $validation->check();
Получение ошибок
Если запуск валидации возвратил FALSE, значит проверка не прошла. После этого, вы можете получить список ошибок через метод errors($file, $translate), опционально вы можете указать слпедующие параметры:

$file (опционально) — файл сообщений, который будет использоваться для создания понятных человеку сообщений об ошибке.
$translate (опционально) — переводить ли сообщения через I18N? Установите в TRUE, чтобы переводить на текущий язык, либо передайте название языка, чтобы принудительно переводить на него.
if( !$validation->check())
{
$errors = $validation->errors(‘validation’);
}
В этом случае, файл сообщения будет искаться в /messages/validation.php. Покажем пример такого файла:

return array
(
‘not_empty’ => ‘:field не должно быть пустым’,
);
В данном случае, любое поле, которое не проходит правило not_empty будет содержать ошибку «:field не должно быть пустым», например, «Имя пользователя не должно быть пустым».

Также возможна и следующая структура, позволяющая для каждого поля установить свои сообщения об ошибках:

return array
(
‘username’ => array
(
‘not_empty’ => ‘Пожалуйста, введите свое имя’,
),
);
Если для любой ошибки поля нужно выдавать одинаковое сообщение, то используйте структуру:

return array
(
‘username’ => array
(
‘default’ => ‘Имя пользователя заполнено с ошибками’,
)
);
Составление собственных правил
Правилом может являться любая функция либо метод. Считается, что правило прошло проверку, если возвращен результат, отличный от FALSE. Пример составления правила:

// Добавление правила в валидацию
$validation->rule(‘field’, ‘Model_Tools::check_dog_name’);

// Само правило
public static function some_rule($value)
{
return $value == ‘Bob’;
}
После запуска валидации, будет сгенерирована ошибка, если поле field не будет равно Bob.

Обратите внимание, если значение поле пустое, то правило будет запущено, но даже если оно возвратит FALSE, то ошибки не возникнет. Чтобы добавить ошибку для пустого поля, необходимо использовать метод error().

Добавление ошибок
Иногда требуется, чтобы одно правило могло возвращать разные ошибки. Чтобы добавить ошибку из правила, нужно для текущего объекта Validation вызвать метод error($field, $error, $params), где $field — название поля, $field — ошибка и $params — массив параметров, использующийся при генерации сообщения. Пример добавления ошибки:

// Обратите внимание, что в параметры правила также необходимо передавать
// текущий объект валидации и название поля
$validation->rule(‘field’, ‘Model_Tools::check_dog_name’, array(‘:value’, ‘:validation’, ‘:field’));

public static function some_rule($value, $validation, $field)
{
if($name == ‘Meaow’)
{
$validation->error($field, ‘Dog name, not cat!’);
}

// …
}
Встроенные правила
Kohana предоставляет некоторые встроенные правила через методы класса Valid.

Использование
Чтобы использовать встроенное правило из класса Valid, достаточно просто написать название метода класса:

$validation->rule(‘password’, ‘min_length’, array(‘:value’, 6);
В результате, сработает метод Valid::min_length($password, 6).

Список правил
Ниже приведен список встроенных правил.

alpha($str, $utf8) — определяет, состоит ли строка $str только из символов алфавита. Установите $utf-8 в TRUE для совместимости с UTF-8.
alpha_dash($str, $utf8) — определяет, состоит ли строка $str из символов алфавита, цифр, знаков подчеркивания _ и дефисов -. Установите $utf-8 в TRUE для совместимости с UTF-8.
alpha_numeric($str, $utf8) — определяет, состоит ли строка $str только из символов алфавита и цифр. Установите $utf-8 в TRUE для совместимости с UTF-8.
color($str) — определяет, является ли строка $str html-кодом цвета. Например, проверку пройдут следующие значения: #fff, aa00ff, #ff0000.
credit_card($number, $type) — проверяет, является ли число $number номером кредитной карты. Чтобы проверить еще и тип карты, нужно установить параметр $type в одно из следующих значений: american express, diners club, discover, jcb, maestro, mastercard, visa, либо передать массив из нескольких значений. Отредактировать список типов кредитных карт можно в файле config/credit_cards.php.
date($str) — определяет, является ли значение $str датой, которую возможно обработать с помощью функции php strtotime()
decimal($str, $places, $digits) — определяет, является ли строка $str десятичным числом. Опционально, можно указать $places — количество цифр после запятой и $digits — количество цифр до нее.
digit($str, $utf8) — определяет, является ли строка $str целым числом. Установите $utf-8 в TRUE для совместимости с UTF-8.
email($email, $strict) — проверяет значение $email на правильность email-адреса. Опционально, для проверки точного соответствия стандарту RFC 822, установите $strict в TRUE.
email_domain($email) — проверяет MX-записи для домена, указанного в email-адресе $email. Фактически, защищает от заведомо ложных адресов.
equals($value, $required) — проверяет точное совпадение передаваемого значения $value с $required (используется оператор ===)
exact_length($value, $length) — проверяет, совпадает ли длина строки $value с $length, либо хотя бы с одним из элементов $length, если это массив.
ip($ip, $allow_private) — определяет, является ли строка $ip правильным ipv4-адресом. Если $allow_private установить в FALSE, то проверку не пройдут приватные ip-адреса, такие как 192.168.0.0.
luhn($number) — проверяет переданное число $number алгоритмом Луна.
matches($array, $field, $match) — определяет, совпадают ли индексы $field и $match массива $array.
max_length($value, $length) — возвращает FALSE, если длина строки $value больше $length.
min_length($value, $length) — возвращает FALSE, если длина строки $value меньше $length.
not_empty($value) — возвращает FALSE, если переданное значение пусто. Это также относится к пустым массивам, нулевым строкам, булёвым значениям FALSE и пустым объектам типа ArrayObject.
numeric($str) — проверяет, является ли переданная строка числовым представлением (включая дробные и отрицательные числа).
phone($number, $lengths) — проверяет, может ли переданная строка являться телефонным номером. Необязательный параметр $lengths может содержать массив размеров телефонного номера.
range($number, $min, $max) — возвращает TRUE, если число $number больше либо равно $min и меньше либо равно $max.
regex($value, $expression) — проверяет, соответствует ли строка $value регулярному выражению $expression
url($url) — проверяет, является ли переданная строка $url валидным URL-адресом.
Примеры использования
Здесь приведены некоторые примеры использования валидации.

Совпадения паролей
Чтобы не ошибиться при установлении пароля, предлагают ввести его два раза. Пример реализации подобной функции через Kohana:

$validation = Validation::factory($_POST)
->rule(‘password’, ‘not_empty’)
->rule(‘password_confirm’, ‘matches’, array(‘:validation’, ‘:field’, ‘password’)

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *