CSafeValidator x CUnsafeValidator

Fala amigos!

Gostaria de saber a diferença destes validadores:

Se você gerar um modelo pelo Gii, normalmente os caras "safe" são aqueles atributos que não tiveram nenhum tipo de validação. Sinceramente ainda não entendi a real funcionalidade disto. Qual o sentido de marcar um atributo ignorado como "safe"? Por que eu iria me preocupar com ele em um cenário de save() batch por exemplo.

:P

Olá Huntz.

Achei interessante o tópico, é algo que ainda não tinha analisado. Busquei sobre o assunto, e fiz alguns testes, vai ai minha opinião.

Já leu esse tópico do guia Yii? http://www.yiiframework.com/doc/guide/1.1/pt_br/form.model#sec-6

Até o momento utilizo o "safe" apenas em atributos que insiro no formulário de pesquisa. Em minhas experiências não encontrei um sentido em usá-lo num scenario diferente do "search", por exemplo, definir "safe" para scenarios como "insert e update" ou qualquer outro da mesma natureza, mas se vc realmente confia no usuário vc poderá fazer dessa forma, porém colocará em risco a entrada desse dado no bd.

Alerto que o safe deve ser utilizado com prudência. Quando um atributo é definido como “safe” sem um scenario esse dado estará pronto para entrar no bd quando a atribuição em massa “$model->attributes = $_POST[‘Classe’];” acontecer, ou seja, a validação irá ignorar o atributo.

O "unsafe", como o tópico citado diz, "é uma exceção" e eu nem imagino uma exceção do tipo. Lembrando que na utilização desse cara, as atribuições em massa irão ignorar o atributo de acordo com o scenario, se vc deseja passar esse valor para a classe terá que fazer a atribuição direta. Exemplo:




public function rules(){

   return array(

      array('nome', 'unsafe', 'on'=>'insert')

   );

}


public function actionCreate(){

               .

               .

   $model->attributes = $_POST ou $GET;

   $model->nome = $_POST['Classe']['atributo'];

               .

               .

}



Flws!

:wq

É isso ae que o Thiago disse

sobre os casos de uso do unsafe, use, por exemplo, num campo de data_criacao, ae vc declara algo como




array('data_criacao','numerical','integerOnly'=>true) ,

array('data_criacao','unsafe','on'=>'update')



para ter certeza que só vai ser setado na criacao e nao podera mais ser alterado

os casos de uso do safe sao mais complexos. Utilize apenas quando vc tiver certeza que o dado é seguro.

Pois é, então meu raciocínio em torno dos validadores “safe” está de acordo com o de vocês. Realmente é algo que não faz muito sentido utilizar, talvez para quem queira um pouco mais de “flexibilidade” em validar regras em testes de integração. ;)