Criando um CRUD completo com CakePHP

Veja neste artigo como criar um CRUD completo no CakePHP contemplando a criação da view, do model e do controller, utilizando a sua versão mais estável que é a 2.3.7, e entenda como é simples a sua utilização e o quanto ele pode nos ajudar no desenvolvimento dos nossos projetos diariamente.

O que seria um CRUD?

O termo “CRUD” é utilizado no mundo do desenvolvimento de sistemas para designar as quatro operações básicas do gerenciamento de registros em um banco de dados. As operações referenciadas pelas letras C, R, U, D cujos respectivos termos em inglês são Create, Read, Update e Delete. Passando para o português, Teríamos os seguintes significados: Criar, Ler (comumente, listar), Atualizar e Excluir (Deletar).

Primeiros passos - Criando a base de dados

Inicialmente para a utilização correta do nosso framework para a criação de um sistema, precisamos criar a base de dados que será utilizada. Abaixo estão nossas configurações de acesso ao banco de dados modificadas no arquivo database.php.

Listagem 1: Configuração da base de dados


	public $default = array(
		'datasource' => 'Database/Mysql',
		'persistent' => false,
		'host' => 'localhost',
		'login' => 'root',
		'password' => '123456’,
		'database' => 'cakeprojeto’,
		'prefix' => '',
		'encoding' => 'utf8',
	);

O resultado do código da listagem 1 deve ser algo parecido com isso:

Configuração da base de dados

Figura 1: Configuração da base de dados

Após a criação do nosso banco e atualização de nossas informações de acesso no arquivo “database.php”, chegou a hora de começar a criação da nossa tabela exemplo, que no momento para este artigo, será a tabela titulada “usuarios”. Uma observação importante é que os nomes das tabelas seguem uma convenção do Cake, onde todas as tabelas criadas devem estar no plural. Não só existem convenções para tabelas, mas também para criação de classes, dentre outros.

Listagem 2: Código da tabela de usuários:


CREATE TABLE `usuarios` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`nome` VARCHAR(100) NOT NULL,
`login` VARCHAR(100) NOT NULL,
`email` VARCHAR(100) NOT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;

Da mesma forma que os nomes das tabelas, deve-se tomar cuidado com os nomes dos campos que serão utilizados, pois estes também seguem uma convenção utilizada pelo Cake.

Porquê utilizar as convenções do Cake?

Nós desenvolvedores, muitas vezes temos nossa própria maneira de desenvolver e estamos de certa forma, acostumados (para não dizer, acomodados) a um determinado “padrão” que já usamos há algum tempo. Então por que mudar a nossa forma de desenvolver com o Cake?

A resposta para isso é simples. O Cake foi criado justamente para facilitar mais ainda o desenvolvimento de sistemas utilizando o MVC e não apenas isso, como também priorizando a flexibilidade e a agilidade. Para isso, foram criadas convenções de desenvolvimento para que o próprio framework se encarregue do árduo trabalho de “linkagem” entre camadas, além de outras facilidades encontradas com sua utilização.

Para informações com relação as convenções, vocês podem acessar o seguinte endereço: http://book.cakephp.org/2.0/en/getting-started/cakephp-conventions.html

Este foi o nosso primeiro passo para começar a criar o nosso sistema exemplo com o Cake. Vamos dar sequência com a criação do nosso MVC.

Criando o Model de usuários

A camada model é a responsável pela interação com a nossa base de dados. Os arquivos que serão criados como classes do tipo model se encontram na pasta model, segundo a estrutura que em nosso caso será C:\xampp\htdocs\projetoCake\app\Model. Nossas classes são salvas com a extensão .php e o nome da classe no singular. Como será no nosso exemplo, C:\xampp\htdocs\projetoCake\app\Model\Usuario.php.

Após a criação da classe, o conteúdo inicial será:

Listagem 3: Código inicial do model


class Usuario extends AppModel{

}

Chamando o model utilizando a estrutura do Cake, automaticamente ele já entende que a nossa classe Usuario será vinculada ao nosso UsuariosController e que irá manipular as informações vindas da nossa tabela usuários. Percebam que não fizemos nada além de criar a classe e extender o AppModel.

Criando o controller UsuariosController

Em sequência, criaremos o nosso controller que é o responsável por toda a lógica de negócios do sistema. É nesta camada onde iremos manipular os models e trabalhar em cima das ações que serão criadas.

O nosso controller será salvo como UsuariosController.php. Ele deve ser salvo na pasta C:\xampp\htdocs\projetoCake\app\Controller\

Listagem 4: Criação do arquivo UsuariosController.


class UsuariosController extends AppController {
    public $helpers = array("Form", "Html");
}

Com o nosso controlador criado é hora de criarmos nossas actions (ações). Como sabemos, nossas ações básicas neste artigo serão listar, adicionar, editar e excluir.

Comecemos com a nossa ação index. Ela será responsável pelo nossa listagem de informações (o nosso Read).

Listagem 5: Retornando registros com find()


    public function index() {
        $this->set("title", "Usuários");

        $usuarios = $this->Usuario->find('all');
        $this->set('usuarios', $usuarios);
    }

Neste momento estamos utilizando o método find() para retornar todos os registros salvos para apresentar numa lista.

Em seguida, as nossas ações seguintes, que são: Adicionar, Editar e Excluir.

Listagem 6: Funções para Adicionar, Editar e Excluir


