Back-End

3 mai, 2007

Utilizando o CakePHP

Publicidade

Olá pessoal. Hoje vamos falar sobre um framework que desperta muito interesse de alguns desenvolvedores: o cakePHP.

Vou partir do princípio que você já tenha idéia do que seja um framework e suas vantagens. E que tenha o mínimo conhecimento de PHP e MySQL.

Por que usar o que cakePHP?

O cakePHP é baseado no framework Ruby On Rails(RoR) e para quem já está acostumado ou quer se acostumar a programar com o cakePHP, é ótimo. Ele também é de extrema facilidade de uso e utiliza do termo Convention over Configuration, ou seja, convenção ao invés de configuração. Em outros frameworks Java, temos que ficar escrevendo enormes XML de configuração de nosso aplicativo, ao contrário do cakePHP, onde apenas vamos utilizar tarefas que faríamos normalmente, porém baseado em algumas regras do framework.

O que preciso para começar com o cakePHP?

Primeiramente vamos fazer o download da ultima versão do cakePHP. Temos que verificar se estão habilitados no Apache. O uso do cakePHP no servidor Apache implica no uso do mod_rewrite sob pena de ocorrer problemas com URLs. Para liberar o mod_rewrite no Apache, basta encontrar no arquivo httpd.conf as linhas a seguir:

LoadModule rewrite_module modules/mod_rewrite.soAddModule mod_rewrite.c

Então basta descomentar essas linhas. Também precisamos ver se os arquivos .htaccess podem modificar o nosso DocumentRoot. Para verificar se está habilitado, procure pela linha: This should be changed to whatever you set DocumentRoot to e basta adicionar o seguinte comando AllowOverride All.

Caso você não seja o administrador do servidor, entre em contato com o suporte de sua hospedagem.

Iniciando com o cakePHP

Se os passos acima estiverem certos, estamos prontos para começa a programar. Descompacte o cakePHP e coloque no seu DocumentRoot.

Ao abrir a pasta do cakePHP, observamos diversos diretórios. Para o momento os diretórios que mais nos interessam são:

  • App: aqui vai ficar toda nossa aplicação MVC, imagens, etc ..
  • cake: aqui fica o core do cakePHP. Fica em um diretório a parte pois assim podemos atualizar a versão do cakePHP sem interferir em nossa aplicação.

Ainda no diretório App temos :

  • Config: Arquivos de configuração de nosso aplicativo.
  • Controllers: aqui ficaram nossos controllers.
  • Models: aqui ficaram nossos models.
  • views: aqui ficaram nossos views.
  • webroot: aqui ficaram html’s, imagens, swf, css, javascript e etc.

Primeiro passo, o banco de dados

Nosso aplicativo será uma agenda, onde iremos cadastrar tarefas quaisquer.

Vamos utilizar um banco de dados MySQL para esse artigo. Então crie um banco de dados chamado agenda (ou como você preferir).

CREATE DATABASE agenda

Feito isso vamos criar nossa tabela tarefas.

CREATE TABLE tarefas (
id INT NOT NULL AUTO_INCREMENT,
autor VARCHAR(200),
data_inicio DATETIME,
data_fim DATETIME,
tarefa VARCHAR (255),
status BOOL,
PRIMARY KEY ( id )
) TYPE=INNODB;

Atenção: como mencionei antes, o cakePHP utiliza de convenção, então é importante observar que o nome de tabelas sempre devem estar no plural.

Agora tenha em mãos um usuário e senha que tenha acesso a esse banco de dados.

Vamos fazer uma das pequenas configurações do cakePHP, o acesso ao banco de dados. Acesse a pasta app/config/ e você vai ver um arquivo chamado database.php.default. Renomeie esse arquivo apenas para database.php. Ótimo agora vamos editá-lo.

Você pode observar que este arquivo tem 2 arrays: um $default e outro $test. Creio que é bem sugestivo o preenchimento desses arrays. O Array $default é o nosso banco de dados de produção e $test já é bem sugestivo.

array('driver' => 'mysql',
'connect' => 'mysql_connect',
'host' => 'localhost',
'login' => 'root',
'password' => '',
'database' => 'agenda',
'prefix' => '');

Creio que aqui não temos muitos problemas quanto a configuração.

driver: informamos qual é o nosso banco de dados(No caso MySQL).

