Tratamento do model no CakePHP

O model faz parte de um padrão de arquitetura de softwares, tratado como MVC, que separa as informações e regras de negocio da camada de visualização com a qual o usuário final interage.

Utilizando esse tipo de padrão, estamos separando as camadas de forma que cada uma tenha o seu papel especifico.

O que é o model neste padrão?

O model é a camada responsável pela interação com a nossa base de dados. Ele é responsável pelo provimento dos meios de acesso, sendo estes, leitura e escrita a estes dados.

Nesta camada, podemos fazer a validação dos dados de entrada e de saída. Todos os models que criamos através do nosso framework estendem suas funcionalidades do AppModel que já faz parte da estrutura padrão do CakePHP e que já é responsável pela maioria dos tratamentos de dados realizados pelo framework.

Citaremos aqui alguns dos métodos que utilizamos corriqueiramente em nosso s projetos que já são um estabelecidos como padrão do AppModel e que nos ajudam e muito em relação a desempenho e tempo de desenvolvimento.

Métodos AppModel

A classe do AppModel do CakePHP é bastante extensa e com muitos recursos que facilitam nossa vida. Dela podemos fazer uso tanto de métodos quanto de propriedades. Segue abaixo alguns dos métodos que são padrão do CakePHP.

Método find() - Este método é público e faz uma busca na base dados para retornar um array de resultados. Ele é utilizado para realizar operações de busca, onde o o primeiro argumento a ser passado pode ser “all”, “list”, “first”, “count” (esses são os mais utilizados) e o segundo parâmetro passado é um array de opções para otimizar a busca. Algumas dessas opções que são “conditions”, “fields”, “order”, “recursive”, dentre outras.

Listagem 1: Estrutura do método find do AppModel


$model->find('all', array(
  'conditions' => array('nome' => 'Edson'),
  'fields' => array('nome', 'email', ‘site’),
  'order' => 'nome DESC',
)); 

A sua utilização num controlador se dá da seguinte forma: no lugar da variável $model, será passada a variável “this” ($this) com o respectivo model do seu projeto, como por exemplo o model de usuários.

Listagem 2: Utilização do método padrão do AppModel no controlador


$this->Usuario->find('all', array(
  'conditions' => array('nome' => 'Edson'),
  'fields' => array('nome', 'email', site),
  'order' => 'nome DESC'
));

Existem muitas outras informações com relação a este método que podem facilitar a nossa vida. Para mais detalhes sobre ele, basta acessar o site: http://api.cakephp.org/2.3/class-Model.html

Método validates() - Um outro exemplo de método muito utilizado nas aplicações é o validates(), este tem por finalidade (como a própria palavra já diz) validar as informações referentes ao modelo em questão (no nosso caso, usuários). As informações seriam passadas pelo usuário (na view), seriam passadas pelo controlador que na hora de salvar estas informações, iria validar elas pelo model (pelo método validates() para ver se as informações estão coerentes e se estiver tudo certo, as informações serão salvas na base de dados).

Vamos então criar o nosso model Usuario.php para validar algumas das nossas informações para torna-las obrigatórias no nosso sistema. O arquivo será criado no nosso diretório C:\xampp\htdocs\projetoCake\app\Model\

Diretório do arquivo Usuario.php

Figura 1: Diretório do arquivo Usuario.php

Listagem 3: Validação de dados pelo model utilizando o método validates().


class Usuario extends AppModel {
    public $validate = array(
        'nome’ => array(
            "type" => array(
                "rule" => array("notEmpty"),
                "message" => "O nome do usuário é obrigatório!"
            )
        ),
        ‘email' => array(
            "type" => array(
                "rule" => array("notEmpty"),
                "message" => "Você deve informar o e-mail para correspondência."
            )
        )
    );
 

Além deste método, existem as variações dele que são beforeValidate(), afterValidate(), etc. Para mais informações com relação a eles, vocês podem acessar através do link que será disponibilizado ao fim deste artigo.

Método save() - Assim como o método validate(), o CakePHP já possui um método exclusivo para gravar os dados na base de dados de forma que você não precise de muito tempo desenvolvê-lo, além disso, ele também possui algumas variações, como por exemplo: saveAssociated(mais utilizado), saveAll, etc. Basta apenas utilizá-lo no controlador da seguinte forma:

Listagem 4: Utilização do método save() no controlador UsuariosController.php.


public function adicionar() {
      // $this->request->is('post') está recuperando as informações vindas do formulário via post  
      if ($this->request->is('post')) {
            $this->Usuario->set($this->request->data);
      //  Valida as informações no model Usuario 
            if ($this-> Usuario ->validates($this->request->data)) {
      // Se tudo passer pela validação, então as informações serão salvas na base de dados.
                if ($this-> Usuario ->save($this->request->data)) {
                    	$this->Session->setFlash(__('Registro salvo com sucesso!')); 
         	  } else {
                    	$this->Session->setFlash(__(‘O registro não foi salvo!'));
                 }
            }
        }
    }

Método virtualFields() - Este método é muito utilizado quando você quer simular uma informação vinda da base de dados. Com ele você simula um campo (inexistente na base de dados) para que seja gerada uma nova informação. Um exemplo simples para entender este conceito seria o seguinte.


public $virtualFields = array(
    'nomeCompleto' => "CONCAT(Usuario.nome, ' ', Usuario.sobrenome)"
);

Dessa forma, a informação que visualizaríamos seria por exemplo, “Edson Dionisio”, que seria a junção (concat) do meu nome e sobrenome.

Além destes métodos citados, que são bastante utilizados no dia a dia do nosso trabalho, existem outros que vale muito a pena ver e praticar.

Conclusão

Com isso, podemos ter uma noção grande dos recursos poderosos que o CakePHP nos oferece, nos poupando tempo de desenvolvimento e facilitando cada vez mais a vida dos desenvolvedores.

Até a próxima!