Manual Cake12

Embed Size (px)

Citation preview

MANUAL CAKEPHP 1.2Juan Basso

3 de maro de 2008

SumrioPARTE I. COMEANDO COM CAKEPHP ......................................................................7Prefcio ................................................................................................................................................. 7 Requisitos do leitor .................................................................................................................................. 7 Introduo ao CakePHP ......................................................................................................................... 7 O que CakePHP? Por que usar? ............................................................................................................. 7 Onde obter ajuda? ................................................................................................................................... 8 Entendendo o Model-View-Controller (MVC) ........................................................................................ 9 Introduo ................................................................................................................................................ 9 Benefcios ............................................................................................................................................... 10

PARTE II.

PRINCPIOS BSICOS DO CAKEPHP ....................................................... 11

Estrutura CakePHP ............................................................................................................................... 11 Extenses de controller ......................................................................................................................... 11 Extenses de view .................................................................................................................................. 11 Extenses do model ............................................................................................................................... 11 Extenses de aplicao .......................................................................................................................... 12 Estrutura de arquivos do CakePHP ....................................................................................................... 12 Estrutura do diretrio App ..................................................................................................................... 13 Requisio tpica do CakePHP .............................................................................................................. 13 Convenes CakePHP ........................................................................................................................... 15 Convenes de arquivos e nome de classes .......................................................................................... 15 Convenes de modelos ........................................................................................................................ 15 Convenes de controladores................................................................................................................ 15 Convenes de vises ............................................................................................................................ 16

PARTE III.

DESENVOLVENDO COM CAKEPHP ...................................................... 17

Requisitos ............................................................................................................................................ 17 Preparativos para instalao................................................................................................................ 17 Baixando o CakePHP .............................................................................................................................. 17 Permisses ............................................................................................................................................. 17 Instalao ............................................................................................................................................ 18 Desenvolvimento ................................................................................................................................... 18 Produo ................................................................................................................................................ 18 Instalao avanada ............................................................................................................................... 19 Caminho de classes adicionais ........................................................................................................... 20

i

Apache e mod_rewrite .......................................................................................................................... 20 Comece agora! ....................................................................................................................................... 20 Configurao........................................................................................................................................ 21 Configurao da base de dados ............................................................................................................. 21 Configurao do ncleo ......................................................................................................................... 22 As classes de configurao ..................................................................................................................... 22 Classes de configurao ..................................................................................................................... 22 Variveis de configurao do ncleo ................................................................................................. 22 Constantes de configurao .............................................................................................................. 22 Configurao de rotas (Routes) ............................................................................................................. 22 Inflexo personalizada ........................................................................................................................... 23 Configurao de inicializao (bootstrap) .............................................................................................. 24 Controllers (Controladores) ................................................................................................................. 24 Introduo .............................................................................................................................................. 24 Atributos ................................................................................................................................................ 25 $name ................................................................................................................................................ 25 $components, $helpers e $uses ........................................................................................................ 25 Relativo pgina: $layout e $pageTitle ............................................................................................. 26 Atributos dos parmetros ($params) ................................................................................................ 26 Outros atributos ................................................................................................................................ 27 Mtodos ................................................................................................................................................. 28 Interagindo com as vises ................................................................................................................. 28 Fluxo de controle ............................................................................................................................... 29 Callbacks ............................................................................................................................................ 29 Outros mtodos ................................................................................................................................. 30 Components (Componentes) ............................................................................................................... 33 Introduo .............................................................................................................................................. 33 Construindo componentes personalizados............................................................................................ 33 Acessando classes do MVC de dentro dos componentes ...................................................................... 34 Models (Modelos)................................................................................................................................ 34 Introduo .............................................................................................................................................. 34 Campos mgicos .................................................................................................................................... 34 Atributos ................................................................................................................................................ 34 Mtodos ................................................................................................................................................. 34 Associaes ............................................................................................................................................ 34 Introduo ......................................................................................................................................... 34 hasOne ............................................................................................................................................... 35 belongsTo .......................................................................................................................................... 37 hasMany ............................................................................................................................................ 38 hasAndBelongsToMany (HABTM) ...................................................................................................... 41 Salvando dados em tabelas relacionadas (hasOne, hasMany, belongsTo) ....................................... 43 Salvando dados em tabelas relacionadas (HABTM) .......................................................................... 44 Criando e removendo relaes durante execuo ............................................................................ 45 DataSources ........................................................................................................................................... 47 Behaviors................................................................................................................................................ 47

ii

Introduo ......................................................................................................................................... 47 Usando Behaviors .............................................................................................................................. 47 TreeBehavior ..................................................................................................................................... 47 TranslateBehavior .............................................................................................................................. 47 ACLBehavior ....................................................................................................................................... 47 Views (Vises)...................................................................................................................................... 47 Templates / Skin ..................................................................................................................................... 47 Layouts ................................................................................................................................................... 48 Elements (Elementos) ............................................................................................................................ 50 Helpers (Ajudantes) ............................................................................................................................. 50 Introduo .............................................................................................................................................. 50 Helpers do CakePHP ............................................................................................................................... 51 Criando helpers ...................................................................................................................................... 52 Incluindo outros helpers .................................................................................................................... 52 Usando seus helpers personalizados ................................................................................................. 53 Contribuindo ...................................................................................................................................... 53 Scaffolding ........................................................................................................................................... 53 Introduo .............................................................................................................................................. 53 Personalizando os scaffolds ................................................................................................................... 54 CakePHP Console ................................................................................................................................. 55 Introduo .............................................................................................................................................. 55 Criando Shells e Tasks ............................................................................................................................ 55 Criando suas Shells ............................................................................................................................ 55 Tasks .................................................................................................................................................. 55 Gerando cdigo com Bake ................................................................................................................... 55 Plugins ................................................................................................................................................. 55 Criando um plugin .................................................................................................................................. 55 Plugin de controladores ..................................................................................................................... 55 Plugin de modelos ............................................................................................................................. 55 Plugin de vises ................................................................................................................................. 55 Plugin de informaes ....................................................................................................................... 55 Constantes e funes globais ............................................................................................................... 55 Funes globais ...................................................................................................................................... 55 Constantes do ncleo ............................................................................................................................. 58 Constantes do diretrio ......................................................................................................................... 58

PARTE IV. TAREFAS COMUNS COM CAKEPHP ......................................................... 60Validao de dados .............................................................................................................................. 60 Regras simples ....................................................................................................................................... 60 Uma regra por campo ............................................................................................................................ 60 rule ..................................................................................................................................................... 60

iii

required ............................................................................................................................................. 60 allowEmpty ........................................................................................................................................ 60 on ....................................................................................................................................................... 60 message ............................................................................................................................................. 60 Mltiplas regras por campo ................................................................................................................... 60 Construindo regras de validao ............................................................................................................ 60 alphaNumeric .................................................................................................................................... 60 between ............................................................................................................................................. 60 blank .................................................................................................................................................. 60 cc ........................................................................................................................................................ 60 comparison ........................................................................................................................................ 60 date .................................................................................................................................................... 60 email .................................................................................................................................................. 60 ip ........................................................................................................................................................ 60 minLength .......................................................................................................................................... 60 maxLength ......................................................................................................................................... 60 numeric .............................................................................................................................................. 60 phone ................................................................................................................................................. 60 postal ................................................................................................................................................. 60 ssn ...................................................................................................................................................... 60 url ....................................................................................................................................................... 60 Regras de validao personalizada ........................................................................................................ 60 Validao por expresses regulares personalizadas ......................................................................... 61 Validao por mtodos personalizados ............................................................................................. 61 Limpeza de dados ................................................................................................................................ 61 Manipulao de erros .......................................................................................................................... 61 Debugando .......................................................................................................................................... 61 Gerando caches ................................................................................................................................... 61 Logando ............................................................................................................................................... 61 Introduo .............................................................................................................................................. 61 Usando as funes de log ...................................................................................................................... 61 Testando .............................................................................................................................................. 62 Internacionalizando ............................................................................................................................. 62 Definindo o locale da sua aplicao ....................................................................................................... 62 Internacionalizando em CakePHP .......................................................................................................... 63 Paginao ............................................................................................................................................ 64 Configurando os controladores ............................................................................................................. 64 Paginando nas vises ............................................................................................................................. 64 Paginando com AJAX .............................................................................................................................. 64 Alteraes no layout .......................................................................................................................... 64 Alteraes nas vises ......................................................................................................................... 64

iv

PARTE V.

COMPONENTES INTERNOS ....................................................................... 65

