Штатная валидация в Kohana3

kohanaНедавно разобрался со стандарной библиотекой валидации форм фреймворка Kohana3. Это оказалось не совсем тривиально, и уж точно не так как в CodeIgniter. По Kohana2 имелась достаточно хорошая документация, но поскольку многое изменилось — изучать её новичку не имеет смысла. По Ko3 мануал тоже есть, но на данный момент явно не совсем полный и писанный на коленке. Или я не умею читать?

Вот что у меня в конце концов получилось (Проверялось на версии 3.0.4.1):

Краткий обзор объекта Validate
========================
Объект Validate содержит много всяких методов и свойств, но главные свойства, отвечающие за информацию о проверяемых полях следующие:

  • labels — человекопонятные названия полей. Очень приятно, когда пользователю выводится ошибка понятная простому человеку.
  • filters — предварительная обработка полей перед проверкой на правила. Можно подставлять обыкновеные PHP-функции. Обычно сюда ставят TRIM.
  • rules — собственно правила. Список возможных правил можно посмотреть в официальной документации
  • callbacks — массив, в который можно добавить свою обработку, если не хватает возможностей filters и rules. Эта процедура будет иметь полный доступ к свойствам объекта Validate и помимо хитрой обработки сама должна генерировать сообщения об ошибках. Подробно не изучал, врать не буду

Для добавления вышеописанных сущностей используются функции label(), filter(), rule(), callback(). Пример использования будет ниже.

Для собственно проверки используется метод check(), которая возвращает логический результат.

Функция errors() по замыслу возвращает массив строк с ошибками, произошедшими при проверке. Если указать в качестве аргумента имя файла со специфичными для нашей проверки сообщениями (должно находиться в папке application/messages) то библиотека попытается считать этот файл. Если не указывать имя файла — будет возвращён массив с правилами, в которых произошла ошибка.

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

Чтобы русифицировать штатные сообщения можно создать свой файл application/messages/validate.php примерно следующего содержания:

 'Поле :field не должно быть пустым',
	'matches'      => 'Поле :field должно совпадать с полем :param1',
	'regex'        => 'Поле :field не соответствует необходимому формату',
	'exact_length' => 'Поле :field должно иметь длину :param1 символов',
	'min_length'   => 'Поле :field должно иметь длину как минимум :param1 символов',
	'max_length'   => 'Поле :field должно быть в длину не более чем :param1 символов',
	'in_array'     => 'Поле :field должно быть одной из возможных опций',
	'digit'        => 'Поле :field должно цифрой',
	'decimal'      => 'Поле :field должно быть десятичным числом с :param1 знаками',
	'range'        => 'Поле :field должно быть в диапазоне от :param1 до :param2',
	'email'        => 'Поле :field должно содержать реальный e-mail',
);

Пример валидации
========================
Например мы делаем форму восстановления пароля и отправки его на почту

public function action_passwordrecovery()
{
    $post = Validate::factory($_POST)
          ->label('email','E-mail')    // Название поля

          ->filter(email, 'trim')       // Перед проверкой правил выполняем действие trim

          ->rule('email', 'not_empty')   // Поле email не должно быть пустым
          ->rule('email', 'email');         // Поле email должно содержать валидный адрес

    if ($post->check()) {
          // Проверка прошла успешно, выполняем нужное действие
          echo "Ваш email: ".$post->email;
    }else{
          $data['errors']=$post->errors('');
          // Получаем массив строк с ошибками. 
          // Обратите внимание на аргумент ;) 
          $this->template->content = new View('passwordrecovery',$data);
          // Подключаем вьюс в котором разворачиваем и выводим массив $errors
    }

В догонку
========================
В примере выше показана проверка данных присылаемых формой. Но таким же образом можно организовать валидацию любого массива в любом месте. Многие делают валидацию в моделях ORM. Такой подход позволяет делать одну стандартную проверку на несколько различных действий с данными, такими как добавление, изменение и прочее, что только можно себе представить.

Ссылки
========================

Штатная валидация в Kohana3: 2 комментария

  1. Chodex

    А что касается полей не обязательных для заполнения, но в тоже время требующих валидации? А вообще подробнее всего и с примерами про валидацию полей написано здесь http://kerkness.ca/wiki/doku.php?id=validation

Комментарии запрещены.