Apostila Cakephp

Embed Size (px)

Citation preview

2009

CakePHP: Framework para Desenvolvimento WEB gil

Thiago Rheinheimer Costa Wesley Klewerton Guez Assuno

Tabela de ContedoIntroduo ao CakePHP.....................................................................................1O que o CakePHP?.......................................................................................................... 1 As origens do MVC............................................................................................................ 1 A arquitetura de uma aplicao MVC ............................................................................... 1 MVC no CakePHP .............................................................................................................. 2 Conveno de pastas do CakePHP .................................................................................... 2

Iniciando a construo de uma nova aplicao ................................................2 Views.................................................................................................................4Criando uma View............................................................................................................. 5 Prevenindo Javascript Injection ........................................................................................ 5

Entendendo os Controllers ................................................................................5Como as Actions so chamadas ........................................................................................ 6

Modelos (Models) .............................................................................................7Criando um modelo de dados........................................................................................... 7 Listando os registros ......................................................................................................... 8 Retornando um registro nico do banco de dados ......................................................... 10 Criando novos registros .................................................................................................. 12 Editando registros........................................................................................................... 14 Deletando registros ........................................................................................................ 16 Validao de dados......................................................................................................... 17

Rotas (Routes) .................................................................................................18 HTML Helpers..................................................................................................19O que so HTML Helpers................................................................................................. 19 Usando HTML Helpers..................................................................................................... 20

Introduo ao CakePHPO que o CakePHP? O CakePHP um Framework para desenvolvimento de aplicaes web no padro ModelosVises-Controladores (Models-Views-Controllers). Softwares que atendem os requisitos e que so de rpida manuteno/alterao, e tambm aqueles que so implementados usando boas prticas de desenvolvimento e padres, so os chamados Bons Softwares. Com o CakePHP, a construo de um software assim se torna fcil. Com este Framework, tambm possvel implementar usando Test-Driven-Development (TDD), ou seja, desenvolvimento orientado a testes. Este fato permite que tudo na aplicao possa ser testado e torna essa ferramenta muito poderosa. O uso de Test-Driven Development (desenvolvimento baseado em testes) no ser abordado durante este minicurso. As origens do MVC Os primeiros escritos sobre esse padro foram feitos em 1978 por Trygve Reenskaug, durante uma visita cientfica ao grupo Smalltalk. O padro foi chamado de Thing Model View Editor e rapidamente teve seu nome alterado para Model View Controller. A primeira implementao foi como parte da biblioteca de classes do Smalltalk, e era usado para criar interfaces grficas. A mudana radical aconteceu quando ele foi adaptado para aplicaes web, e muitas vezes chamado de Model 2 MVC Pattern. Hoje o MVC tambm est sendo usado por aplicaes web de diversas tecnologias, como o ASP.NET MVC, Ruby On Rails, Django, Tapestry (java), entre outras. A arquitetura de uma aplicao MVC Uma aplicao baseada em MVC est dividida nas partes: Modelos (Models) que contm toda a lgica da aplicao que no faz parte de uma Viso (View). Isso quer dizer que todas as regras de negcios, validaes e acesso a dados esto contidas no Modelo; Vises (Views) a camada de apresentao, a interface que ser mostrada para o usurio. Uma View contm todo o HTML e lgica necessrios para a correta exibio das pginas aos usurios; Controladores (Controllers) so responsveis por interagir entre os modelos e as vises. Contm a lgica de controle da aplicao que no est presente nas vises e nos modelos. Controla o fluxo da aplicao.

1 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

Separar a aplicao nessas trs partes muito interessante. Voc pode, por exemplo, modificar todo o layout de suas pginas sem encostar no restante da aplicao, modificando apenas as Views. MVC no CakePHP A arquitetura MVC no CakePHP pode ser visualizada na imagem abaixo:

