Não subestime seus modelos
Escrito por Hélio Ricardo em CakePHP, Boas práticas 20 09 2007Tenho visto muita gente que se limita ao Bake para gerar seus modelos e acaba não percebendo que validação é função do modelo no padrão MVC.
Já percebeu que o próprio CakePHP faz a validação pelo modelo? Quando tentamos salvar um modelo, o cake valida seus campos baseado na propriedade $validate antes de salvar.
Devemos usar validação nos modelos como, por exemplo nesses métodos de um hipotético modelo de usuário:
/** * Verifica a autenticidade dos dados informados pelo usuário * @param array $credenciais Credenciais informadas * @return mixed Retorna o Usuário ou falso */ function validaCredenciais($credenciais) { // Retorna o usuario que o solicitante diz ser $usuario = $this->findByUsuario($credenciais['usuario']); $usuario = $usuario['Usuario']; return (!empty($credenciais['senha']) && md5($credenciais['senha']) == $usuario['senha'])? $usuario: false; } /** * Verifica se o nome do usuário é único * @param string $novoUsuario * @return boolean */ function eUnico($novoUsuario) { $cond = array('Usuario.usuario' => $novoUsuario); return !$this->hasAny($cond); } /** * Insere um novo usuário * @param array $data Credenciais informadas * @return boolean Verdadeiro se o usuário foi salvo */ function insere($data = null) { /* * Verifica se o nome de usuário é único */ if(!$this->eUnico($data['usuario'])) { $this->invalidate('usuario'); $this->usuarioErro = 'Já existe um usuário com este login<br/>O usuário precisa ser único'; return false; } else { /* * Salva o usuário */ $this->usuarioErro = 'O usuário precisa ter entre 2 e 45 letras'; return $this->save($data); } }
Além disso podemos ter funções interessantes e no lugar certo. Imagine que precisamos transformar um usuário em administrador? Por que não ter os seguintes métodos no modelo?
/** * Promove um usuário a administrador * @param integer $id ID do usuário a promover * @return boolean Verdadeiro se o usuário foi promovido com sucesso */ function promove($id){ $this->id = $id; return $this->saveField('admin', 1); } /** * Retira poder de administrador de um usuário * @param integer $id ID do usuário a promover * @return boolean Verdadeiro se o usuário foi rebaixado com sucesso */ function rebaixa($id) { $this->id = $id; return $this->saveField('admin', 0); }
Fica aqui a idéia. Imagine um método ultimosArtigos($quantidade = 5) ao invés de escrever isso no controlador...
É isso aí pessoal. Dúvidas, críticas, sugestões? Os comentários estão aí para isso...