Lista de controle de acessos (ACL)........................................................................................................ 65 Autenticao........................................................................................................................................ 65 Sesses ................................................................................................................................................ 65 Manipulando requisies ..................................................................................................................... 65 Segurana ............................................................................................................................................ 65 E-mail .................................................................................................................................................. 65 Cookies ................................................................................................................................................ 65 Introduo .............................................................................................................................................. 65 Configurando os controladores ............................................................................................................. 65 Usando o componente ........................................................................................................................... 65

PARTE VI. HELPERS INTERNOS .................................................................................... 66Formulrios ......................................................................................................................................... 66 Criando formulrios ............................................................................................................................... 66 $options['type'].................................................................................................................................. 66 $options['action'] ............................................................................................................................... 67 $options['url'] .................................................................................................................................... 67 $options['default'] ............................................................................................................................. 67 Fechando formulrios ............................................................................................................................ 68 Elemento de formulrio mgico ............................................................................................................ 68 $options['type'].................................................................................................................................. 69 $options['before'], $options['between'] e $options['after'].............................................................. 69 $options['options']............................................................................................................................. 69 $options['multiple'] ........................................................................................................................... 70 $options['maxLength'] ....................................................................................................................... 70 $options['div'] .................................................................................................................................... 70 $options['label'] ................................................................................................................................. 70 $options['id'] ...................................................................................................................................... 70 $options['error'] ................................................................................................................................ 70 $options['selected'] ........................................................................................................................... 70 $options['rows'], $options['cols'] ...................................................................................................... 70 $options['empty'] .............................................................................................................................. 70 $options['timeFormat'] ...................................................................................................................... 70 $options['dateFormat'] ...................................................................................................................... 71 Mtodos especficos do elemento de formulrio .................................................................................. 71 HTML ................................................................................................................................................... 73 Inserindo elementos bem-formados ..................................................................................................... 73 JavaScript............................................................................................................................................. 73

v

AJAX ....................................................................................................................................................... 73 Opes do AjaxHelper ............................................................................................................................ 73 Opes gerais..................................................................................................................................... 73 Opes de callback ............................................................................................................................ 73 Mtodos ................................................................................................................................................. 73 Cache ................................................................................................................................................... 73 Form .................................................................................................................................................... 73 Number ............................................................................................................................................... 73 Text ..................................................................................................................................................... 73 Time..................................................................................................................................................... 73

PARTE VII.

EXEMPLOS .................................................................................................. 74

Tutorial de como fazer um blog em CakePHP ....................................................................................... 74 Sistema simples de autenticao de usurios ...................................................................................... 74

PARTE VIII.

APNDICES ................................................................................................. 75

Escritores da verso inglesa ................................................................................................................. 75 Tradutores para lngua portuguesa ...................................................................................................... 75 Apoio e reviso da verso traduzida ...................................................................................................... 75 Inflexo em portugus ......................................................................................................................... 75

vi

Comeando com CakePHP

7

Parte I.Prefcio

Comeando com CakePHP

Bem vindo ao paraso de desenvolvimento web. Se voc est lendo o prefcio de um manual tcnico, porque est lhe sobrando bastante tempo. No somos celebridades e o material o que vem depois. Voc pode pular estes captulos suprfluos e ir direto ao ponto nas sees que voc quer. Requisitos do leitor Para ler este manual, voc j deve estar familiarizado com o PHP. Conhecer de programao orientada a objeto ir lhe ajudar bastante, porm eu suponho que as sees de introduo deste manual serviro como um bom exemplo do que vem pela frente. Com isso, este material escrito para desenvolvedores de todos os nveis de habilidade que desejam criar algo robusto, sustentvel, rpido e agradvel. Devo alertar que haver sees que abordam tecnologias que esto realmente fora do mbito deste manual. Administrao de servidor Web, AJAX e JavaScript, por exemplo, podem ser mencionados em partes do texto, mas na maior parte do texto ns estaremos focado no CakePHP.

Introduo ao CakePHPO que CakePHP? Por que usar? CakePHP gratuito, de cdigo aberto, uma framework em PHP para desenvolvimento gil. uma estrutura fundamental para programadores criarem aplicaes web. Nosso principal objetivo permitir que voc trabalhe em uma estrutura que possa programar de forma rpida e sem a perda de flexibilidade. CakePHP joga fora a monotonia do desenvolvimento web. Ns oferecemos todas as ferramentas que voc precisa para comear programando o que realmente deseja: a lgica especfica da sua aplicao. Em vez de reinventar a roda cada vez que se constri um novo projeto, pegue uma cpia do CakePHP e comece a construir sua carruagem real da sua aplicao. CakePHP tem uma equipe de desenvolvedores e uma grande comunidade, trazendo grande valor ao projeto. Alm de manter voc fora do reinvento da roda, usando CakePHP significa que o ncleo da sua aplicao bem testado e constantemente aperfeioado. Abaixo segue uma pequena lista dos recursos que voc poder desfrutar no CakePHP: Ativo e com comunidade amigvel; Licena flexvel; Compatibilidade com PHP 4 e PHP 5; Integrando funcionalidade CRUD (Create, Read, Update and Delete, ou Criar, Ler, Atualizar e Excluir) para interagir com o banco de dados;

Comeando com CakePHP

8

Aplicaes scaffolding; Gerao de cdigo; Arquitetura MVC (Model, View, Controller, ou Modelo, Vises, Controlador); Requisies ao expedidor com clareza, URLs personalizveis e rotas; Validaes internas; Templates rpidos e flexveis (Sintaxe PHP e com ajudantes); Ajudantes para usar AJAX, JavaScript, HTML, formulrios e outros nas vises; Componentes de E-mail, Cookie, Segurana, Sesses, Manipulao de Requisies e outros; Lista de controle de acessos flexvel; Limpeza de dados; Flexibilidade com cache; Internacionalizao; Funciona em qualquer subdiretrio do seu website, com poucas configuraes do Apache.

Onde obter ajuda? Voc comeou no lugar certo. Este manual (e a API) deve ser provavelmente o primeiro lugar que voc v para procurar as respostas das suas dvidas. Assim como acontece com muitos outros projetos de cdigo aberto, ns obtemos novos usurios regularmente. Tentamos ser os melhores para responder seus questionamentos em primeiro lugar. As respostas podem demorar a chegar, mas permanecer por tempos e ajudar a esclarecer outras pessoas. Tanto o manual, quanto a API podem ser encontradas online. http://manual.cakephp.com.br (em portugus) http://manual.cakephp.org (em ingls) http://api.cakephp.org/1.2 (em ingls) Se voc estiver assustado, d um grito pelo canal de IRC internacional ou entre no grupo da comunidade luso-brasileira. Alm da equipe de desenvolvimento do ncleo do CakePHP no canal, principalmente durante o dia. Se voc precisar de alguma ajuda, deseja encontrar usurios na sua rea ou gostaria de doar o novo carro esportivo, gostaramos de falar com voc. Grupo da comunidade luso-brasileira: http://groups.google.com/group/cake-php-pt #cakephp-pt @ irc.freenode.net (em portugus) #cakephp @ irc.freenode.net (em ingls) O CakePHP Bakery uma casa para todas as coisas de CakePHP. Visite este site para ver tutoriais, estudos de caso e exemplos de cdigo. Assim que estiver familiarizado com o CakePHP, faa o login e compartilhe seus conhecimentos com a comunidade para ganhar fama e fortuna. http://bakery.cakephp.org

Comeando com CakePHP

9

O CakeForge outro recurso que os desenvolvedores podem usar para hospedar seus projetos usando CakePHP e compartilhar com outras pessoas. Se voc est olhando para achar projetos existentes, ou querendo compartilhar, acesso o CakeForge. http://www.cakeforge.org O site oficial do CakePHP est sempre esperando sua visita. Ele tem links para sites de outros desenvolvedores, screencasts, oportunidade para doar ao projeto e downloads. http://www.cakephp.org

Entendendo o Model-View-Controller (MVC)Introduo Aplicaes bem escritas em CakePHP segue o design pattern MVC (Model-View-Controller ou Modelo-Viso-Controlador). Programando em MVC separa sua aplicao em trs partes principais. O model representa os dados, a view representa a visualizao dos dados e o controller manipula e roteia as requisies dos usurios.

Figura 1. Requisio tpica do CakePHP