public function adicionar() {
        $this->set('title', 'Adicionar usuário');

        if ($this->request->is("post")) {
            $this->Usuario->create();

            if ($this->Usuario->saveAssociated($this->request->data)) {
                $this->Session->setFlash(__("Registro salvo com sucesso."));
                $this->redirect(array("action" => '/index/'));
            } else {
                $this->Session->setFlash(__("Erro: não foi possível salvar o registro."));
                $this->redirect(array("action" => '/adicionar/'));
            }
        }
    }

Neste caso, estamos verificando as informações que estão sendo passadas pelo formulário e então, salvando os dados passados.

Listagem 7: Editando dados


public function editar($id = NULL) {
        $this->set("title", "Editar Usuário");
        $this->Usuario->id = $id;
        if (!$this->Usuario->exists()) {
            throw new NotFoundException(__('Registro não encontrado.'));
        }

        if ($this->request->is('post') || $this->request->is('put')) {
            if ($this->Usuario->saveAssociated($this->request->data)) {
                $this->Session->setFlash(__('Registro salvo com sucesso.'));
                $this->redirect(array('action' => '/index/'));
            } else {
                $this->Session->setFlash(__('Erro: não foi possível salvar o registro.'));
            }
        } else {
            $this->request->data = $this->Usuario->read(NULL, $id);
        }
    }

De igual forma ao método de adicionar, com a diferença de que estamos recuperando as informações do banco e passando para os respectivos campos para podermos alterá-los corretamente.

Listagem 8: Excluindo dados


public function excluir($id = NULL) {
        if (!$this->request->is('get')) {
            throw new MethodNotAllowedException();
        }
        $this->Usuario->id = $id;
        if (!$this->Usuario->exists()) {
            throw new NotFoundException(__('Registro não encontrado.'));
        }
        if ($this->Usuario->delete()) {
            $this->Session->setFlash(__('Registro excluído com sucesso.'));
            $this->redirect(array('action' => '/index/'));
        }
        $this->Session->setFlash(__('Erro: não foi possível excluir o registro.'));
        $this->redirect(array('action' => '/index/'));
    }

No momento da exclusão, estamos verificando o id que foi passado e caso seja este mesmo o registro que se deseja excluir, executa-se o método delete.

Após a criação do nosso controlador com todas as nossas ações definidas, ainda não podemos testar e ver os resultados, pois faltam as nossas views que serão as nossas camadas de visualização. Este será o nosso próximo passo.

Criando as views de visualização, adição e edição

Seguindo a sequência das ações do nosso controlador, iremos criar as nossas views que serão salvas em C:\xampp\htdocs\projetoCake\app\View\. Dentro deste diretório criaremos a pasta Usuários e nela salvaremos os nossos arquivos .ctp (extensão utilizada pelo CakePHP). Como exemplo, teríamos nossa estrutura da seguinte forma: C:\xampp\htdocs\projetoCake\app\View\Usuarios\index.ctp

Seguem abaixo as imagens referentes ao nosso código das nossas views index, adicionar e editar. Não será necessário uma view para exclusão.

Listagem 9: Código responsável pela visualização das informações na nossa index.


<h4><?php echo $this->Html->link('Adicionar', array('action' => 'adicionar')); ?></h4>
<table>
    <tr>
        <th style="width:65px;text-align:center;">Código</th>
        <th>Nome</th>
        <th>Login</th>
        <th>E-mail</th>
        <th>Ações</th>
    </tr>
    <?php
    foreach ($usuarios as $usuario) {
        ?>
        <tr>
            <td><?php echo $usuario['Usuario']['id']; ?></td>
            <td><?php echo $usuario['Usuario']['nome']; ?></td>
            <td><?php echo $usuario['Usuario']['login']; ?></td>
            <td><?php echo $usuario['Usuario']['email']; ?></td>
            <td><?php echo $this->Html->link('Editar', array('action' => 'editar', $usuario['Usuario']['id'])); ?>
                | <?php echo $this->Html->link(
                    'Excluir', array(
                        'action' => 'excluir',
                        $usuario['Usuario']['id']), array('confirm' => 'Você tem certeza que quer excluir este usuário?')
                ); ?></td>
        </tr>
    <?php
    }
    ?>
</table>

Listagem 10: Código de criação do nosso formulário de adicionar.


<?php
echo $this->Form->create('Usuario');
echo $this->Form->input('login');
echo $this->Form->input('nome');
echo $this->Form->input('email');
echo $this->Form->input('Enviar', array('label' => FALSE, 'type' => 'submit'));
echo $this->Form->end();
?>

Listagem 11: Código para criação do nosso formulário de edição de dados.


<?php
echo $this->Form->create('Usuario');
echo $this->Form->input('id', array('type' => 'hidden'));
echo $this->Form->input('login');
echo $this->Form->input('nome');
echo $this->Form->input('email');
echo $this->Form->input('Alterar', array('type' => 'submit', 'label' => FALSE));
echo $this->Form->end();
?>

Percebam que é praticamente igual ao de adicionar, com a diferença de que neste estamos recebendo o id como uma informação oculta.

Agora só basta acessarmos nosso projeto pela url: http://localhost/projetoCake/usuarios/index, para executarmos nossos testes e ver se está tudo ok. Com isso encerramos este artigo buscando de forma simples passar o máximo de informações necessários para começar com este framework que tem muito a oferecer ainda. Todo o material gerado no decorrer deste artigo estará disponível para download para que vocês possam praticar.

Conclusão

Neste artigo, vimos de forma simples como se trabalhar com o CRUD no framework CakePHP e vimos quão rápida é a criação de um sistema baseado na estrutura MVC.

Até a próxima!