Основы валидации

Комментарии: 8  Просмотры: 24 796

Валидация данных является весьма часто используемой процедурой. Ведь если на сайте есть возможность получать данные от пользователей, т.е. существует хотя бы одна форма ввода, то эти данные обязательно нужно проверять на соответствие определенным критериям. В принципе можно использовать собственные проверки, но чтобы упростить задачу и сделать это рутинное занятие легким и приятным, Кохана предоставляет специальный класс Validation. В класс уже встроены некоторые стандартные правила вроде проверки на пустую строку, длину строки, правильность ввода e-mail итд. И хотя они в подавляющем большинстве случаев удовлетворяют всем основным потребностям, ничто не мешает вам добавить свои собственные правила.
Давайте перейдем к примерам и вы увидите, как все просто. Допустим у нас на сайте есть форма с двумя полями: именем пользователя и его e-mail-ом. При отправке формы нам нужно проверить, чтобы поле с именем было заполнено, т.е. не было пустым, а также проверить валидность электронной почты. Поскольку отправленные данные попадают в массив $_POST, его мы и будем проверять.
Если проверять форму как обычно, можно написать примерно следующее:

$user = Arr::get($_POST, 'user');
$user = trim($user);
 
if(UTF8::strlen($user))
    // Все хорошо
else
    // Пустое имя

А для проверки электронной почты вообще понадобится регулярное выражение. Что-то вроде

if (preg_match("/^([a-z0-9_\.\-]{1,20})@([a-z0-9\.\-]{1,20})\.([a-z]{2,4})/is",$email))
...

Ужас. А теперь тоже самое, но с использованием валидатора. Для начала нужно создать объект класса Validation. Делается это двумя способами.
Через конструктор:

$post = new Validation($_POST);

Или через фабрику объектов:

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

В обоих случаях мы должны передать массив, который хотим проверить. А теперь напишем сами правила валидации.

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

Метод rule принимает три параметра. Первый параметр — это имя поля (ключ массива). Если здесь указать TRUE, то правило будет применено для всех полей. Мы вполне можем переписать наш код вот так:

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

Второй параметр — это правило валидации. В нашем коде два стандартных правила. А вообще в Кохане их более двадцати. Третий параметр — необязательный массив параметров для правила валидации. Например, если нам нужно запретить пароли, которые короче восьми символов, т.е. проверить длину поля, то третьим параметром как раз-таки и будет передаваться массив со значением этой минимальной длины.
Следующий шаг — проверка выполнения правил валидации. Она делается следующим образом:

if($post -> check())
    // Все хорошо
else
    // Кажется что-то случилось

И последний шаг — это получение ошибок в случае заполнения формы данными, не удовлетворяющими правилам валидации:

$errors = $post -> errors();

При таком вызове без аргументов в $errors попадет массив ошибок вида:

Array
(
    [email] => Array
        (
            [0] => email
            [1] => Array
                (
                    [0] => email.mail.ru
                )
 
        )
 
    [user] => Array
        (
            [0] => not_empty
            [1] => Array
                (
                    [0] => 
                )
 
        )
)

Т.е. мы видим названия полей, не прошедших валидацию, которые в свою очередь содержат название правила, которое не сработало (индекс 0) и некоторые дополнительные параметры (индекс 1), например неправильный email — адрес. Этих данных вполне достаточно, чтобы выводить сообщения об ошибках красиво, но об этом позже. А сейчас давайте посмотрим, что у нас в итоге получилось:

$post = Validation::factory($_POST);
 
$post -> rule(TRUE, 'not_empty')
      -> rule('email', 'email');
 
if($post -> check())
    // Все хорошо
else
{
    // Кажется что-то случилось
    $errors = $post -> errors();
    ...
}

Вы можете задать закономерный вопрос, а зачем я организую проверку на пустое значение email, если имеется проверка на валидность написания этого самого email. Все дело в том, что если поле пустое, то оно будет обработано только для двух стандартных правил. Это not_empty (проверка на пустоту) и matches (проверка на соответствие). В официальном мануале Коханы так и написано:

not_empty and matches are the only rules that will run on empty fields and add errors by returning FALSE.

Так что имейте это ввиду. В следующих уроках мы рассмотрим все более подробно. Удачи.

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


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

А где правильнее валидацию проводить — прямо в текущем контроллере или создавать модель?

Разные мнения слышал на этот счет. Делают и так, и эдак.

Может перед валидацией нужно trim делать?

Желательно. Иначе насколько я знаю проверка not_empty не сработает на несколько пробелов.

Наверное сразу нужен урок по хелперу FORM, потому как лейблы полей похоже только через него можно передавать.

Хорошее подспорье:
http://kohanaframework.org/3.2/guide/kohana/security/validation

С примерами, кстати

Перевел бы еще кто :)
В комментах к методам тоже кстати много примеров.

Помогите разобраться с Callback… Как следующий код модели для версии 3.0 нужно написать в 3.2??

public function validate_update($array)
{
$array = Validate::factory($array)
->rule(‘username’, $this->_rules['username'])
->rule(‘email’, $this->_rules['email']);
foreach($this->_callbacks as $key => $value)
{
$array->callback($key, array($this, $value));
}
return $array;
}



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

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