A Figura 1 mostra um exemplo de uma simples requisio MVC em CakePHP. Para fins ilustrativos, digamos que um usurio chamado Ricardo apenas clicou no link Comprar um bolo personalizado agora! da sua aplicao. 1. Ricardo clica no link apontando para http://www.exemplo.com.br/cakes/comprar e seu navegador faz uma requisio ao site; 2. O dispatcher (expedidor) verifica a URL requisitada (/cakes/comprar) e redireciona ao controller correto; 3. O controller executa a lgica especfica da aplicao. Por exemplo, verifica se o Ricardo est logado; 4. O controller tambm usa os models para acessar os dados da sua aplicao. Muitas vezes, os models representam as tabelas do banco de dados, mas podem representar registros LDAP, feeds de RSS ou at mesmo arquivos do sistema. Neste exemplo, o controller usa o model para trazer ao Ricardo as ltimas compras do banco de dados; 5. Depois que o controller fez sua mgica sobre os dados, ele repassa para a view. A view faz com que os dados fiquem prontos para a representao do usurio. As views em CakePHP normalmente vem no formato HTML, mas pode ser facilmente exibidas em

Comeando com CakePHP

10

PDF, documento XML, um objeto JSON ou outro formato qualquer, dependendo da sua necessidade; 6. Uma vez que a viso tenha usado os dados provenientes do controller para construir a pgina, o contedo retornado ao browser do Ricardo. Aproximadamente toda requisio da sua aplicao seguir o modelo bsico do modelo. Ns vamos especificar os detalhes mais adiante, mas mantenha essa viso geral no seu pensamento. Benefcios Por que usar MVC? Porque um verdadeiro padro de desenvolvimento (design pattern) e torna fcil a manuteno da sua aplicao, com pacotes modulares de rpido desenvolvimento. Elaborar tarefas divididas entre models, views e controllers, faz com que sua aplicao fique leve e independente. Novas funcionalidades so facilmente adicionadas e dar nova cara nas caractersticas antigas pode ser feitas num piscar de olhos. O design modular e separado tambm permite aos desenvolvedores e designers trabalhem simultaneamente, incluindo a habilidade de um construir um rpido prottipo. A separao tambm permite que os desenvolvedores alterem uma parte da aplicao sem afetar outras. Se voc nunca desenvolveu uma aplicao neste sentido, isso vai lhe agradar muito, mas estamos confiantes que depois de construir sua primeira aplicao em CakePHP, voc no vai querer voltar atrs.

Princpios bsicos do CakePHP

11

Parte II.

Princpios bsicos do CakePHP

Estrutura CakePHPCakePHP possui a caracterstica de usar as classes de Controller, Model e View, mas tambm possui classes e objetos adicionais que fazem o desenvolvimento em MVC mais rpido e agradvel. Components, Behaviors e Helpers so classes que proporcionam extensibilidade e reuso para adicionar funcionalidades rapidamente base MVC das suas aplicaes. Agora vamos comear a subir um pouco o nvel para analisar os detalhes de como usar estas ferramentas mais tarde. Extenses de controller O Component (Componente) uma classe que ajuda na lgica do controller. Se voc tem a mesma lgica e quer compartilhar entre controllers (ou aplicaes), o component uma boa sada. Por exemplo, o component interno EmailComponent cria e envia e-mails em segundo plano. Ao invs de escrever um mtodo em cada controller que utiliza esta lgica, pode-se criar um component que empacote esta funcionalidade e seja compartilhado entre os controllers. Controllers tambm so equipados com callbacks. Estes callbacks esto disponveis para que voc possa utilizar, apenas se voc precisar inserir uma lgica entre operaes do ncleo do CakePHP. Os callbacks disponveis incluem: beforeFilter(), executado antes de qualquer ao do controller; beforeRender(), executado depois da lgica do controller, mas antes da view ser renderizada; afterFilter(), executado depois de todas as lgicas do controller, incluindo a renderizao da view. No h diferena entre afterRender() e afterFilter(), exceto que voc tenha feito uma chamada manualmente para render() no seu mtodo do controller e tenha includo alguma lgica depois dessa chamada.

Extenses de view O Helper (Ajudante) a classe que ajuda na lgica da view. Assim como o component ajuda o controller, os helpers permitem a apresentao lgica ser acessada e compartilhada entre as views. AjaxHelper um dos principais helpers. Ele faz requisies AJAX facilmente de dentro das views. A maioria das aplicaes tem partes do cdigo que so usados repetidamente nas views. CakePHP facilita o reuso de cdigo na view com a utilizao de layouts e elements (elementos). Por padro, toda view renderizada por um controller seguindo algum layout. Os elements so como pequenos trechos de cdigo necessrios que podem ser reutilizados em diversas views. Extenses do model Assim como as outras extenses, os Behaviors funcionam do mesmo modo, adicionando funcionalidades entre os models. Por exemplo, se voc armazenar os dados do usurio em uma estrutura de rvore, voc pode especificar o model User como comportamento de rvore e ganhar funcionalidades para remover, adicionar e alterar ns em sua estrutura de rvore fundamental.

Princpios bsicos do CakePHP

12

Os models tambm so suportados por outra classe chamada DataSource. DataSources so abstraes que permitem os models manipularem diferentes tipos de dados consistentemente. Enquanto a principal fonte de dados numa aplicao CakePHP via banco de dados, voc pode escrever DataSources adicionais que permitem seu model representar um feed RSS, arquivo CSV, entidades LDAP ou eventos iCal. DataSources permite voc associar registros de diferentes fontes: ao invs de limitar em joins do SQL, DataSources permitem voc chamar seu model de LDAP que est associada a vrios eventos iCal. Assim como nos controllers, models tm recursos de callback como: beforeFind() afterFind() beforeValidate() beforeSave() afterSave() beforeDelete() afterDelete()

Os nomes desses mtodos devem ser descritivos o bastante para que voc saiba o que eles fazem. Certifique-se de pegar os detalhes no captulo sobre model. Extenses de aplicao Tanto os controllers, helpers e models tm uma classe pai que voc pode usar para definir modificaes na aplicao. AppController (localizado em /app/app_controller.php), AppHelper (localizado em /app/app_helper.php) e AppModel (localizado em /app/app_model.php) so bons lugares para colocar mtodos que voc precisa para acessar entre todos os controllers, helpers e models. Embora no sejam classes ou arquivos, as rotas definem regras na requisio feita para o CakePHP. As definies das rotas definem como o CakePHP deve mapear uma URL para um mtodo do controller. O behavior padro assume que a URL /controller/action/var1/var2 mapeia para Controller::action($var1, $var2), mas voc pode usar rotas para personalizar URLs e como elas devem ser interpretadas pela sua aplicao. Alguns recursos na sua aplicao podem ser empacotados com mrito. Um plugin um pacote de model, controller e view que realiza um objetivo especfico que pode abranger vrios aplicativos. Um sistema de gesto de usurios ou um blog simplificado podem ser bons exemplos de plugins para CakePHP.

Estrutura de arquivos do CakePHPVamos dar uma olhada o que o CakePHP fora da caixa. Voc que o CakePHP utiliza-se da requisio bsica do MVC, mas no sabe como que os arquivos so organizados. app cake docs index.php

Princpios bsicos do CakePHP

13

vendors

Quando voc faz o download do CakePHP, voc ver que possui quatro pastas principais. A pasta app ser o lugar da sua mgica: aqui sero guardados os arquivos da sua aplicao. A pasta cake onde a mgica acontece. Faa um compromisso pessoal de no editar os arquivos desta pasta! Ns no ajudamos voc se voc modific-la. A pasta docs contm as informaes de alteraes, licena, etc. Finalmente, a pasta vendors onde voc colocar aplicativos de terceiros para utilizar na aplicao, por exemplo, jQuery, prototype, FCKEditor, etc. Estrutura do diretrio App A pasta app do CakePHP onde normalmente voc colocar sua aplicao em desenvolvimento, Vamos dar uma olhada mais de perto dentro desta pasta.Tabela 1. Descrio dos diretrios de app

Diretrio config

controllers locale models plugins tmp

vendors

views webroot

Descrio Contm os arquivos de configurao. Detalhes das conexes ao banco de dados, bootstrapping, arquivos de configurao do ncleo e outros devem ser armazenados aqui. Contm os controllers da sua aplicao e seus components. Guarda os arquivos com as strings para internacionalizaao. Contm os models, behaviors e datasources da sua aplicao. Contm os pacotes de plugins. Aqui onde o CakePHP armazena os arquivos temporrios. Os dados atuais so armazenados onde voc tenha configurado o CakePHP, mas esta pasta normalmente usada para guardar a descrio dos models, logs e outras informaes, como as das sesses. Qualquer classe ou biblioteca de terceiro deve ser armazenada aqui. Para fazer um acesso rpido e fcil, use a funo vendors(). Voc pode achar que esta pasta redundante, j que existe uma pasta com mesmo nome no nvel superior da estrutura. Ns vamos ver diferenas entre estas duas pastas quando discutirmos sobre manipulao de mltiplas aplicaes e sistemas mais complexos. Arquivos de apresentao devem vir aqui: elements, pginas de erro, helpers, layouts e arquivos de views. No modo de produo, esta pasta deve servir como a pasta raiz da sua aplicao. Dentro desta pastas so guardados os arquivos pblicos, como estilos CSS, imagens e arquivos de JavaScript.

