Валидация данных в LiveStreet 0.6

В транковую версию LS на github.com добавлен новый функционал — валидация данных и полей сущностей. Этот функционал призван заменить функцию func_check(). За основу был взят функционал валидации Yii.

На данный момент доступны следующие типы валидации:
  • Boolean — проверка значения на булевый тип
  • Date — проверка значения на формат даты и времени
  • Email — проверка корректности емайл
  • Inline — валидация произвольным методом сущности или другого объекта
  • Number — проверка на числа
  • Required — проверка на пустое или конкретное значение
  • String — проверка строк на длину
  • Type — проверка на тип значения
  • Url — проверка на корректность URL


Как использовать

В сущности необходимо составить список правил валидации.
class PluginTest_ModuleMain_EntityTest extends Entity {

	protected $aValidateRules=array(
		array('login, name','string','max'=>7,'min'=>'3'),
		array('title','my','on'=>'register'),
	);

	public function ValidateMy($sValue,$aParams) {
		if ($sValue!='Мега заголовок') {
                    return 'Ошибочный заголовок';
                }
		return true;
	}
}


Правила задаются в виде элементов массива. Первый элемент — список полей к которым необходимо применить валидацию, второй — тип валидатора или имя метода для кастомной валидации, остальные элементы — перечисление параметров, которые передаются в валидатор.
В первом правиле мы задаем проверку полей login и name на длину от 3 до 7 символов. Во втором задаем проверку поля title через кастомный тип валидатора «my» — если существует метод ValidateMy() у сущности, то он будет использован в качестве валидатора, если его нет, попытается найти стандартный валидатор с типом «my».

У всех валидаторов есть общие параметры:
  • bSkipOnError — пропускать валидацию, если по этому полю уже есть ошибка
  • label — название поля валидации, выводится в тексте сообщения, по умолчанию используется имя поля
  • msg — текст сообщения об ошибке, позволяет переопределить стандартное сообщение.
  • msgId — id текстовки из языкового файла для переопределения сообщения об ошибке, аналог msg
  • on — список сценариев в которых необходимо применять данное правило


Валидация сущности:
$oObject=Engine::GetEntity('PluginTest_ModuleMain_EntityTest');
$oObject->setLogin('bolshoi login');
$oObject->setTitle('zagolovok');

if ($oObject->_Validate()) {
	var_dump("OK");
} else {
	var_dump($oObject->_getValidateErrors());
}

Метод _Validate() запускает валидацию согласно описанным правилам в сущности.
Если необходимо при валидации использовать только определенные правила(параметр on), то перед методом валидации необходимо вызвать _setValidateScenario():
$oObject->_setValidateScenario('register');
$oObject->_Validate();
в данном случаи будут использованы только правила, у которых в параметре on указан сценарий register.
По умолчанию при валидации используются только правила БЕЗ сценария. Хотя этот момент спорный и возможно по дуфолту будет лучше использовать все правила в независимости от сценария.

Использовать валидацию без сущности можно так:
if (!$this->Validate_Validate('url','http://livestreet.ru')) {
    var_dump($this->Validate_GetErrors());
}


Данный подход к валидации позволит не дублировать код проверки полей и использовать его многократно, например, при обычной и ajax валидации.

24 комментария

avatar
Щас посыпятся оффтоп вопросы про совместимость 0.6 и плагинов 0.5
avatar
Этот функционал призван заменить функцию func_check().
т.е. func_check() выпилят из новой версии?
avatar
Маловероятно
avatar
в 0.6 останется как есть
avatar
отлично. рад нововведениям
avatar
Ох чую выход 6-й версии с новым дефолтовым шаблоном. Надеюсь в понедельник будет релиз -)
avatar
ой ненене рано еще
avatar
Я очень рад, что контроллеры экшены уменьшаться хоть немного, и функционал валидации уйдет в модели сущности.
*Thumbs Up*
avatar
Сущности это не модели.
avatar
Вполне себе анемичная доменная модель.
avatar
Аксессоры, обращающиеся к внешним данным конечно не совсем вписываются, тем не менее, я считаю, их вполне можно так называть.
avatar
Спасибо! Крутое нововведение, предвижу форк лс с вычищенным пользовательским функционалом, для использования его как фреймворка.

Быть может сделать так, чтобы метод _getValidateErrors() возвращал одномерный массив? Или есть более простой способ вывода мессага пользователю с помощью модуля Message без двух итераций?
avatar
теперь можно вызвать метод _getValidateError() без параметра и он вернет самую первую ошибку
комментарий был удален
avatar
Изменяю правила валидации для топика, как получить доступ к дополнительным полям?
Пробовал так:
$this->aValidateRules[]=array('topic_extra_album','string','max'=>100,'min'=>1,'allowEmpty'=>false,'label'=>$this->Lang_Get('plugin.albums.create_album_error'),'on'=>array('album'));

— не работает, все время выдает ошибку
avatar
Ну чего, никто не подскажет как быть?
avatar
Валидировать нужно поле topic_extra, а уже в методе валидации получать конкретные данные/поля
avatar
А можно конкретный пример?
avatar
Валидация поля даты пропускает значения из серии 12.07.192? Как дела обстоят с датами до Рожжества Христова (отрицательные, спец. префикс и тп)?
avatar
для валидации можно передавать нужный формат даты(стандарт для функции date()), если этого не хватает, то валидацию можно сделать по регулярке
avatar
Спасибо!
avatar
Подскажите, пожалуйста, как решить ситуацию вывода сообщений при валидации.
В ActionIndex получаю некоторые параметры из URL для дальнейших действий. Валидирую способом, описанным в статье, с помощью своего валидатора (по регулярному выражению). Валидация проходит успешно.
Подскажите, пожалуйста, как правильно вывести сообщение об ошибки валидации стандартным способом. Реально ли это на главной странице, без костылей?

Спасибо!
avatar
avatar
Спасибо!
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.