Kohana 3.2. Валидация

kohana Когда-то я уже писал про это но те времена явно утекли, Кохана поменялась, поменялись и мои предпочтения. Вы, наверное, скажете мне, сети полно хороших мануалов по валидации, но я не успокоюсь, пока не напишу свой, в качестве шпаргалки.

Прежде чем буду описывать — оговорюсь. Я сторонник того, чтобы описывать всю валидацию в модели ORM. Религия у меня такая. Поэтому …

Делаем раз
============================
Описываем правила. Просто добавляем в модель два метода rules и labels.

Вот простой пример:

public function rules()
  {
    return array(
      'title' => array(
        array('not_empty'),
      ),
    );
  }

  public function labels()
  {
    return array(
      'title' => "Заголовок",
    );
  }

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

В общем-то дело почти сделано. При сохранении объекта теперь всегда будет выполняться проверка.

Делаем два
=======================
Проверка выполняется всегда при сохранении объекта. Если нужно просто проверить без сохранения, можно использовать метод check. К сожалению ошибки валидации будут вылетать как ошибки, которые нужно будет отлавливать.

Вот пример кода из контроллера:

try{
//	$page->save();
	$page->check();
}
catch(Exception $e)
{
	$errors = $e->errors('validation');
	foreach ($errors as $error){
	    echo "Ошибка: ". $error;
	}
}

Никогда не любил использовать try , но куда деваться, очень уж хочу использовать именно штатную валидацию из ORM.

Какие можно делать правила
========================
Все правила — это суть методы объекта Kohana_Valid и вы сможете их найти в файле /system/classes/kohana/valid.php. Смысл большинства из них очевиден из названий для каждого, кто дружит с великим и могучим английским языком.

Некоторые правила просты и не требуют использования аргументов. Например правило not_empty и email

public function rules()
  {
    return array(
      'email' => array(
        array('not_empty'),
        array('email'),
      ),
    );
  }

Некоторые требуют одного или более аргументов. Например exact_length требует 2, собственно значение поля и желаемая длина (строки).

public function rules()
  {
    return array(
      'some_field' => array(
        array('exact_length' , array(':value', 5)),
      ),
    );
  }

Если не хватает стандартных, то можно написать своё правило. Только лучше оформить его в виде функции и хранить в этой же модели.

public function rules()
  {
    return array(
      'some_field' => array(
        array( array($this,'check_something') , array(':value')),
      ),
    );
  }
public function check_something($value)
{
// тут может быть какая угодно сложная логика
....................
return (bool) $blablabla;
}

Однако не торопитесь сразу создавать функцию. Пробегитесь по базовому классу ORM. Он имеет довольно большие возможности. Например, для проверки уникальности поля можно использовать уже готовый метод unique. Вот пример проверки email на валидность, непустоту и уникальность:

public function rules()
{
  return array(
    'email' => array(
      array('not_empty'),
      array('email'),
      array(array($this, 'unique'), array('email', ':value')),
    ),
}

Делаем три
============================
Если вы добавляли свои правила — не забудьте добавить какие-нибудь соответствующее описание в /application/messages/validation.php

Ссылки по теме
============================
Kohana 101 от Броткина Ивана — тут замечательно расписана валидация, каждая функция разобрана по косточкам. Заходите и читайте.