Requisio tpica do CakePHPNs cobrimos os ingredientes bsicos no CakePHP, ento vamos ver como cada objeto funciona em uma completa requisio. Continuando com nossa requisio original de exemplo, vamos imaginar que nosso amigo Ricardo tenha clicado no link em Comprar um bolo personalizado agora! da sua aplicao CakePHP.

Princpios bsicos do CakePHP

14

Figura 2. Requisio tpica no CakePHP. Em preto, elemento necessrio; Em cinza, elemento opcional; Em azul, callback

1. Ricardo clica no link apontando para http://www.exemplo.com.br/cakes/buy, e seu navegador faz a requisio ao seu servidor de web; 2. O roteador processa a URL, extraindo os parmetros desta requisio: o controller, action (ao) e qualquer outro argumento que vai afetar na lgica do negcio durante esta requisio; 3. Usando rotas, a requisio da URL mapeada para a action do controller (um mtodo especfico da classe do controller). Neste caso, o mtodo buy() do CakesController. O callback beforeFilter() do controller chamado antes de qualquer action do controller ser executada; 4. O controller pode usar mtodos para ter acesso aos dados da aplicao. Neste exemplo, o controller usa o model para ver no banco de dados as ltimas compras de Ricardo. Qualquer callback aplicvel do modelo, behaviors e DataSources podem ser aplicados durante esta operao. Enquanto um model no necessrio, todos os controllers do CakePHP inicialmente requisitam de pelo menos um model; 5. Depois do model ter adquiridos os dados, ele retorna-os ao controller. Podem ser aplicados callbacks no model; 6. O controller pode usar components para refinar os dados ou efetuar outras operaes (manipular sesses, autenticao ou enviar e-mails, por exemplo); 7. Uma vez que o controller tenha usado os models e os components para preparado os dados suficientemente, estes dados so repassados as views usando o mtodo set() do controller. Callbacks dos controllers podem ser aplicados antes dos dados serem enviados. A lgica da view efetuada, podendo incluir elements ou helpers. Por padro, as views so sempre renderizadas dentro de um layout; 8. Alm disso, callbacks dos controllers (como afterFilter) pode ser aplicado. Para completar, o cdigo renderizado pela view vai para o navegador do Ricardo.

Princpios bsicos do CakePHP

15

Convenes CakePHPNs somos grandes fs de convenes nas configuraes. Enquanto isso toma um pouco de tempo para aprender as convenes do CakePHP, voc ganha tempo em um longo processo: seguindo as convenes, voc ganha funcionalidades gratuitamente e livra-sede madrugas de manuteno de arquivos de configurao. Convenes tambm fazem com que o sistema fique uniformemente desenvolvido, permitindo outros desenvolvedores o ajudem mais facilmente. Convenes no CakePHP tem sido produzida por anos de experincia em desenvolvimento web e boas prticas. Enquanto ns sugerimos voc a usar essas convenes enquanto desenvolve em CakePHP, ns devemos mencionar que muitos desses princpios so facilmente sobrescritos por alguma coisa que especialmente passado quando trabalha-se com sistemas legados. Convenes de arquivos e nome de classes Em geral, nome dos arquivos so sublinhados, enquanto nome de classes so CamelCased, ou seja, primeiras letras das palavras em maisculo. A classe KissesAndHugsController pode ser encontrada no arquivo kisses_and_hugs_controller.php, por exemplo. Porm, o nome da class e seu tipo no so necessariamente encontrados no nome do arquivo. A classe EmailComponent encontrada no arquivo chamado email.php e a classe HtmlHelper encontrada no arquivo html.php. Convenes de modelos Nome das classes de modelo devem ser no singular e CamelCased. Person, BigPerson e ReallyBigPerson so todos os exemplos de nomes convencionados para modelos. Os nomes das tabelas correspondem ao nome do modelo do CakePHP, mas no plural e sublinhados. As tabelas para os modelos mencionados anteriormente devem ser people, big_people e really_big_people, respectivamente. Tabelas associadas, usadas em relaes hasAndBelongsToMany entre modelos, devem ser nomeadas depois dos modelos das tabelas que a compem, em ordem alfabtica (apples_zebras em vez de zebras_apples). Se sua aplicao possui esse tipo de relao entre os modelos Tag e Post, o nome deve ser posts_tags. Convenes de controladores O nome das classes de controladores so no plural, CamelCased e no final Controller. PeopleController, BigPeopleController e ReallyBigPeopleController so todos os exemplos convencionais para nome de controladores. A primeira funo que voc deve escrever em um controlador deve ser o mtodo index(). Quando algum requisita um controlador sem ao, o behavior padro renderizar o mtodo index() do controlador. Por exemplo, a requisio para http://www.exemplo.com.br/apples/ mapeia para a chamada da funo index() do ApplesController, assim como http://www.exemplo.com.br/apples/view mapeia para a chamada da funo view() no ApplesController.

Princpios bsicos do CakePHP

16

Voc tambm pode alterar a visibilidade das funes do controlador em CakePHP colocando sublinhados na frente do nome das funes. Se a funo do controlador estiver com sublinhado na frente, a funo no ser disponibilizada para acesso da web atravs do dispatcher, mas estar disponvel para uso interno. Convenes de vises Os arquivos de template das vises so chamados depois das funes que os controladores mostram, na forma com sublinhados. A funo getReady() da classe PeopleController ir procurar pelo template da viso em /app/views/people/get_ready.ctp. O modelo bsico /app/views/controller/underscored_function_name.ctp. Nomeando os pedaos da aplicao usando as convenes do CakePHP, voc ganha funcionalidades sem luta e proteo configurao. Aqui o exemplo final que vincula as associaes: Tabela no banco de dados: people Classe do Modelo: Person, encontrada em /app/models/person.php Classe do Controlador: PeopleController, encontrado /app/controllers/people_controller.php Template da Viso: encontrado em /app/views/people/index.ctp

em

Usando estas convenes, CakePHP sabe que a requisio para http://www.exemplo.com.br/people/ mapeia para a chamada da funo index() do PeopleController, onde o modelo Person automaticamente disponibilizado (e automaticamente associado a tabela people no banco de dados), e renderiza isso para o arquivo. Nenhuma destas relaes foram configuradas por qualquer meio que no seja atravs da criao de classes e arquivos que voc precise criar em algum lugar. Agora que voc leu os fundamentos do CakePHP, voc pode tentar seguir o Tutorial de como fazer um blog em CakePHP, disponvel na parte de Exemplos deste manual.

Desenvolvendo com CakePHP

17

Parte III.Requisitos

Desenvolvendo com CakePHP

Servidor HTTP. Apache com mod_rewrite preferido, mas no obrigatrio. PHP 4.3.2 ou superior. Sim! CakePHP funciona com PHP 4 e PHP 5.

Tecnicamente um banco de dados no obrigatrio, mas ns imaginamos que a maioria das aplicaes iro utilizar um. CakePHP suporte uma variedade de banco de dados: MySQL (4 ou superior); PostgreSQL; Firebird DB2; Microsoft SQL Server; Oracle; SQLite; ODBC; ADOdb.

Preparativos para instalaoBaixando o CakePHP H duas maneiras de pegar uma cpia do CakePHP, Primeiro: voc pode baixar o arquivo (zip/tar.gz/tar.bz2) ou voc pode baixar o cdigo do repositrio SVN. Para pegar a cpia estvel, visite o site http://www.cakephp.org. L haver um link chamado Download Now! para baixar. Os arquivos do CakePHP tambm so armazenados no CakeForge e voc pode visitar a pgina do projeto no site http://cakeforge.org/projects/cakephp. Se voc quer os arquivos mais atuais, verifique no site http://cakephp.org/downloads/index/nightly e vers a ltima verso estvel, porm nem sempre a ltima release. Nestas verses incluem correes entre releases. Ou seja, so verses intermedirias entre releases, mas que so estveis. Para pegar os arquivos direto do https://svn.cakephp.org/repo/branches/1.2.x.x. repositrio SVN, conecte-se em

Permisses O CakePHP usa o diretrio /app/tmp para diversas operaes. Descritivos dos modelos, fazer cache de vises e informaes das sesses so alguns exemplos. Assim, tenha certeza que o diretrio /app/tmp na instalao do seu cake permite escrita pelo usurio do servidor de web.