Fonte: http://book.cakephp.org/view/10/Understanding-Model-View-Controller Conveno de pastas do CakePHP Quando iniciamos um novo projeto, os arquivos da nossa aplicao ficaro na pasta app. As principais pastas da aplicao so: app\config pasta que armazena as configuraes para acesso ao banco de dados, rotas, e o core da aplicao onde so configurados modo de debug entre outros; app\controllers armazena os controladores da aplicao (controllers); app\models os modelos criados na aplicao devero ser salvos nesta pasta; app\views container onde estaro todas as marcaes HTML que sero renderizadas no browser do usurio. a chamada interface do usurio; app\webroot pasta pblica da aplicao. a pasta onde salvamos contedo pblico como CSS, Javascripts, Imagens, entre outros. extremamente importante seguir estes padres e convenes para o correto funcionamento e organizao do projeto. Dessa maneira a aplicao se torna fcil de ser entendida, pois cada parte est no seu devido lugar.

Iniciando a construo de uma nova aplicaoO nosso primeiro passo ser fazer o download da verso estvel mais recente do CakePHP. Para isso, acesse o site http://www.cakephp.org e clique no boto ilustrado abaixo:2 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

Voc ser encaminhado at uma pgina que pede que escolha entre os arquivos disponveis. No caso de estar usando Windows, baixe o arquivo cake_1.2.4.8284.zip clicando sobre ele. Isso nos redirecionar para a pgina de doaes. Se no deseja efetuar uma doao, simplesmente clique no boto No, Thanks que voc ver ento a pgina com um link escrito Download Latest Release. Descompacte-o e nomeie o diretrio para minicurso, veja que voc dever estar com o diretrio igual a imagem abaixo:

O contedo completo do diretrio, incluindo os arquivos (exceto o .eprj que foi criado pelo etexteditor usado na edio dos arquivos para este material):

Em servidores Apache, basta criar um site apontando para este diretrio que acabamos de criar que essa aplicao j poder ser acessada no browser. Para desenvolvimento no Windows, uma boa opo para se usar o Xampp for Windows que j vem com Apache, MySQL, PHP 5.3 e outros. Voc pode baix-lo em http://www.apachefriends.org/en/xampp-windows.html. Veja parte da pgina que visualizada logo aps efetuar os passos anteriores:

3 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

Podemos ver na imagem acima que a parte amarela traz um aviso nos dizendo que devemos trocar o Security.salt da nossa aplicao. Como essa configurao est setada com o valor padro que o Cake traz, pois acabamos de descompactar os arquivos, devemos acessar o arquivo app\config\core.php e alterarmos essa configurao, veja na imagem abaixo:

Esta configurao, como podemos ver na imagem, est na linha 151 do arquivo citado, e atribui um valor ao Security.salt. Esse hash uma string randmica e usado nos mtodos de segurana. Troque apenas uma das letras por outra qualquer e salve o arquivo. Recarregando a pgina, no veremos mais aquele aviso visto anteriormente. Vamos aproveitar e criar o arquivo app\views\layouts\default.ctp com o contedo mostrado pela imagem abaixo:

Esse ser o layout padro para todas as pginas que abrirmos na aplicao. O contedo das pginas que abrirmos vai aparecer no local $content_for_layout exibido na figura acima.

ViewsAs views so as pginas que so renderizadas na tela do usurio.

4 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

As Views no CakePHP ficam na pasta app\views. Esta, por sua vez, possui uma pasta para cada controlador, para armazenar as views de cada um deles. Se tivermos dois controladores em nossa aplicao, HomeController e EventosController, ns teremos uma pasta em app\views\home que ir armazenar as views do respectivo controlador, e uma pasta app\views\eventos que armazenar as views do controlador EventosController. Criando uma View Para criar uma view basta adicionar um arquivo com extenso .ctp em uma pasta determinada. Se possuirmos um controlador de Relatrios na aplicao, teremos provavelmente uma view chamada vendas.ctp na pasta app\views\relatorios. O contedo de uma view nada mais do que marcao HTML combinada com cdigo PHP, quando necessrio. Prevenindo Javascript Injection Sempre que precisemos exibir uma informao na tela, devemos nos preocupar em usar o htmlspecialchars() do PHP para que javascript injection seja evitado.

