Стандартные правила валидации — Часть 1

Комментарии: 18  Просмотры: 21 737

В прошлом уроке по основам валидации я уже говорил, что в Кохане уже есть большая часть правил, которые могут понадобиться при проверке каких-то данных. Все эти правила представлены в классе Valid, который в случае чего всегда можно расширить или изменить, и реализованы в виде статических методов. Об этих стандартных правилах мы сейчас и поговорим, чтобы вы случайно не стали «изобретать велосипед».

Правило not_empty проверяет переданное значение на пустоту, причем это может быть не только пустая строка, но и пустой массив.

$valid->rule('email', 'not_empty');

Правило regex проверяет строку на соответствие регулярному выражению. Например, проверка на правильный ввод url-адреса (впрочем, такое правило уже есть отдельно).

$post->rule('url', 'regex', array(':value', '/^((https?|ftp)\:\/\/)?([a-z0-9]{1,})([a-z0-9-.]*)\.([a-z]{2,4})$/'));

Правило min_length организует проверку на минимальную длину строки. Например, длина пароля не меньше 8 символов.

$post->rule('password', 'min_length', array(':value', 8));

Правило max_length аналогично предыдущему, только теперь организуется проверка на максимальную длину строки. Например, длина пароля не больше 8 символов.

$post->rule('password', 'max_length', array(':value', 8));

Правило exact_length проверяет длину строки на соответствие четко обозначенной длине. Например, длина пароля только 8 символов.

$post->rule('password', 'exact_length', array(':value', 8));

Обратите внимание, что можно указать несколько вариантов длины строки. Например, длина пароля 6, 7 или 8 символов.

$post->rule('password', 'exact_length', array(':value', array(6,7,8)));

Правило equals проверяет точное совпадение передаваемого значения с каким-то указанным нами значением. Не знаю, где это может понадобиться, но допустим для какой-то полукапчи. На вопрос «Название нашей планеты на английском» будет принято только слово «earth».

$post->rule('answer', 'equals', array(':value', 'earth'));

Правило email проверяет строку на правильность написания в качестве адреса электронной почты.

$post->rule('email', 'email');

Правило email_domain проверяет существование MX-записи для введенной электронной почты. Защищает от ввода электронных адресов «от балды».

$post->rule('email', 'email_domain');

Правило url проверяет строку на правильность написания в качестве URL-адреса. По сути тоже самое правило, что мы написали выше с помощью регулярного выражения, но более «красивое». В комментариях на блогах частенько можно увидеть поле «Мой сайт». Вот там этому правилу самое место.

$post->rule('my_site', 'url');

Правило ip проверяет строку на правильность написания в качестве IP-адреса.

$post->rule('ip', 'ip');

Правило credit_card проверяет, является ли переданное значение — номером кредитной карты. Можно указать также и типы проверяемых кредитных карт. Их список с параметрами (префиксы, длина номера, вычисление контрольной цифры по «алгоритму Луна») находится в конфигурационном файле system/config/credit_cards.php. Совершенно незаменимое правило для магазинов со способами оплаты с помощью кредитных карт.

$post->rule('my_card', 'credit_card', array(':value', array('american express','visa')));

Правило luhn редко используется отдельно (т.к. оно уже включено в правило «credit_card»). Это правило позволяет проверить переданное число с помощью «Алгоритма Луна». Данный алгоритм делает дополнительную проверку правильности ввода кредитной карты. Например, если и префикс, и количество цифр соответствуют действительности, но в какой-то из цифр случайно сделана ошибка, такой номер будет признан невалидным.

$post->rule('my_card', 'luhn');

Это примерно половина всех стандартных правил. Как видите их довольно много и оставшуюся часть мы рассмотрим в следующем уроке.

<< Назад | Вперед >> | Обсудить на форуме

Смотрите на сайте лазерная резка фанеры.

К записи оставлено 18 коммент.

Сделайте пожалуйста вывод дыты публикации статей на блоге!

Что конкретно, я не понял ?
Даты десяти последних статей указаны в «Последних обновлениях». В самих статьях не вижу смысла указывать, т.к. все идет вразброс.
Или даты, когда планируется следующая статья ? Примерно раз в неделю выходит. Вторая часть правил уже почти написана.