Desenvolvendo com CakePHP

18

InstalaoInstalando o CakePHP pode ser feito simplesmente descompactando o contedo no seu servidor web ou de forma mais complexa e flexvel, do jeito que voc preferir. Esta seo vais falar de trs maneiras de instalar o CakePHP: desenvolvimento, produo e avanada. Desenvolvimento: fcil para comear, URL dos seus aplicativos incluem o diretrio de instalao do CakePHP e menos seguro; Produo: Requer maior habilidade para configurar o servidor web, porm mais seguro e com URLs mais amigveis; Avanada: Com algumas configuraes, permite voc colocar os diretrios do CakePHP em diferentes locais do sistema, possibilitando compartilhar o ncleo do CakePHP entre diversas aplicaes.

Desenvolvimento Apenas coloque seus arquivos do CakePHP no diretrio pblico do seu servidor web (normalmente htdocs, www, public_html). Por exemplo, assumindo que o diretrio pblico do seu servidor web seja /var/www/html, os arquivos devem ficar desta maneira: /var/www/html o /cake_1_2 /app /cake /docs /index.php /vendors

Para ver a sua aplicao CakePHP, entre no link http://www.exemplo.com/cake_1_2/. Produo Para utilizar-se do modelo de produo, voc precisar ter privilgios de acessar o diretrio pblico do servidor web. Escolhendo o modo de produo significa que todo o domnio age como um nico pedido CakePHP. A disposio dos arquivos no modo de produo fica da seguinte maneira: /pasta_para_o_cake/ o /app /webroot (este diretrio deve ser seu diretrio pblico do servidor web) o /cake o /docs o /index.php o /vendors

Se sua aplicao est hospedada no Apache, a diretiva DocumentRoot para seu domnio deve ficar assim:DocumentRoot /pasta_para_o_cake/app/webroot

Desenvolvendo com CakePHP

19

Para ver sua aplicao CakePHP, entre no link http://www.exemplo.com.br. Instalao avanada Aqui esto algumas situaes que voc escolhe o lugar onde os diretrios do CakePHP vo ficar no seu sistema. Isto pode ser por causa de uma restrio do sistema ou para compartilhar as bibliotecas entre diferentes aplicaes. Esta seo descreve como espalhar seus diretrios dos CakePHP no sistema. Primeiro, note que h trs partes principais da sua aplicao CakePHP: 1. As bibliotecas do ncleo do CakePHP, em /cake; 2. O cdigo da sua aplicao, em /app; 3. Os arquivos pblicos da sua aplicao, normalmente em /app/webroot. Cada um desses diretrios pode ser colocado em qualquer lugar do seu sistema, com exceo do webroot, que precisa estar acessvel pelo servidor web. Voc pode mover a pasta webroot para fora do diretrio da sua aplicao (app), desde que informe ao Cake onde voc vai colocla. Para configurar sua instalao do Cake, ns vamos ter que fazer algumas alteraes no arquivo /app/webroot/index.php. Aqui existem trs constantes que precisaremos editar: ROOT, APP_DIR e CAKE_CORE_INCLUDE_PATH. ROOT deve ser configurada para informar o diretrio onde sua aplicao se encontra, ou seja, onde est a pasta app; APP_DIR deve ser configurada para informar qual a pasta app; CAKE_CORE_INCLUDE_PATH deve ser configurada para informar o diretrio onde esto as bibliotecas do CakePHP (a pasta cake).

Vamos fazer um exemplo para que voc veja como funciona a instalao avanada na prtica. Imagine que eu quero que a aplicao funcione como segue: As bibliotecas do CakePHP devero ser colocadas em /usr/lib/cake; O diretrio pblico da minha aplicao (webroot) deve ser em /var/www/meusite; O diretrio da aplicao deve ser /home/eu/meusite.