Entendendo os ControllersUm controller pode ser adicionado criando um novo arquivo na pasta app\controllers com a extenso .php. O nome de um controller deve ser sempre seguido de Controller. Por exemplo, se queremos criar um controlador para fazer nossas aes de adio, excluso e consulta de eventos ns criaremos ele com o nome eventos_controller.php e a classe dever ter o nome EventosController pois o Cake tem na conveno que os nomes devem ser informados com iniciais maisculas e que o arquivo fsico ser com minsculas, mas separado com _ (underscore). Em um controlador as aes no passam de mtodos/funes. Cada action em um controller fica exposta para todos da internet acessem, por isso importante termos cuidado com o que criaremos. Veremos detalhes sobre controladores e aes mais adiante, no tpico de Models, pois onde comeamos a criar os Modelos e o restante dos nossos exemplos. Mas por agora, basta olhar a estrutura de um controlador na figura abaixo:

5 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

A figura acima mostra o esqueleto de um controlador que tem como arquivo fsico o app\controllers\eventos_controller.php. Veja que a classe declarada como EventosController sem o sinal de underscore e deve extender a classe AppController. A figura ainda nos d a idia de que ns faremos aes com os eventos, que so: lista (index), view (ver/detalhar), add (adicionar), edit (alterar), delete (apagar). Como as Actions so chamadas Na maioria das vezes as aes so executadas aps uma requisio do usurio. Essa requisio pode ser GET ou POST ou alguma delas usando AJAX. Nos controladores, para saber se a requisio foi feita via AJAX, devemos adicionar um componente chamado RequestHandler. Ento basta executarmos a verificao $this>RequestHandler->isAjax() para termos como resposta true ou false. Veja na figura abaixo:

Da mesma maneira, podemos usar isPost(), isGet(), isPut(), isDelete() no componente RequestHandler. Com esses comandos podemos controlar a execuo do cdigo dependendo do tipo da requisio.6 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

Modelos (Models)Podemos dizer que, basicamente, toda a lgica que no for de views e de controllers ser feita nos Modelos. Nos Models podemos fazer validao, regra de acesso a dados e regra de negcios. O CakePHP quase que completamente baseado no modelo de dados. Significa dizer que se criarmos nossas tabelas dando ateno s convenes de nomes que o framework usa, nos restar pouco trabalho a fazer nos Models, ou seja, teremos que apenas definir as associaes e algumas validaes. Criando um modelo de dados Primeiro devemos criar um banco novo no MySQL que ser usado para o nosso minicurso. Crie um banco de dados chamado minicurso. Aps termos criado o banco de dados, devemos configur-lo no arquivo app\config\database.php. Veja que se a primeira vez que iremos usar este arquivo, devemos primeiramente cri-lo renomeando o arquivo database.php.default para database.php. Veja na ilustrao abaixo como nossa configurao deve estar neste momento:

Agora vamos acessar o nosso banco de dados chamado minicurso usando o MySQL Query Browser e vamos criar uma tabela chamada eventos, veja a definio da tabela na ilustrao abaixo:

7 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

Veja que temos os dois ltimos campos chamados de created e modified. Estes campos sero gerenciados automaticamente pelo Cake sem termos que nos preocupar, por isso damos os nomes de acordo com as convenes usadas por ele. O campo id tambm ser identificado automaticamente. O fato de termos nomeado a tabela como eventos levar a termos um Model chamado Evento entre nossas classes. Vamos ento criar o arquivo app\models\evento.php, conforme figura abaixo:

Por termos salvo o arquivo na pasta models dentro da pasta app, e nomeado a classe como Evento, o Cake usar suas pluralizaes e efetuar comandos no banco de dados supondo que a tabela seja chamada de eventos. Listando os registros8 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

Agora que temos criado um de nossos Models, vamos listar os registros que temos na nossa tabela de Eventos. (inclua alguns eventos manualmente). A ao (action) index() do controle EventosController abaixo mostra como retornar todos os registros que temos na tabela eventos:

A linha 5 que nos interessa agora, pois ela est usando o comando $this->Evento>find(all) que faz com que todos os registros da tabela de eventos sejam retornados do banco de dados, e ento eles so passados para uma varivel da view chamada eventos. Como a conveno de nomes far com que o arquivo app\views\eventos\index.ctp seja renderizado no browser do usurio, basta criar esse arquivo que ter a lgica de exibio desses dados, ou seja, um famoso foreach do PHP que mostra os dados da varivel $eventos. Veja o cdigo do arquivo app\views\eventos\index.ctp na imagem abaixo:

