Методы класса валидации

Комментарии: 8  Просмотры: 10 587

Рассмотрим дополнительные методы класса валидации, которые могут пригодится при работе с этим классом и проверках данных.
При помощи метода label можно изменять ярлык, или так называемый псевдоним поля формы. Рассмотрим на примере. У нас есть поле user, в которое пользователь должен ввести свое имя. В случае, если поле не удовлетворяет правилам валидации, у нас на данный момент выдаются ошибки «Поле Юзер не должно быть пустым» или «Поле Юзер не должно быть короче 2 символов». Допустим нас не устраивает название «Поле Юзер», но лезть в файлы с переводом мы не хотим. В таком случае можно его поменять следующим образом. Перед валидацией пишем:

$post -> label('user', 'Имя пользователя');

И получаем ошибки «Имя пользователя не должно быть пустым» и «Имя пользователя не должно быть короче 2 символов» соответственно. Если изменяемых названий несколько, то чтобы не вызывать несколько раз метод label, можно создать массив с этими названиями и передать в метод labels примерно так:

$data = array('user' => 'Имя пользователя', 'email' => 'Бандероль');
$post -> labels($data);

В старых версиях фреймворка еще был такой метод — filter, который позволял обрабатывать значения полей перед применением правил валидации. Я не знаю, зачем его убрали в версии 3.2, он был весьма удобен. Помните нашу обработку полей функцией trim ?

$_POST['user'] = trim($_POST['user']);
$_POST['message'] = trim($_POST['message']);

Мы делали ее для того, чтобы при валидации полей user и message с одними только пробелами сначала происходила их очистка, иначе правило not_empty не сработает. С методом filter все выглядело бы гораздо красивее:

$validate->filter('user', 'trim');
$validate->filter('message', 'trim');

или

$validate->filter(TRUE, 'trim');

для обработки всех полей. Но, увы, такого метода нет. Можно вытащить его из старых версий и расширить класс Validate. Ну или как вариант сделать следующее:

$_POST = Arr::map('trim', $_POST);

Идем дальше. Метод copy позволяет скопировать уже «настроенные» правила валидации и применить их для другого массива с данными. Например, для проверки массива $_GET:

$get = $valid->copy($_GET);

И напоследок пара слов про создание собственных правил валидации. Допустим, нам нужно убедиться, что введенное или выбранное число больше 18-ти (очень актуальная штука для «взрослых» сайтов). Пишем метод, который осуществляет проверку и возвращает TRUE в случае успеха и FALSE в случае неудачи.

public function check_age($value)
{
    $value = intval($value);
 
    if($value > 18)
        return TRUE;
 
    return FALSE;
}

И пишем правило:

$post -> rule('age', array($this, 'check_age'))

Все, можно проверять возраст. Только не забудьте добавить текст ошибки в массив сообщений.
Еще один вариант — использование так называемых анонимных функций. Данные функции появились в PHP начиная с версии 5.3.0. При их использовании проверка выглядит примерно так:

$post -> rule('age', function($value) { 
    $value = intval($value);
 
    if($value > 18)
        return TRUE;
 
    return FALSE;
});

Смотрится короче, красивее, но к сожалению не работает так как надо. Точнее говоря при ошибке валидации саму ошибку мы не получим. Вот рабочий вариант:

$post -> rule('age', function($value, $field, $validation) {
    $value = intval($value);
 
    if ($value > 18)    
    {        
        $validation->error($field, 'check_age');        
            return FALSE;    
    }
 
    return TRUE;
}, array(':value', ':field', ':validation'));

Как видите, он очень громоздкий, поэтому особого смысла рассматривать (и использовать) его я не вижу.
Собственно на этом все, в следующем уроке попробуем наши знания применить на практике.

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


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

Уроки по Кохане, а блог на wordpress — разочаровывает.

Хотел спросить, вы пишете «Метод clone», а в коде уже copy. Так какой метод верный?

Почти все блоги по программированию написаны на вп. Какая-то нездоровая тенденция :)

Извиняюсь. Copy верный. Clone просто используется внутри этого метода и я видимо автоматом написал. Поправил, спасибо.

function check_age писать прямо в коде контроллера можно? Или где?

Насколько я знаю, функция-валидатор кроме того, что она публичная, должна быть еще и статичной. Или я не прав?

Отвечу сам: варианта тут два — либо экземпляр объекта и его метод а-ля array($example, ‘example_method’), либо статичная функция любого класса ‘Class::validator’. Как-то так. Неплохо было бы указать на этот нюанс в статье.

//если бы ещё можно было бы написать 'self::check_age'... но, как оказалось, нельзя. Нет такого имени по мнению парсера
 
//в итоге даже на статическую ф-ю
 
static public function check_age($value,$field,$validation){
		$value = intval($value);
		if ($value error($field,'check_age');        
				return FALSE;    
		}
		return TRUE;
	}
 
//правило вызова остаётся через текущий экземпляр класса		$post-&gt;rule('age',Array($this,'check_age'),array(':value', ':field', ':validation'));
 
 
//Кроме того, такая запись вынуждает к следующему синтаксису в массиве валидаций: 
 
	'url'           =&gt; ':field must be a url',
	'age'           =&gt; Array('check_age'=&gt;':field must be &gt;18'),

У меня такая проблема, сделал авторизацию, все заходит, выходит, все ок. Но не получается сделать проверку, но то, то что логин или пароль введен неверно. Сделал такую проверку

if(!$auth->login($login, $pass, $remember)){ $res['error'] = ‘ok’;
}else{ $res['error'] = ‘okno’;
}

пишет переменная res не объявлена. Пожалуйста, подскажите, как правильно сделать эту проверку. Спасибо. Ресурс хороший!



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

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