Não subestime seus modelos

Escrito por Hélio Ricardo em CakePHP, Boas práticas 20 09 2007

Tenho 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...


Ações

Informação

Deixe um comentário

Você pode usar essas tags : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>