Ao abrirmos, no browser, o endereo dessa nossa aplicao, http://localhost/eventos, veremos algo semelhante figura abaixo:

9 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

Retornando um registro nico do banco de dados Quando criamos actions para ver detalhes de um evento, por exemplo, ou at mesmo ao editar um registro, ns devemos retornar um nico registro do banco de dados, e no uma coleo deles. Nesse caso ns podemos usar o cdigo abaixo:

10 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

Veja que a funo detalhe est circulada em vermelho. Quando o usurio acessar http://localhost/eventos/detalhe/1 ele ver o contedo da view detalhe.ctp que deve estar localizada na pasta app\views\eventos\detalhe.ctp, conforme figura abaixo:

Isso mostrar apenas o registro que o usurio esteja solicitando. Veja como a pgina de detalhe de nosso exemplo ficou:

Veja que apenas o evento 1 est sendo exibido, ao contrrio da view index() que exibe todos os eventos que tiverem no banco de dados.

11 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

Criando novos registros Para criar novos registros ns devemos primeiro mostrar um formulrio ao usurio. S aps o usurio efetuar o POST desse formulrio que ele dever ser salvo no banco de dados. O cdigo do nosso EventosController, ilustrado na figura abaixo, mostra uma nova ao (function/action) chamada adicionar que verifica se h dados postados pelo usurio e, se houver, tenta salv-los no banco de dados e redireciona o usurio para a ao index(), do contrrio apenas mostrar a view para o usurio preencher o formulrio, considerando que ele queira adicionar um novo evento:

O cdigo tambm define uma mensagem para ser exibida ao usurio em caso de sucesso, dizendo: O evento foi adicionado!, e, logo aps, redireciona-o para a ao index() que no nosso caso nos mostrar novamente a lista de todos os eventos. Vamos agora criar o formulrio para a incluso do evento. Crie o arquivo app\views\eventos\adicionar.ctp com o cdigo conforme o da figura abaixo:

12 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

Aps salvar o arquivo acima podemos abrir nossa aplicao em http://localhost/eventos/adicionar e veremos uma pgina semelhante ilustrada pela figura abaixo:

Veja que o Cake detectou que o campo descrio um textarea automaticamente, pois no banco de dados criamos ele como TEXT. Preencha um ttulo e uma descrio e clique no boto Adicionar. Veja que isso causou um erro. De acordo com as convenes de nome do Cake, ao criar um form para um determinado Model ele supe que a action para adicionar add, apagar delete e para editar edit e, finalmente, para visualizar/detalhar e view. No nosso caso, criamos a ao com o nome

13 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

adicionar e o Frameworke est dando o POST para a ao add que no existe no nossoEventosController.

Para corrigir este problema podemos alterar nossa ao e nossa view para add ao invs de adicionar. Outra maneira alterar o cdigo do arquivo app\views\eventos\adicionar.ctp para o cdigo mostrado na figura abaixo:

Veja que na primeira linha, onde criamos o formulrio, devemos informar qual a ao que responsvel por receber os dados preenchidos. Agora basta abrir novamente o http://localhost/eventos/adicionar, preencher o formulrio e clicar em adicionar. Aps feito isso, seremos redirecionados para /eventos que nos mostrar a lista dos eventos incluindo o que acabamos de lanar! Editando registros Vamos adicionar uma action chamada edit ao nosso EventosController, veja o cdigo na figura abaixo:

14 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

Agora basta criarmos o arquivo app\views\eventos\edit.ctp com o cdigo igual o da imagem abaixo:

Veja que neste caso, na primeira linha, diferentemente do que fizemos no arquivo adicionar.ctp, ns no precisamos informar para qual action o formulrio ser enviado, pois criamos ela de acordo com as convenes adotadas pelo Cake. Outro destaque o da linha 5,15 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