host: Aqui informamos o endereço físico de nosso servidor MySQL(para a maioria localhost deve funcionar).

login: Usuário com acesso ao BD.

password: Senha do usuário.

database: Nome do banco de dados de nossa aplicação.

prefix: esse é um prefixo que você pode colocar a frente de todas suas tabelas. Exemplo: quando temos uma banco de dados com tabelas de diversas aplicações, podemos colocar esse prefixo para nos organizar e o cakePHP vai adicionar esse prefixo a frente de todas suas consultas no banco.

Feito isso, já podemos testar nossa aplicação funcionando. No meu caso, a minha URL ficou http://localhost/cakephp/ mas isso pode variar de acordo de como você fez. Se tudo ocorreu certo, você vai ver a tela padrão do cakePHP. Para verificar se o cakePHP acessou corretamente o banco de dados, ele vai exibir uma linha com os seguintes dizeres: Cake is able to connect to the database. Caso ele não tenha conseguido acessar ao BD, verifique os itens mencionados acima.

Observação: O cakePHP é um framework MVC. Logo, para cada página nossa com acesso ao banco de dados, vamos precisar de pelo menos 3 arquivos. O Model que vai representar a estrutura da tabela, criar novos registros, deletar, atualizar.

Segundo passo: o Model

Agora vamos criar nosso primeiro Model:

class Tarefa extends AppModel {
var $name = "tarefa"; //para tornar o script compatível com php4
}

Então vamos aos detalhes de nossa classe:

  • Todos nossos Models vão herdar a classe AppModel.
  • O nome do model vai ser o nome da tabela que ele representa, porém no singular e com a primeira letra em maiúsculo.
  • E para manter compatibilidade com o PHP4 declaramos var $name onde seu valor vai ser o mesmo do nome do Model.
  • Devemos salvar dentro de app/models com o nome da classe, ficando assim tarefa.php.

De momento só vamos fazer isso em nosso Model.

Terceiro passo: o Controller

Ele que vai realizar o controle de nossas requisições para models e views. Ele vai mesclar ambos e devolver a página para o usuário.

	class TarefasController extends AppController {
var $name = "Tarefas";
}

Ele também tem algumas convenções que devemos seguir. Vamos a elas:

  • O nome da classe deve ser o mesmo do model porém agora é no plural e junto com a palavra Controller e nossa classe vai herdar AppController.
  • E declaramos o var $name para manter compatibilidade com o PHP4.
  • Vamos salvar esse arquivo em app/controller com nome da classe, porém tudo em minúsculo e com um undeline antes da palavra controller, ficando assim tarefas_controller.php.

O cakePHP, assim como no Ruby On Rails, tem um item muito legal: o scaffold, que é um CRUD (Create, Read, Update, Delete). Ou seja, operações básicas que podemos realizar em uma tabela do banco de dados. E o melhor de tudo, é bem simples colocar o scaffold para funcionar. Ainda em nosso controller, logo abaixo de var $name; adicione uma variável chamada var $scaffold;

Agora queremos testar nosso scaffold, então vamos entrar na URL de nosso aplicativo após a ultima barra e adicionar o nome do controller. No meu caso ficou http://localhost/cakephp/tarefas/

Se estiver tudo certinho, você verá nosso scaffold. Você pode realizar operações CRUD. Tudo isso em poucas linhas de código.

Sem dúvidas o scaffold é um método impressionante e por isso vamos mesclar em templates nossos. Vamos utilizar o scaffold para editar, deletar e visualizar somente uma tarefa. E para listar todas as tarefas, vamos montar nossa própria view.

Antes de continuarmos, vamos entender como nosso controler vai entender nossa URL.

http://localhost/cakephp/tarefas/listar/1

cakephp: esse é o nome do diretório onde está nossa aplicação.

tarefas: esse é nome de nosso controller, mas só não adicionamos a palavra controller

listar: esse é nome do método que estamos chamando dentro de tarefas_controller.php

1: são parâmetros que passamos para nosso método listar.

Todos os nossos controller vão precisar de uma função com um nome em comum que é index. Essa é uma função que vai ser chamada caso não passamos o nome do método que queremos chamar. Geralmente redirecionamos para uma função da controller e no nosso caso vamos redirecionar para o listar.

function index() {
$this->redirect('/tarefas/listar');
}

Ainda no controller vamos criar uma function chamada listar, irá listar todas nossas tarefas.