Я вчера в первые нашел Ваш сайт, читаю статии по левому меню! И при этом я не знаю когда была написана информация! Свежая она или нет!

Вся информация относится к версии КОханы 3.2.0. Нужно читать по порядку. Дата смысла не имеет, т.к. я могу прыгать. Добавить статью в документацию, потом в модули, потом в уроки.

Ну это понятно! Но все же дата написания статии имеет свою роль в каждом блоге!

А это фактически и не блог. Здесь нет такого, что добавил статью -она вывелась сверху на главной странице. Здесь имеет смысл читать уроки по ссылкам по порядку — сверху вниз.

Можно посмотреть на даты комментариев и примерно определить «свежесть».

Черным по белому ведь написано….

«Вся информация относится к версии КОханы 3.2.0.»

$post-&gt;rule('email', 'email_domain');
/*
использует
http://php.su/functions/?f=checkdnsrr
Примечание: Эта функция не реализована для платформ Windows.
*/

Также нововедённую кириллицу в доменах не кушает.
вася_пупкин@мыло.рф

Подскажите можно ли стандартными средствами или правилами валидации проверить чтобы пароль не совпадал с логином.
Правила «not_matches» вроде нету.

Напишите свое правило. Тем более оно будет очень простое.

«Не знаю, где это может понадобиться, но допустим для какой-то полукапчи.»

Думаю правило equals очень удобно использовать для сравнения информации между исходным полем и полем-подтверждением. Например для поля «Повторите пароль» или «Email еще раз», просто подставить переменную.

Такой вопрос, а есть ли какой-то метод, который выводил бы сообщение типа «Форма заполнена верна, данные внесены в БД»?

Подскажите, почему не работает правило not_empty для поля captcha?

Код:
public function action_registration() // экшн регистрации
{
$data = array();
if (HTTP_Request::POST == $this->request->method())
{
try {

// производим проверку всех полей
$object = Validation::factory($this->request->post());
$object
->rule(‘username’, ‘not_empty’)
->rule(‘username’, ‘min_length’, array(‘:value’, ’4′))
->rule(‘password’, ‘not_empty’)
->rule(‘password’, ‘min_length’, array(‘:value’, ’5′))
->rule(‘email’, ‘email’)
->rule(‘captcha’, ‘not_empty’);
// ->rule(‘captcha’, ‘Captcha::valid’);
$user = ORM::factory(‘User’) // если проверка пройдена — регистрируем
->set(‘email’, $this->request->post(‘email’))
->set(‘username’, $this->request->post(‘username’))
->set(‘password’, $this->request->post(‘password’))
->save();

// даем новому пользователю роль для логина
$user->add(‘roles’, ORM::factory(‘Role’, array(‘name’ => ‘login’)));

// очищаем массив с POST
$_POST = array();

$to = $this->request->post(‘email’);
$subject = Kohana::message(‘account’, ‘email.themes.registration’);
$from = Kohana::message(‘account’, ‘email.from’);
$message = ‘Вы успешно зарегистрировались с паролем — ‘.$this->request->post(‘password’);
Email::send($to, $from, $subject, $message, $html = false); // отправляем пользователю сообщение с его паролем

Auth::instance()->force_login($user); // сразу же авторизуем его, без ввода логина и пароля
HTTP::redirect(‘/account/’);

} catch (ORM_Validation_Exception $e) {

// если во время валидации возникли ошибки
$data['messageReg'] = Kohana::message(‘account’, ‘errorReg’);
$data['errors']=$e->errors(‘models’);
// берем значения ошибок из файла /application/messages/model/user.php
}
}

В массиве пост присутсвует поле captcha со значением string(0) «»

И еще вы кажется обещали написать как создать собственное правило валидации!! Спасибо за ответ

Точнее валидация работает, если использовать метод check(), но в блок catch ошибка не попадает.

«Этих данных вполне достаточно, чтобы выводить сообщения об ошибках красиво, но об этом позже»

позже так и не наступило..

Понаходил ответы. Жаль нельзя удалять свои коменты



Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.