como estamos alterando um registro devemos colocar o id no formulrio para que o Framework saiba montar a SQL de alterao. Agora podemos acessar http://localhost/eventos/edit/1 e fazermos uma alterao e clicarmos em Salvar. Deletando registros O correto, na deleo de registros, exibir uma pgina para o usurio pedindo a confirmao se ele deseja ou no remover e o boto de confirmao ser um POST para a ao. Isso evita que buscadores que acessem o link via GET deletem seus registros. Vamos criar uma ao chamada delete no nosso EventosController, veja na figura abaixo:

16 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

Isso nos permite acessar o endereo http://localhost/eventos/delete/1 que remover o evento com id=1 do banco de dados e nos redirecionar para a lista de eventos mostrando uma mensagem que O evento foi removido!. Veja que no exemplo no usamos uma verificao do tipo da requisio para deletar. Como explicado anteriormente, o correto seria verificar com (!$this->RequestHandler->isGet()) para ter certeza de que a requisio no foi via GET e caso tenha sido, exibir uma pgina de confirmao. Validao de dados Sim, j podemos adicionar, apagar, alterar e listar nossos eventos. Mas e o que acontece se tentarmos salvar um evento sem prencher o ttulo e a descrio? Se fizermos o teste veremos que um novo evento includo com o ttulo e a descrio em branco. Isso no um bom sinal, ? Est faltando alguma coisa? Sim! Est faltando validao de dados! De acordo com o MVC, a validao dos dados no deve ser feita nas vises e nem nos controladores. Os resposveis pelas regras de negcios e validaes so os Models, ento vamos dizer aos nossos models algumas restries que devem ser verificadas antes de salvar um evento! Veja o cdigo ilustrado na figura abaixo:

O arquivo acima o app\models\evento.php. Adicionamos validao para o ttulo e a descrio, dizendo que no podem ser vazios. Aps tentar novamente incluir um evento sem informar o ttulo, vemos algo semelhante ao que segue abaixo:

17 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

O problema aqui que a mensagem automtica e em ingls. Para informarmos noss prpria mensagem, podemos modificar umpouco a validao, como segue na figura abaixo:

H inmeras validaes que podem ser feitas alm dessa. Pode ser validado usando regular expression, condies sql, tamanho do campo, entre outros. Para detalhamento completo http://book.cakephp.org. de todas as validaes disponveis acesse

Rotas (Routes)As rotas so os mapeamentos de requisies feitas pelo Browser para um controlador e uma ao especficos. No Cake, a requisio feita pelo usurio enviada ao dispatcher que localiza a rota que ser usada e passa essa requisio para o controlador, executando uma determinada ao deste ltimo. Veja a ilustrao abaixo:

18 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

Fonte: http://book.cakephp.org/view/21/A-Typical-CakePHP-Request O arquivo para a configurao das rotas, no Cake, o arquivo routes.php que se encontra no diretrio app\config\routes.php. Ento atravs das rotas que nossa aplicao sabe qual ao de qual controlador para ser executada quando determinada requisio efetuada. Se um usurio acessar http://www.meusite.com muito provvel que a pgina que ele visualize seja uma view chamada index em um controller chamado home. Para isso, nosso arquivo de rotas deve ter uma configurao parecida com a abaixo: Router::connect('/', array('controller' => 'home', 'action' => 'index')); Por padro, no CakePHP, a ao index chamada em um controller quando nenhuma ao passada na requisio. Por isso se acessamos /eventos da nossa aplicao, ser executada a ao index do EventosController.

HTML HelpersO que so HTML Helpers HTML Helpers podem tornar a tarefa de fazer views mais fcil. Eles simplesmente renderizam algum cdigo HTML que pode ser usado em todas as suas views simplesmente chamando . Alguns Helpers j esto includos no CakePHP, e outros podem ser customizados de acordo com as nossas necessidades.19 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton

Usando HTML Helpers H inmeros helpers que j esto prontos para serem usados. No s HTML Helpers como tambm outros helpers que renderizam forms, trabalham com cache, com requisies ajax, com paginao, RSS, Session, Javascript, entre outros. Ao usar, por exemplo, $html->link(Texto do link, array(controller => eventos, action => index)), ns estaremos fazendo um atalho para um .... Para uma lista completa de todas as possibilidades, podemos acessar o site http://book.cakephp.org.

20 Minicurso de CakePHP. Autores: Thiago Rheinheimer Costa e Wesley Klewerton