Com estas configuraes, eu preciso editar o meu arquivo webroot/index.php (que no final deve estar em /var/www/meusite/index.php, neste exemplo) e ver o seguinte:if (!defined('ROOT')) { define('ROOT', DS.'home'.DS.'eu'); } if (!defined('APP_DIR')) { define ('APP_DIR', 'meusite'); } if (!defined('CAKE_CORE_INCLUDE_PATH')) { define('CAKE_CORE_INCLUDE_PATH', DS.'usr'.DS.'lib'.DS.'cake');

/app/webroot/index.php (parcialmente, comentrios foram removidos)

Desenvolvendo com CakePHP

20

recomendado que voc use a constante DS no lugar das barras para entre os diretrios. Isso previne que no cause erro quando se use a aplicao em sistemas operacionais diferentes, tornando seu cdigo mais portvel. Caminho de classes adicionais Em algumas ocasies interessante voc compartilhar as classes do MVC entre as aplicaes no mesmo sistema. Se voc quer um mesmo controller para mesma aplicao, voc pode usar o arquivo bootstrap.php do CakePHP para adicionar estas classes adicionais. No bootstrap.php, defina algumas variveis com nomes especiais para fazer com que o CakePHP olhe nestes diretrios a procura da sua classe:$viewPaths $controllerPaths $modelPaths $helperPaths $componentPaths $behaviorPaths = = = = = = array(); array(); array(); array(); array(); array();

Cada um dessas variveis especiais pode ser um conjunto na array com o diretrio absoluto onde esto s classes que voc desejar. Tenha certeza que cada diretrio especificado inclua as barras com DS. Apache e mod_rewrite Enquanto o CakePHP construdo para trabalhar com o mod_rewrite e vimos que muitos usurios apanham para conseguir fazer isto funcionar nos seus sistemas, ns lhe daremos algumas dicas que voc pode tentar para tentar rodar corretamente: Tenha certeza que o override est habilitado no .htaccess. Em seu httpd.conf, voc deve olhar na seo que define seu Directory no servidor. Tenha certeza que AllowOverride est configurado como All para o diretrio correto de DocumentRoot; Tenha certeza que voc est editando o httpd.conf do sistema antes da configurao do usurio ou do site em especfico; Tenha certeza que o arquivo .htacess est na pasta do CakePHP. Em alguns sistemas operacionais ele pode ficar oculto na hora de mover devido a interpretarem o . como sinnimo de ocultamento. Tenha certeza que sua cpia do CakePHP do site ou repositrio oficial do CakePHP e que foi extrado corretamente; Tenha certeza que voc est carregando o mod_rewrite corretamente. Voc pode ver algo como LoadModule rewrite_module libexec/httpd/mod_rewirte.so e AddModule mod_rewrite.c no seu httpd.conf; Se voc est instalando no diretrio do usurio (http://exemplo.com.br/~username), voc ter que modificar o arquivo .htaccess no diretrio da base da instalao do CakePHP. Apenas adicione a linha RewriteBase /~meuusername/.

Comece agora! Tudo bem, vamos ver o CakePHP em ao. Dependendo de qual opo de instalao voc utilizou, acesse no seu navegador o link http://exemplo.com.br ou http://exemplo.com.br/cake_instalado/. Neste ponto, voc ver a pgina padro do CakePHP e a mensagem do estado da configurao do seu banco de dados.

Desenvolvendo com CakePHP

21

Parabns! Voc j pode criar sua primeira aplicao CakePHP.

ConfiguraoConfigurao da base de dados O CakePHP espera que os detalhes de configurao da base de dados estejam no arquivo app/config/database.php. Um exemplo de configurao da base de dados pode ser encontrado em app/config/database.php.default. A configurao final deve ser parecida com o exemplo abaixo.var $default = array('driver' => 'mysql', 'persistent' => false, 'host' => 'localhost', 'login' => 'usuarioDB', 'password' => 'senhaDB', 'database' => 'basededados', 'prefix' => '');

Exemplo de configurao da base de dados A conexo $default usada a menos que outra configurao seja especificada pela propriedade $useDbConfig em um model. Por exemplo, se minha aplicao tiver uma base de dados adicional do legacy alm do padro, eu poderia us-la em meus models criando uma nova conexo da base de dados de $legacy similar a configurao $default, e ajustando a var $useDbConfig = 'legacy'; nos models apropriados. Preencha corretamente os pares de chave/valor na configurao para atender melhor s suas necessidades.Tabela 2. Configuraes da base de dados

Chave driver

persistent host login password database prefix (opcional) port (opcional) enconding Indica qual caractere definido ser usado para enviar indicaes SQL ao servidor. schema Usado em instalaes de base de dados PostgreSQL para especificar qual schema usar. Note que as configuraes de prefixo so para as tabelas, no para os models. Por exemplo, se voc criou um relacionamento entre as tabelas Apple e Flavor, o nome ser prefixo_apples_flavors (no prefixo_apples_prefixo_flavors), isso se sua opo de prefixo estiver como 'prefixo_'.

Valor O nome do driver da base de dados para esta configurao. Exemplos: mysql, postgres, sqlite, pear-drivername, adodb-drivername, mssql, oracle, ou odbc. Se usar ou no uma conexo persistente com a base de dados. O nome do servidor da base de dados (ou endereo IP). O usurio desta conta. A senha desta conta. O nome da base de dados que esta conexo ir usar. Esta string ser adicionada como prefixo no nome de todas tabelas de sua base de dados.Se suas tabelas no possuem prefixo, deixe esta string vazia. A porta TCP ou socket Unix usado para conectar com o servidor.

Desenvolvendo com CakePHP

22

A partir deste ponto, voc deve dar uma olhada nas Convenes CakePHP, mostradas neste manual. A nomenclatura correta para suas tabelas (e o nome de algumas colunas) pode livrar de algumas implementaes e configuraes desnecessrias. Configurao do ncleo As classes de configurao Classes de configurao Variveis de configurao do ncleo Constantes de configurao Configurao de rotas (Routes) Routes uma funcionalidade que mapeia URLs em aes do controller. Foi adicionado ao CakePHP para tornar URL amigveis mais configurveis e flexveis. No obrigatrio o uso do mod_rewrite para usar routes, mas usando-o far sua barra de endereos muito mais limpa e arrumada. Routes no CakePHP 1.2 foi ampliada e pode ser muito mais poderosa. Antes de voc aprender sobre como configurar suas prprias rotas, voc deveria saber que o CakePHP vem configurado com um conjunto de rotas padro. A configurao padro de rotas do CakePHP deixar as URLs mais bonitas para qualquer aplicao. Voc pode acessar diretamente uma ao via URL colocando seu nome na requisio. Voc pode tambm passar parmetros para suas aes no controller usando a prpria URL.URL para a rota padro: http://examplo.com/controller/action/param1/param2/param3

A URL /noticias/ler mapeia para a ao ler() do controller Noticias (NoticiasController), e /produtos/verInformacoes mapeia para a ao view_informacoes() do controller Produto (ProdutosController). Se nenhuma ao especificada na URL, a ao index() ser chamada. A rota padro tambm permite passar parmetros para as aes usando a URL. Uma requisio /noticias/ler/12 seria equivalente a chamar o mtodo ler(12) no controller Noticias (NoticiasController), por exemplo. Uma novidade no CakePHP 1.2 a possibilidade de usar parmetros nomeados. Voc pode nomear parmetros e enviar seus valores usando a URL. Uma requisio /noticias/ler/titulo:primeira+noticia/categoria:esportes teria como resultado uma chamada a ao ler() do controller Noticias (NoticiasController). Nesta ao, voc encontraria os valores dos parmetros ttulo e categoria dentro de $this->passedArgs['titulo'] e $this>passedArgs['categoria'] respectivamente. Alguns exemplos para a rota padro:URL mapeadas para as aes dos controladores, usando rotas padro: URL: /monkeys/jump

Desenvolvendo com CakePHP

23

Mapeado para: MonkeysController->jump(); URL: /products Mapeado para: ProductsController->index(); URL: /tasks/view/45 Mapeado para: TasksController->view(45); URL: /donations/view/recent/2001 Mapeado para: DonationsController->view('recent', '2001'); URL: /contents/view/chapter:models/section:associations Mapeado para: ContentsController->view(); $this->passedArgs['chapter'] = 'models'; $this->passedArgs['section'] = 'associations';

Definindo suas prprias rotas permite voc definir como sua aplicao ir responder a uma dada URL. Defina suas prprias rotas no arquivo /app/config/routes.php usando o mtodo Router::connect(). O mtodo connect() recebe trs parmetros: a URL que voc deseja casar, o valor padro para os elementos de rota, e regras de expresses regulares para ajudar a encontrar elementos na URL. O formato bsico para uma definio de rota :Router::connect( 'URL', array('paramName' => 'defaultValue'), array('paramName' => 'matchingRegex') )

Inflexo personalizada As convenes de nomenclatura do Cake podem ser realmente legais. Voc pode nomear sua tabela big_boxes, seu model BigBox, seu controller BigBoxesController e tudo isso funciona em conjunto automaticamente. A maneira que o CakePHP usa para associar todas juntas atravs da utilizao de inflections (inflexes), que transformam as palavras do singular em plural e vice-versa. Existem ocasies (especialmente para nossos amigos que no falam ingls - nosso caso), onde voc pode rodar o inflector do CakePHP (a classe que pluraliza, singulariza, camelCases e under_scores) e no funcionar como voc gostaria. Se o CakePHP no reconhecer seu Foci ou Fish, editando o arquivo de configurao personalizada de inflexes voc poder indicar seus casos especiais. O arquivo de configurao encontrado em /app/config/inflections.php. Neste arquivo, voc ir encontrar seis variveis. Cada uma permite voc fazer o ajuste fino das inflections do CakePHP. Variveis do inflections.php $pluralRules Descrio Este array contm regras de expresses regulares para pluralizar casos especiais. A chave do array so os patterns e o valor so as substituies.

Desenvolvendo com CakePHP

24

$uninflectedPlural

Um array que contm palavras que no precisam ser alteradas quando passadas para o plural (lpis, etc.). $irregularPlural Um array que contm palavras e seus plurais. A chave do array contm a forma no singular e o valor a forma no plural. Este array deve ser usado para guardar palavras que no seguem as definies em $pluralRules. $singularRules Similar a $pluralRules, contm as regras para singularizar as palavras. $uninflectedSingular Similar a $uninflectedPlural, contm as palavras que no contm forma no singular. Por padro, este array tem o mesmo valor de $uninflectedPlural. $irregularSingular Similar a $irregularPlural, contm as palavras que possuem apenas a forma singular. A verso para lngua portuguesa do inflections.php pode ser encontrada nos apndices, com o ttulo Inflexo em portugus. Configurao de inicializao (bootstrap)

Controllers (Controladores)Introduo Um controller (ou controlador) usado para gerenciar a lgica para uma parte de sua aplicao. Mais comumente, controllers so usados para gerenciar a lgica de um nico model. Por exemplo, se voc est construindo um site para uma padaria online, voc pode ter um ReceitasController e um IngredientesController gerenciando suas receitas e seus ingredientes. No CakePHP, controllers so nomeados de acordo com o model que manipulam, no plural. O model Receita manipulado pelo ReceitasController, o model Produto manipulado pelo ProdutosController, e por a vai. Seus controllers de aplicao so classes que estendem a classe CakePHP AppController, a qual por sua vez estende a classe ncleo Controller. A classe AppController pode ser definida em app/app_controller.php e deve conter mtodos que so compartilhados entre todos os seus controllers. A classe AppController estende o Controller que uma classe padro da biblioteca CakePHP. Controllers podem incluir qualquer nmero de mtodos que so geralmente referidos como actions (aes). Actions so mtodos do controlador usados para mostrar views (vises). Uma action um nico mtodo de um controller. O dispatcher (despachante) do CakePHP chama actions quando uma requisio casa uma URL com uma action do controller. Retornando ao nosso exemplo da padaria online, nosso ReceitasController pode conter as actions ver(), compartilhar() e buscar(). O controller poderia ser encontrado em app/controllers/receitas_controller.php e poderia conter:

app/controllers/receitas_controller.php Para que voc possa usar o controller de forma mais efetiva em sua aplicao, vamos cobrir alguns dos principais atributos e mtodos fornecidos pelos controllers do CakePHP. Atributos Para uma lista completa de atributos do controller e suas descries visite a API do CakePHP. D uma olhada http://api.cakephp.org/1.2/classController.html. $name Usurios PHP4 devem iniciar suas definies de controllers usando o atributo $name. O atributo $name deve conter o nome do controller. Geralmente apenas a forma plural do nome do model. Isso cuida de alguns dos problemas de nomes de classe do PHP4 e ajuda o CakePHP a encontrar os nomes das coisas.

Exemplo de uso do atributo $name do controller $components, $helpers e $uses Os prximos atributos de controller usados com maior freqncia dizem ao CakePHP que helpers (ajudantes), components (componentes), e models voc usar junto com o controller atual. Usar esses atributos disponibiliza essas classes MVC para o controller como variveis de classe ($this->NomeDoModel, por exemplo). Por favor, perceba que cada controller tem algumas dessas classes disponveis por padro, ento voc pode nem mesmo ter que configurar o seu controller. Controllers tem por padro seu model principal disponvel. Nosso ReceitasController ter o model Receita disponvel em $this->Receita, e nosso ProdutosController tambm tem acesso ao model Produto em $this->Produto. Os helpers Html e Session esto sempre disponveis por padro, assim como o component Session. Para aprender mais sobre essas classes, lembre-se de dar uma olhada em suas repectivas sesses mais a frente nesse manual.

Desenvolvendo com CakePHP

26

Vamos ver como chamar um controller CakePHP no qual voc planeja usar classes MVC adicionais.

Quando estiver definindo esses atributos, tenha certeza de incluir as classes padro (como Html no array $helpers, por exemplo) se voc pretende us-los. Relativo pgina: $layout e $pageTitle Alguns poucos atributos existem nos controllers CakePHP que do maior controle sobre como suas views so embutidas em um layout. O atributo $layout pode conter o nome do layout salvo em /app/views/layouts. Voc especifica um layout atribuindo ao atributo $layout o nome do arquivo de layout menos a extenso .ctp. Se esse atributo no for definido, o CakePHP renderiza o layout default (padro). Se voc no definiu um em /app/views/default.ctp, o layout default do ncleo do CakePHP ser renderizado.

Usando $layout para definir um layout alternativo O atributo $pageTitle do controller torna possvel definir o ttulo da pgina renderizada. Para que isso funcione apropriadamente, seu layout precisa ter embutido a varivel $title_for_layout entre as tags no cabealho do documento HTML. Apenas atribua $pageTitle a string que voc quer ver no do seu documento. Atributos dos parmetros ($params) Parmetros do controller esto disponveis em $this->params no seu controller CakePHP. Essa varivel usada para dar acesso informao sobre a requisio atual. O uso mais comum do $this->params obter acesso informao que foi enviada ao controller via operaes POST ou GET. $this->params['form']

Desenvolvendo com CakePHP

27

Qualquer dado do POST de qualquer formulrio guardado aqui, incluindo tambm informao encontrada em $_FILES. $this->params['bare'] o Guarda 1 se o layout atual est vazio, 0 se no. $this->params['isAjax'] o Guarda 1 se o layout atual 'ajax', 0 se no. Essa varivel s configurada se o component RequestHandler est sendo usado no controller. $this->params['controller'] o Guarda o nome do controller atual manipulando a requisio. Por exemplo, se a URL /posts/ver/1 foi requisitada, $this->params['controller'] ser igual 'posts'. $this->params['action'] o Guarda o nome da action atual manipulando a requisio. Por exemplo, se a URL /posts/ver/1 requisitada, $this->params['action'] ser igual 'ver'. $this->params['pass'] o Guarda a query string GET passada com a requisio atual. Por exemplo, se a URL /posts/ver/?var1=3&var2=4 foi requisitada, $this->params['pass'] ser igual '?var1=3&var2=4'. $this->params['url'] o Guarda a URL atual requisitada, com os pares chave-valor das variveis GET. Por exemplo, se a URL /posts/view/?var1=3&var2=4 foi chamada, $this>params['url'] conter:

o

[url] => Array ( [url] => posts/view [var1] => 3 [var2] => 4 )

$this->data o Usado para manipular os dados POST enviados dos formulrios FormHelper ao controller.

// O FormHelper usado para criar um elemento form: $form->text('Usuario.primeiro_nome'); // Quando rederizado, se parece com: // Quando o formulrio enviado para o controller via POST, // os dados so mostrados em $this->data // O primeiro nome pode ser encontrado aqui: $this->data['Usuario']['primeiro_nome'];

Outros atributos Ainda que voc possa dar uma olhada nos detalhes de todos os atributos de controllers na API, existem outros atributos de controllers que merecem suas prprias sesses no manual.

Desenvolvendo com CakePHP

28

O atributo $cacheAction serve para criar cache das views, e o atributo $paginate usado para criar a paginao padro para o controller. Para mais informao sobre como usar esses atributos, d uma olhada em suas respectivas sesses mais a frente nesse manual. Mtodos Para uma lista completa de mtodos do controller e suas descries visite a API CakePHP. D uma olhada http://api.cakephp.org/1.2/class_controller.html. Interagindo com as vises set(string $var, mixed $value) O mtodo set() a principal forma de enviar dados do seu controller para sua view. Uma vez que voc usou set(), a varivel pode ser acessada na sua view.// Primeiro voc passa os dados do controller: $this->set('cor', "pink"); // Ento, na view, voc pode utilizar os dados: Voc selecionou a cor para colorizar o cake.

Exemplo de uso do set() O mtodo set() tambm pega um array associativo como seu primeiro parmetro. Esse pode ser geralmente um caminho rpido para atribuir um grupo de informaes para a view. Perceba que os ndices de seu array sofrero inflection antes de serem atribudos view ('indice_com_underline' se torna 'indiceComUnderline', etc.):$dados = array( 'cor' => 'pink', 'tipo' => 'aucar', 'preco_base' => 23.95 ); // fazem $cor, $tipo, e $precoBase // disponveis na view: $this->set($dados);

render(string $action, string $layout, string $file)

O mtodo render() automaticamente chamado ao final de cada action do controller requisitada. Esse mtodo executa toda a lgica da view (usando dados que voc forneceu usando o mtodo set()), insere a view dentro do layout e o serve de volta para o usurio final. O arquivo de view padro renderizado determinado por conveno. Se a action buscar() do ReceitasController requisitada, o arquivo de view /app/views/receitas/buscar.ctp ser renderizado.

Desenvolvendo com CakePHP

29

Ainda que o CakePHP v automaticamente cham-lo (a menos que voc configure $this>autoRender para false) depois de cada lgica de action, voc pode us-lo para especificar um arquivo de view alternativo configurando o nome da action no controller usando $action. Voc pode tambm especificar um arquivo alternativo um terceiro parmetro, $file. Quando usar $file, lembre-se de utilizar um pouco das constantes globais do CakePHP (como a VIEWS). O parmetro $layout permite especificar o layout na qual a view renderizada. Fluxo de controle redirect(string $url, integer $status, boolean $exit) O mtodo de controle de fluxo que voc vai usar com maior freqncia o redirect(). Esse mtodo pega seu primeiro parmetro na forma de uma URL relativa CakePHP. Quando um usurio fez uma compra com sucesso, voc provavelmente ir redirecion-lo para a tela de recibo.function comprar() { // A lgica para finalizar a compra vai aqui... if($sucesso) { $this->redirect('/compras/obrigado'); } else { $this->redirect('/compras/confirmar'); } }

Exemplo de uso do redirect() O segundo parmetro do redirect() lhe permite definir um cdigo de status HTTP para acompanhar o redirecionamento. Voc pode querer usar 301 (movido permanentemente) ou 303 (veja outro), dependendo da natureza do redirecionamento. Esse mtodo no chama exit() depois de redirecionar a menos que voc configure o terceiro parmetro para true. flash(string $message, string $url, integer $pause)

Similarmente, o mtodo flash() usado para direcionar o usurio para uma nova pgina depois de uma operao. O mtodo flash() diferente pelo fato de mostrar uma mensagem antes de passar o usurio para uma outra URL. O primeiro parmetro deve guardar a mensagem a ser mostrada, e o segundo parmetro uma URL relativa CakePHP. CakePHP vai mostrar a mensagem na varivel $message, por um tempo definido em segundos na varivel $pause antes de direcionar o usurio. Para mensagens flash dentro da pgina, d uma olhada no mtodo setFlash() do component Session. Callbacks Controllers CakePHP vem com callbacks para inserir lgica exatamente antes ou depois das actions serem rederizadas.

Desenvolvendo com CakePHP

30

beforeFilter()

Essa funo executada antes de qualquer action no controller. o lugar ideal para checar uma sesso ativa ou inspecionar permisses. beforeRender()

Chamada aps a lgica da action do controller, mas antes da view ser renderizada. Esse callback no usado geralmente, mas pode ser necessrio se voc est chamando render() manualmente antes do final de uma dada action. afterFilter()

Chamada depois de toda action do controller. afterRender()

Chamada depois que uma action tiver sido renderizada. Outros mtodos constructClasses() Esse mtodo carrega os models requeridos pelo controller. Esse processo de carregamento feito pelo CakePHP normalmente, mas o mtodo uma boa quando estiver acessando controllers de diferentes perspectivas. Se voc precisa do CakePHP em um script de linha de comando ou outro uso de fora, constructClasses() pode ser uma boa. referrer()

Retorna a URL referida pela requisio atual. disableCache()

Usado para dizer ao navegador do usurio no fazer cache dos resultados na requisio atual. Isso diferente do cache da view, coberto no captulo anterior. postConditions(array $data, mixed $op, string $bool, boolean $exclusive)

Use esse mtodo para tornar um grupo de dados enviados por POST (de inputs compatveis com o helper Html) em um grupo de condies de busca para o model. Essa funo oferece um atalho rpido para criar lgica de busca. Por exemplo, um usurio administrativo pode querer ser capaz de buscar compras para saber quais itens precisam ser enviados. Voc pode criar um rpido formulrio baseado no model Compra. Ento a action do controller pode usar os dados enviados do formulrio para criar as condies de busca.function index() { $c = $this->Compras->findAll($this->postConditions($this->data)); $this->set('compras', $c); }

Desenvolvendo com CakePHP

31

Se $this->data['Compra']['destino'] igual a Padaria da Cidade Velha, postConditions converte essa condio para um array compatvel para uso no mtodo NomeDoModel>findAll(). Nesse caso, array(Compra.destino => Padaria da Cidade Velha). Se voc quer usar um operador SQL diferente entre os termos, fornea-os usando o segundo parmetro./* Contedo de $this->data array( 'Compra' => array( 'num_de_itens' => '4', 'fornecedor' => 'Trigo Integral LTDA' ) ) */ // Vamos pegar compras que tem ao menos 4 itens e contm 'Trigo Integral LTDA' $c = $this->Compra->findAll($this->postConditions( $this->data, array('>=', 'LIKE') ));

O ndice nas especificaes de operadores a ordem das colunas no array $this->data. J que num_de_itens o primeiro, o operador >= aplica-se a ele. O terceiro parmetro lhe permite dizer ao CakePHP que operador booleano SQL usar entre as condies de busca. Strings com 'AND', 'OR', e 'XOR' so todos valores vlidos. Finalmente, se o ltimo parmetro est configurado para true, e o parmetro $op um array, os campos no includos em $op no sero includos nas condies retornadas. cleanUpFields(string $modelClass = null)

Esse mtodo de convenincia concatena as vrias partes de datas em $this->data antes de salvar. Se voc tem inputs de data do helper Form, esse mtodo concatena o ano, ms, dia e hora em uma string mais compatvel com banco de dados. Esse mtodo usa o model padro do controller (por ex.: o model Cookie para o controller CookiesController) como alvo para a concatenao, mas uma classe alternativa pode ser usada como primeiro parmetro. paginate()

Esse mtodo usado para paginar os resultados divididos pelos seus models. Voc pode especificar tamanhos de pginas, condies de busca do model e mais. Detalhes sobre esse mtodo mais a frente. D uma olhada no captulo de paginao mais a frente nesse manual. requestAction(string $url, array $options)

Essa funo chama uma action de controller de qualquer lugar e retorna os dados dessa action. A $url passada uma URL relativa ao CakePHP

Desenvolvendo com CakePHP

32

(/nomedocontroller/nomedaaction/parametros). Se o array $options incluir um valor de returno. AutoRender automaticamente configurada para true para a action do controller, tendo a requestAction te levando para a view totalmente renderizada. Nota: apesar de ser possvel usar requestAction() para pegar uma view totalmente renderizada, a perda performance que voc obtm passando por toda a camada da view novamente na realidade no faz valer a pena. O mtodo requestAction() melhor usado em conjunto com elements - como um caminho para enviar lgica de negcio para um element antes da renderizao. Primeiro, vamos ver como pegar dados da action do controller. Primeiro, ns precisamos criar a action do controller que retorna algum dado que precisamos em vrios lugares atravs da aplicao:// Aqui est nosso controller simples: class UsuariosController extends AppController { function pegarListaDeUsuarios() { return $this->Usuario->findAll("Usuario.ativo = 1"); } }

Imagine que ns precisamos criar uma simples tabela mostrando os usurios ativos no sistema. Ao invs de duplicar o cdigo de gerao de lista em outro controller, ns podemos pegar dados do UsuariosController->pegarListaDeUsuarios() ao invs de usar requestAction();class ProdutosController extends AppController { function mostrarProdutosDoUsuario() { $this->set( 'usuarios', $this->requestAction('/usuarios/pegarListaDeUsuarios') ); // Agora a varivel $usuarios na view vai ter dados do // UsuariosController::pegarListaDeUsuarios(). } }

Se voc tem um element na sua aplicao que no esttico, voc pode querer usar requestAction() para enviar lgica equivalente do controller para o element a medida em que voc o injeta nas suas views. Apesar de elements sempre tem acesso a qualquer varivel da view que o controller passou, essa uma forma de passar dados para o element vindos de outro controller. Se voc criou uma action do controller que fornece a lgica necessria, voc pode pegar dados e pass-lo para o segundo parmetro do mtodo renderElement() da view usando requestAction().

Se o array '$options' contiver um valor return, a action do controller ser renderizada dentro de um layout vazio e retornada. Dessa forma, a funo requestAction() til tambm em situaes Ajax onde um pequeno elemento de uma view precisa ser preenchido antes ou durante uma atualizao Ajax.

Components (Componentes)Introduo Components (Componentes) so pacotes com funes lgicas que so usadas para serem compartilhadas entre os controllers. Se voc est querendo copiar e colar coisas entre os controllers, voc pode criar funcionalidades em components para isso. O CakePHP j vem com um conjunto de components para os mais diversos usos, por exemplo: Segurana Sesses Lista de controle de acessos (ACL) E-mails Cookies Autenticao Manipulao de requisies

Cada um dos components ser explicado em outros captulos. Por enquanto, mostraremos apenas como criar seus prprios components. Criando components ajuda a manter o cdigo do controller limpo e permite que voc reuse o cdigo entre os projetos ou controllers. Construindo componentes personalizados Suponha que sua aplicao online precisa utilizar funes complexas de matemtica em diversas partes da aplicao. Poderamos, ento, criar um component para que esta lgica seja compartilhada entre diversos controllers. O primeiro passo criar um arquivo para o component e uma classe. Crie o arquivo em /app/controllers/components/math.php. A estrutura bsica do arquivo do component similar a apresentada abaixo.

Quando seu component estiver criado, ns podemos utiliz-lo nos controllers da aplicao colocando o nome do component no vetor da varivel $components:// Isso faz com que o novo component possa ser acessado usando $this->Math

Desenvolvendo com CakePHP

34

var $components = ('Math', 'Session');

Acessando classes do MVC de dentro dos componentes Para ter acesso a instncia do controlador dentro do seu novo component, voc precisa implementar o mtodo startup(). Este um mtodo especial que trs a referncia do controller como primeiro parmetro e esta funo chamada automaticamente depois da funo beforeFilter() do controller. Se por alguma razo voc no quer que o mtodo startup() seja executado quando o controller instanciado, defina o valor da varivel $disableStartup para true. Se voc deseja inserir uma lgica antes que o controller seja chamado, use o mtodo initialize() no seu component.

Voc pode tambm querer utilizar outros components dentro de um component personalizado. Para isso, basta criar a varivel $components na classe (assim como voc faria em um controller) como um array que contenha os nomes dos components que voc deseja utilizar.

Models (Modelos)Introduo Campos mgicos Atributos Mtodos Associaes Introduo Um dos mais poderosos recursos do CakePHP o mapeamento relacional fornecido pelos models. No CakePHP, as ligaes entre os models so manipuladas atravs de associaes.

Desenvolvendo com CakePHP

35

Definir as relaes entre os diversos objetos em sua aplicao deve ser um processo natural. Por exemplo: em uma base de dados de receitas, uma receita pode ter muitas opinies, opinies tm um nico autor, e os autores podem ter muitas receitas. Definir a forma como estas relaes trabalham permite o acesso aos seus dados de uma forma intuitiva e poderosa. O objetivo desta seo para mostrar-lhe como planejar, definir, utilizar as associaes entre os models no CakePHP. Porque a forma mais comum de armazenamento em aplicaes web uma base relacional, a maior parte daquilo que ns vamos cobrir neste manual ser, em um banco de dados com um contexto relacionado. Os quatro tipos de associao no CakePHP so: hasOne, hasMany, belongsTo, e hasAndBelongsToMany (HABTM).Tabela 3. Tipos de associaes possveis

Tipo de associao Exemplo hasOne Um usurio tem um perfil. hasMany Usurios em um sistema pode ter vrias receitas. belongsTo Uma receita pertence a um usurio. hasAndBelongsToMany Receitas tem, e pertencem a muitas tags1. Associaes so definidas atravs da criao de uma classe varivel com o nome da associao que voc est definindo. A classe varivel s vezes pode ser to simples como uma string, mas pode ser to completa como um array multidimensional utilizado para definir associaes especficas.

hasOne Vamos criar um model chamado User que tenha a relao hasOne com o model Profile. Primeiro, suas tabelas da