macmax с форума forum.kohanaframework.org выложил пример использования валидации в Кохане 3.2 (в 3.1 оно работает так же)
/**
* Test controller
*
*/
class Controller_Test extends Controller_Template
{
/**
* @var View page template
*/
public $template = 'test_template';
/**
* @var boolean auto render template
**/
public $auto_render = TRUE;
public function before()
{
parent::before();
$this->template->content = '';
}
public function after()
{
parent::after();
}
/**
* Callback demonstration (Ko3.2.x)
*/
public function action_validation()
{
// данные, которые хотим проверить
$array = array(
'name1' => 'Тру-ля-ля',
'name2' => 'Тра-ля-ля',
'name3' => 'Алиса',
'name4' => 'Ворон',
);
// тут ошибки будут, которые мы покажем позже
$errors1 = $errors2 = NULL;
// класс для демонстрации использования его методов (сам класс ниже)
$testclass = new Testclass;
// класс проверки
$validation = Validation::factory($array)
// RULES
// -- подключение методов класса Valid (только для примера)
// подробнее см. документацию
->rule('name1', 'not_empty')
->rule('name1', 'max_length', array(':value', 250))
/*
важный момент!
внешние правила срабатывают до первой ошибки
если вызванная функция вернула FALSE, то дальнейшая проверка этого ключа массива прекращается.
оставшиеся для этого ключа правила не сработают
для демонстрации этого снова проверяем name1
*/
// -- подключение static методов
// вариант первый:
// имя ключа, для которого правило (первый аргумент)
// запускаем Testclass::static_rule_1() (второй аргумент)
// параметры опущены (третий аргумент). будет передано только значение проверяемого поля
->rule('name1', array('Testclass', 'static_rule_1'))
// вариант второй:
// имя ключа, для которого правило (первый аргумент)
// запускаем Testclass::static_rule_1() (второй аргумент)
// передаем имя поля и его значение (третий аргумент)
->rule('name2', array('Testclass', 'static_rule_1'), array(':field', ':value'))
// вариант третий:
// имя ключа, для которого правило (первый аргумент)
// запускаем Testclass::static_rule_2() (второй аргумент)
// передаем сам класс валидации, имя поля и его значение (третий аргумент)
// ':validation', ':field', ':value' всегда есть в параметрах подстановки, можно использовать также те, что переданы через Validation::bind. например, ORM в :model передает класс модели
// в качестве параметров можно прямо указывать какие-либо значения
->rule('name3', array('Testclass', 'static_rule_2'), array(':validation', ':field', ':value'))
// повторная проверка поля name1:
->rule('name1', array('Testclass', 'static_rule_2'), array(':validation', ':field', ':value'))
// -- подключение public методов экземпляра класса
// все тоже самое, только вместо имени передается экземпляр класса
->rule('name4', array($testclass, 'public_rule'))
;
// проверка
if (! $validation->check())
{
// покажем структуру массива ошибок без обработки
// будет что-то типа: array("name1" => array(0 => "static_rule_1", 1 => array(0 => "Тру-ля-ля"))
$errors1 = $validation->errors();
// покажем какие ключи будут искаться при обработке, на примере файла bla/blabla, которого не существует.
// но если в папке messages будет папка bla, а в ней blabla.php, значения ошибок будут подставлены.
// Validation::errors в случае, если не находит сообщение ставит вместо значения путь до ненайденного ключа
// будет что-то типа: array("name1" => "bla/blabla.name1.static_rule_1")
$errors2 = $validation->errors('bla/blabla');
}
echo "errors1: ".Debug::vars( $errors1 )."\n";
echo "errors2: ".Debug::vars( $errors2 )."\n";
} // End action_validation
} // End class Controller_Test
/**
* Test class
*
*/
class Testclass
{
public static function static_rule_1()
{
// демонстрация переданных аргументов
$args = func_get_args();
echo "static_rule_1: ".Debug::vars( $args )."\n";
/*
этот вариант валидации должен разобраться с переданными ему аргументами
и вернуть boolean результат
если результат будет FALSE, то класс Validation запишет ошибку для проверяемого поля
ключ ошибки будет равен имени функции
*/
// вернем FALSE, чтобы показать как запишеться ошибка
return FALSE;
}
public static function static_rule_2($validation, $field, $value)
{
// демонстрация переданных аргументов
$args = func_get_args();
echo "static_rule_2: ".Debug::vars( $args )."\n";
/*
этот вариант валидации должен разобраться с переданными ему аргументами
и сам рассказать про ошибки вызывая $validation->error
можно и другие возможности класса Validation вызывать
*/
// пишем информацию об ошибке через $validation->error
// в качестве параметров должно быть:
// поле, которое присутствует в проверяемом массиве (первый аргумент). как правило это переданное имя поля, которое и проверяли тут
// имя ключа ошибки (второй аргумент). Validation на это место ставит имя функции, но можно написать что-то более человечное
// дополнительные параметры, которые будут подставлены в ответ (третий аргумент). их необязательно указывать, по умолчанию NULL
// ':validation', ':field', ':value' всегда есть в параметрах подстановки, а также те, что переданы через Validation::bind. например, ORM в :model передает класс модели
$params = NULL;
$validation->error($field, 'имя_ключа_ошибки', $params);
/*
функция не должна возвращать ничего (если конструкция return не указана, то функция вернет значение NULL)
если вернуть FALSE, то класс Validation запишет ошибку для проверяемого поля и затрет при этом то, что сами написали выше
ключ ошибки будет равен имени функции
*/
}
public function public_rule()
{
// демонстрация переданных аргументов
$args = func_get_args();
echo "public_rule: ".Debug::vars( $args )."\n";
/*
этот вариант валидации должен разобраться с переданными ему аргументами
и вернуть boolean результат
если результат будет FALSE, то класс Validation запишет ошибку для проверяемого поля
ключ ошибки будет равен имени функции
*/
// вернем FALSE, чтобы показать как запишеться ошибка
return FALSE;
}
} // End class Testclass
Источник: http://forum.kohanaframework.org/discussion/10036/callback-v-validatore-ko3.2