function listar() {
// coloca um titulo em nossa página, ou seja passa para o template a variável title
$this->set('title', 'Listar');
//aqui vamos buscar todos nossos registros no banco de dados
$tarefas = $this->Tarefa->findAll();
//Aqui estamos enviando para o template os registros encontrados.
$this->set('tarefas', $tarefas);
}

No código acima, buscamos todas as tarefas. Observe que invocamos um método de nosso Model que nem ao menos criamos findAll, mas esse método está no pacote AppModel que nossa classe Tarefa herdou. Então chamamos esse método sem precisar criar nada. E então adicionamos as variáveis em nosso template.

Se você executar seu código nesse momento, você vai ver que o cakePHP acusou de faltar view listar.thtml

Terceiro passo: a view

Antes de mais nada, vamos entender como o cakePHP vai funcionar em relação a view.

O cakePHP vai procurar por um diretório chamado tarefas dentro de views, pois para ele, tudo que for referente a tarefas, estará nesse diretório. E cada método vai ter ter um arquivo .thtml que terá o mesmo nome que o método. Exemplo: dentro de views, vamos precisar de um arquivo chamado listar.thtml. Se tivéssemos um método do TarefasController chamado olho, vamos precisar de uma view chamada olho.thtml.

Então vamos ao html de nosso arquivo listar.thtml:

<h1>Lista de Tarefas</h1>
<table width="100%" cellspacing="0" cellpadding="0">
<tr bgcolor="#F0F0F0">
<td>Autor</td>
<td>Data Inicio</td>
<td>Data Fim</td>
<td>Tarefa</td>
<td>Status</td>
<td>Operações</td>
</tr>
<?php foreach ( $tarefas as $tarefa ): ?>
<tr>
<td><?=$tarefa['Tarefa']['autor']?></td>
<td><?=$tarefa['Tarefa']['data_inicio']?></td>
<td><?=$tarefa['Tarefa']['data_fim']?></td>
<td><?=$tarefa['Tarefa']['tarefa']?></td>
<td><?=$tarefa['Tarefa']['status']?></td>
<td>
<?=$html->link('Visualizar', '/tarefas/view/'.$tarefa['Tarefa']['id'])?>
<?=$html->link('Editar', '/tarefas/edit/'.$tarefa['Tarefa']['id'])?>
<?=$html->link('Deletar', '/tarefas/delete/'.$tarefa['Tarefa']['id'])?>
</td>
</tr>
<?php endforeach; ?>

Bom, o que fizemos foi bem simples. Se antes de executar esse código você der um print_r ($tarefas), você vai ver o array que temos. Então o primeiro indice é númerico, e depois teremos uma outra chave onde é o nome de nosso model e depois o nome dos campos.

E por último utilizamos a html do cakePHP para gerar nossos links. Se você acessar nossa aplicação e testar editar, deletar e visualizar os dados, você verá que funciona tudo certinho. Isso porque deixamos o scaffold ativo. Só apenas criamos links para seus métodos.

O scaffold é excelente para gerenciar backend’s pois é de extrema produtividade.

No momento já temos uma aplicação inteira funcionando, mas ainda não deixamos ela completamente com a nossa cara, ou seja, nossas views são adicionadas dentro de um template padrão do cakePHP, mas podemos montar o THTML do esqueleto de nosso site. Então vamos ao nosso thtml:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html lang="pt-br">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Tarefas - <?php echo $title_for_layout; ?></title>
</head>
<body>
<div id="header">
<h1>Tarefas</h1>
</div>
<div id="content">
<?=$content_for_layout;?>
</div>
</body>
</html>

As variáveis tem nomes bem sugestivos, ou seja, $content_for_layout é onde o conteúdo da view vai ser incluído. Agora salve o arquivo em app/views/layouts com o nome de default.thtml e seu site vai ter sua cara.

Conclusão

Por hora vamos ficar por aqui. No próximo artigo vamos entrar mais a fundo no framework. Espero que tenham gostado do artigo e que tenham despertado uma atenção para o framework do cakePHP. Mesmo com o framework da zend e entre tantos outros framework’s.

O que quero, com esse artigo, é deixar a porta aberta para mais um framework, ou até mesmo uma metodologia de trabalho.

Links

http://manual.cakephp.org/

http://www.cakephp.com.br/modules/news/

Acesse também o blog da ViperTech.com.br