Валидация Без Модели

Доброго времени суток.

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

    $settings = array(


            'map'       =>array('latitude'=>1, 'longitude'=>2,'zoom'=>4),


            'mail'      =>array('mail_to'=>'sdas@sdf.com','mail_subject'=>1, 'mail_message'=>2),    


            'contacts'  =>array('skype'=>'skufhsdu', 'email'=>'gvjhsf@dghf.rut','phone'=>'07777777'),


                );

Раньше для каждого вида настроек я создавал модель( валидация решалась сама собой), но когда настроек стало больше, нужно какое-то другое решение.Если есть другие варианты буду рад.

Заранее Спасибо!

Смотря для чего нужна валидация, возможно проще написать свою регулярку или что то еще.

В некоторых валидаторах есть методы для валидации без модели, например в CEmailValidator, в этом случае можно использовать:




$validator = new CEmailValidator;

if ($validator->validateValue("test@gmail.com"))

   echo "validated";



Насчет остальных не знаю, можете глянуть в сорсах.

Для других случаев это невозможно, так как валидаторы очень тесно связаны с моделями. Я делал пустую модель для этих целей, выглядит как то так:




class MyValidator extends CFormModel {

    public function __get($name) {

        return isset($_POST[$name])?$_POST[$name]:null;

    }

    static function myValidate( Array $rules ) {

        $dummy = new MyValidator();

        foreach($rules as $rule) {

            if( isset($rule[0],$rule[1]) ) {

                $validator = CValidator::createValidator( 

                     $rule[1], 

                     $dummy, 

                     $rule[0], 

                     array_slice($rule,2) 

                );

                $validator->validate($dummy);

            }

            else { /* throw error; */ }

        }


        //print_r( $dummy->getErrors() );

        return !$dummy->hasErrors();

    }

}



Пользоваться так:




$rules = array(

    array('name, email', 'required'),

    array('email', 'email'),

);

$_POST['name']="asdasdasd";

$_POST['email']="test@gmail.com";


if( MyValidator::myValidate($rules) ) {

    ....

}



Да я и не совсем понимаю зачем вам что то придумывать здесь.




$settings = array(

'map' =>array('latitude'=>1, 'longitude'=>2,'zoom'=>4),

'mail' =>array('mail_to'=>'sdas@sdf.com','mail_subject'=>1, 'mail_message'=>2), 

'contacts' =>array('skype'=>'skufhsdu', 'email'=>'gvjhsf@dghf.rut','phone'=>'07777777'),

);



Прекрасно помещается в 1 таблицу, зачем здесь serialize?

Кладем все в 1 табличку в разные ячейки. Создаем модель Settings и пишем туда все необходимые валидации. Если нужно делать выборки именно такого вида (тоесть например настройки для контактов выбрать и прочее), при использовании АR:




public function scopes()

    {

        return array(

            'contacts'=>array(

            	'select' => 'skype,email,phone',

            ),

        );

    }

//При использовании

Settings::model()->contacts()->findByPk();



Если же не используете AR выделите поля вверху модели для выборок и пользуйтесь,




public static contacts_fields = "skype, email, phone";


//В коде

$result=Yii::app()->db->createCommand("SELECT {Settings::contacts_fields} FROM settins  WHERE id=1")->queryRow();



Это сугубо мое мнение, но я бы делал так, не знаю что вас пугает.