MANUAL CAKEPHP 1.2       Juan Basso    3 de março de 2008
SumárioPARTE I.                COMEÇANDO COM CAKEPHP ........................................................................
Apache e mod_rewrite ........................................................................................................
Introdução ..................................................................................................................
required ....................................................................................................................
PARTE V.                COMPONENTES INTERNOS ....................................................................... 65Lis...
AJAX ........................................................................................................................
Começando com CakePHP         7           Parte I.    Começando com CakePHPPrefácioBem vindo ao paraíso de desenvolvimento...
Começando com CakePHP         8      Aplicações scaffolding;      Geração de código;      Arquitetura MVC (Model, View,...
Começando com CakePHP       9O CakeForge é outro recurso que os desenvolvedores podem usar para hospedar seus projetosusan...
Começando com CakePHP          10      PDF, documento XML, um objeto JSON ou outro formato qualquer, dependendo da      su...
Princípios básicos do CakePHP      11        Parte II.   Princípios básicos do CakePHPEstrutura CakePHPCakePHP possui a ca...
Princípios básicos do CakePHP      12Os models também são suportados por outra classe chamada DataSource. DataSources sãoa...
Princípios básicos do CakePHP   13       vendorsQuando você faz o download do CakePHP, você verá que possui quatro pastas...
Princípios básicos do CakePHP       14Figura 2. Requisição típica no CakePHP. Em preto, elemento necessário; Em cinza, ele...
Princípios básicos do CakePHP      15Convenções CakePHPNós somos grandes fãs de convenções nas configurações. Enquanto iss...
Princípios básicos do CakePHP     16Você também pode alterar a visibilidade das funções do controlador em CakePHP colocand...
Desenvolvendo com CakePHP          17        Parte III.   Desenvolvendo com CakePHPRequisitos       Servidor HTTP. Apache...
Desenvolvendo com CakePHP         18InstalaçãoInstalando o CakePHP pode ser feito simplesmente descompactando o conteúdo n...
Desenvolvendo com CakePHP         19Para ver sua aplicação CakePHP, entre no link http://www.exemplo.com.br.Instalação ava...
Desenvolvendo com CakePHP         20É recomendado que você use a constante DS no lugar das barras para entre os diretórios...
Desenvolvendo com CakePHP        21Parabéns! Você já pode criar sua primeira aplicação CakePHP.ConfiguraçãoConfiguração da...
Desenvolvendo com CakePHP          22A partir deste ponto, você deve dar uma olhada nas Convenções CakePHP, mostradas nest...
Desenvolvendo com CakePHP          23Mapeado para: MonkeysController->jump();URL: /productsMapeado para: ProductsControlle...
Desenvolvendo com CakePHP         24$uninflectedPlural             Um array que contém palavras que não precisam ser alter...
Desenvolvendo com CakePHP          25     function compartilhar($cliente_id, $receita_id) {         // a lógica da action ...
Desenvolvendo com CakePHP          26Vamos ver como chamar um controller CakePHP no qual você planeja usar classes MVCadic...
Desenvolvendo com CakePHP          27              o   Qualquer dado do POST de qualquer formulário é guardado aqui, inclu...
Desenvolvendo com CakePHP          28O atributo $cacheAction serve para criar cache das views, e o atributo $paginate é us...
Desenvolvendo com CakePHP       29Ainda que o CakePHP vá automaticamente chamá-lo (a menos que você configure $this->autoR...
Desenvolvendo com CakePHP        30       beforeFilter()Essa função é executada antes de qualquer action no controller. É...
Desenvolvendo com CakePHP         31Se $this->data[Compra][destino] é igual a “Padaria da Cidade Velha”, postConditionscon...
Desenvolvendo com CakePHP         32(/nomedocontroller/nomedaaction/parametros). Se o array $options incluir um valor dere...
Desenvolvendo com CakePHP          33?>Se o array $options contiver um valor “return”, a action do controller será renderi...
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Manual cake
Upcoming SlideShare
Loading in …5
×

Manual cake

4,549 views

Published on

Manual CakePHP 1.2

Published in: Education
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
4,549
On SlideShare
0
From Embeds
0
Number of Embeds
26
Actions
Shares
0
Downloads
236
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

Manual cake

  1. 1. MANUAL CAKEPHP 1.2 Juan Basso 3 de março de 2008
  2. 2. SumárioPARTE I. COMEÇANDO COM CAKEPHP ......................................................................7Prefácio ................................................................................................................................................. 7 Requisitos do leitor .................................................................................................................................. 7Introdução ao CakePHP ......................................................................................................................... 7 O que é CakePHP? Por que usar? ............................................................................................................. 7 Onde obter ajuda? ................................................................................................................................... 8Entendendo o Model-View-Controller (MVC) ........................................................................................ 9 Introdução ................................................................................................................................................ 9 Benefícios ............................................................................................................................................... 10PARTE II. PRINCÍPIOS BÁSICOS DO CAKEPHP ....................................................... 11Estrutura CakePHP ............................................................................................................................... 11 Extensões de controller ......................................................................................................................... 11 Extensões de view .................................................................................................................................. 11 Extensões do model ............................................................................................................................... 11 Extensões de aplicação .......................................................................................................................... 12Estrutura de arquivos do CakePHP ....................................................................................................... 12 Estrutura do diretório App ..................................................................................................................... 13Requisição típica do CakePHP .............................................................................................................. 13Convenções CakePHP ........................................................................................................................... 15 Convenções de arquivos e nome de classes .......................................................................................... 15 Convenções de modelos ........................................................................................................................ 15 Convenções de controladores................................................................................................................ 15 Convenções de visões ............................................................................................................................ 16PARTE III. DESENVOLVENDO COM CAKEPHP ...................................................... 17Requisitos ............................................................................................................................................ 17Preparativos para instalação................................................................................................................ 17 Baixando o CakePHP .............................................................................................................................. 17 Permissões ............................................................................................................................................. 17Instalação ............................................................................................................................................ 18 Desenvolvimento ................................................................................................................................... 18 Produção ................................................................................................................................................ 18 Instalação avançada ............................................................................................................................... 19 Caminho de classes adicionais ........................................................................................................... 20 i
  3. 3. Apache e mod_rewrite .......................................................................................................................... 20 Comece agora! ....................................................................................................................................... 20Configuração........................................................................................................................................ 21 Configuração da base de dados ............................................................................................................. 21 Configuração do núcleo ......................................................................................................................... 22 As classes de configuração ..................................................................................................................... 22 Classes de configuração ..................................................................................................................... 22 Variáveis de configuração do núcleo ................................................................................................. 22 Constantes de configuração .............................................................................................................. 22 Configuração de rotas (Routes) ............................................................................................................. 22 Inflexão personalizada ........................................................................................................................... 23 Configuração de inicialização (bootstrap) .............................................................................................. 24Controllers (Controladores) ................................................................................................................. 24 Introdução .............................................................................................................................................. 24 Atributos ................................................................................................................................................ 25 $name ................................................................................................................................................ 25 $components, $helpers e $uses ........................................................................................................ 25 Relativo à página: $layout e $pageTitle ............................................................................................. 26 Atributos dos parâmetros ($params) ................................................................................................ 26 Outros atributos ................................................................................................................................ 27 Métodos ................................................................................................................................................. 28 Interagindo com as visões ................................................................................................................. 28 Fluxo de controle ............................................................................................................................... 29 Callbacks ............................................................................................................................................ 29 Outros métodos ................................................................................................................................. 30Components (Componentes) ............................................................................................................... 33 Introdução .............................................................................................................................................. 33 Construindo componentes personalizados............................................................................................ 33 Acessando classes do MVC de dentro dos componentes ...................................................................... 34Models (Modelos)................................................................................................................................ 34 Introdução .............................................................................................................................................. 34 Campos mágicos .................................................................................................................................... 34 Atributos ................................................................................................................................................ 34 Métodos ................................................................................................................................................. 34 Associações ............................................................................................................................................ 34 Introdução ......................................................................................................................................... 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 relações durante execução ............................................................................ 45 DataSources ........................................................................................................................................... 47 Behaviors................................................................................................................................................ 47 ii
  4. 4. Introdução ......................................................................................................................................... 47 Usando Behaviors .............................................................................................................................. 47 TreeBehavior ..................................................................................................................................... 47 TranslateBehavior .............................................................................................................................. 47 ACLBehavior ....................................................................................................................................... 47Views (Visões)...................................................................................................................................... 47 Templates / Skin ..................................................................................................................................... 47 Layouts ................................................................................................................................................... 48 Elements (Elementos) ............................................................................................................................ 50Helpers (Ajudantes) ............................................................................................................................. 50 Introdução .............................................................................................................................................. 50 Helpers do CakePHP ............................................................................................................................... 51 Criando helpers ...................................................................................................................................... 52 Incluindo outros helpers .................................................................................................................... 52 Usando seus helpers personalizados ................................................................................................. 53 Contribuindo ...................................................................................................................................... 53Scaffolding ........................................................................................................................................... 53 Introdução .............................................................................................................................................. 53 Personalizando os scaffolds ................................................................................................................... 54CakePHP Console ................................................................................................................................. 55 Introdução .............................................................................................................................................. 55 Criando Shells e Tasks ............................................................................................................................ 55 Criando suas Shells ............................................................................................................................ 55 Tasks .................................................................................................................................................. 55Gerando código com Bake ................................................................................................................... 55Plugins ................................................................................................................................................. 55 Criando um plugin .................................................................................................................................. 55 Plugin de controladores ..................................................................................................................... 55 Plugin de modelos ............................................................................................................................. 55 Plugin de visões ................................................................................................................................. 55 Plugin de informações ....................................................................................................................... 55Constantes e funções globais ............................................................................................................... 55 Funções globais ...................................................................................................................................... 55 Constantes do núcleo ............................................................................................................................. 58 Constantes do diretório ......................................................................................................................... 58PARTE IV. TAREFAS COMUNS COM CAKEPHP ......................................................... 60Validação de dados .............................................................................................................................. 60 Regras simples ....................................................................................................................................... 60 Uma regra por campo ............................................................................................................................ 60 rule ..................................................................................................................................................... 60 iii
  5. 5. required ............................................................................................................................................. 60 allowEmpty ........................................................................................................................................ 60 on ....................................................................................................................................................... 60 message ............................................................................................................................................. 60 Múltiplas regras por campo ................................................................................................................... 60 Construindo regras de validação ............................................................................................................ 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 validação personalizada ........................................................................................................ 60 Validação por expressões regulares personalizadas ......................................................................... 61 Validação por métodos personalizados ............................................................................................. 61Limpeza de dados ................................................................................................................................ 61Manipulação de erros .......................................................................................................................... 61Debugando .......................................................................................................................................... 61Gerando caches ................................................................................................................................... 61Logando ............................................................................................................................................... 61 Introdução .............................................................................................................................................. 61 Usando as funções de log ...................................................................................................................... 61Testando .............................................................................................................................................. 62Internacionalizando ............................................................................................................................. 62 Definindo o locale da sua aplicação ....................................................................................................... 62 Internacionalizando em CakePHP .......................................................................................................... 63Paginação ............................................................................................................................................ 64 Configurando os controladores ............................................................................................................. 64 Paginando nas visões ............................................................................................................................. 64 Paginando com AJAX .............................................................................................................................. 64 Alterações no layout .......................................................................................................................... 64 Alterações nas visões ......................................................................................................................... 64 iv
  6. 6. PARTE V. COMPONENTES INTERNOS ....................................................................... 65Lista de controle de acessos (ACL)........................................................................................................ 65Autenticação........................................................................................................................................ 65Sessões ................................................................................................................................................ 65Manipulando requisições ..................................................................................................................... 65Segurança ............................................................................................................................................ 65E-mail .................................................................................................................................................. 65Cookies ................................................................................................................................................ 65 Introdução .............................................................................................................................................. 65 Configurando os controladores ............................................................................................................. 65 Usando o componente ........................................................................................................................... 65PARTE VI. HELPERS INTERNOS .................................................................................... 66Formulários ......................................................................................................................................... 66 Criando formulários ............................................................................................................................... 66 $options[type].................................................................................................................................. 66 $options[action] ............................................................................................................................... 67 $options[url] .................................................................................................................................... 67 $options[default] ............................................................................................................................. 67 Fechando formulários ............................................................................................................................ 68 Elemento de formulário mágico ............................................................................................................ 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 Métodos específicos do elemento de formulário .................................................................................. 71HTML ................................................................................................................................................... 73 Inserindo elementos bem-formados ..................................................................................................... 73JavaScript............................................................................................................................................. 73 v
  7. 7. AJAX ....................................................................................................................................................... 73 Opções do AjaxHelper ............................................................................................................................ 73 Opções gerais..................................................................................................................................... 73 Opções de callback ............................................................................................................................ 73 Métodos ................................................................................................................................................. 73Cache ................................................................................................................................................... 73Form .................................................................................................................................................... 73Number ............................................................................................................................................... 73Text ..................................................................................................................................................... 73Time..................................................................................................................................................... 73PARTE VII. EXEMPLOS .................................................................................................. 74Tutorial de como fazer um blog em CakePHP ....................................................................................... 74Sistema simples de autenticação de usuários ...................................................................................... 74PARTE VIII. APÊNDICES ................................................................................................. 75Escritores da versão inglesa ................................................................................................................. 75Tradutores para língua portuguesa ...................................................................................................... 75 Apoio e revisão da versão traduzida ...................................................................................................... 75Inflexão em português ......................................................................................................................... 75 vi
  8. 8. Começando com CakePHP 7 Parte I. Começando com CakePHPPrefácioBem vindo ao paraíso de desenvolvimento web.Se você está lendo o prefácio de um manual técnico, é porque está lhe sobrando bastantetempo. Não somos celebridades e o material é o que vem depois. Você pode pular estescapítulos supérfluos e ir direto ao ponto nas seções que você quer.Requisitos do leitorPara ler este manual, você já deve estar familiarizado com o PHP. Conhecer de programaçãoorientada a objeto irá lhe ajudar bastante, porém eu suponho que as seções de introduçãodeste manual servirão como um bom exemplo do que vem pela frente. Com isso, este materialé escrito para desenvolvedores de todos os níveis de habilidade que desejam criar algorobusto, sustentável, rápido e agradável.Devo alertar que haverá seções que abordam tecnologias que estão realmente fora do âmbitodeste manual. Administração de servidor Web, AJAX e JavaScript, por exemplo, podem sermencionados em partes do texto, mas na maior parte do texto nós estaremos focado noCakePHP.Introdução ao CakePHPO que é CakePHP? Por que usar?CakePHP é gratuito, de código aberto, uma framework em PHP para desenvolvimento ágil. Éuma estrutura fundamental para programadores criarem aplicações web. Nosso principalobjetivo é permitir que você trabalhe em uma estrutura que possa programar de forma rápidae sem a perda de flexibilidade.CakePHP joga fora a monotonia do desenvolvimento web. Nós oferecemos todas asferramentas que você precisa para começar programando o que realmente deseja: a lógicaespecífica da sua aplicação. Em vez de reinventar a roda cada vez que se constrói um novoprojeto, pegue uma cópia do CakePHP e comece a construir sua carruagem real da suaaplicação.CakePHP tem uma equipe de desenvolvedores e uma grande comunidade, trazendo grandevalor ao projeto. Além de manter você fora do reinvento da roda, usando CakePHP significaque o núcleo da sua aplicação é bem testado e constantemente aperfeiçoado.Abaixo segue uma pequena lista dos recursos que você poderá desfrutar no CakePHP:  Ativo e com comunidade amigável;  Licença flexível;  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;
  9. 9. Começando com CakePHP 8  Aplicações scaffolding;  Geração de código;  Arquitetura MVC (Model, View, Controller, ou Modelo, Visões, Controlador);  Requisições ao expedidor com clareza, URLs personalizáveis e rotas;  Validações internas;  Templates rápidos e flexíveis (Sintaxe PHP e com ajudantes);  Ajudantes para usar AJAX, JavaScript, HTML, formulários e outros nas visões;  Componentes de E-mail, Cookie, Segurança, Sessões, Manipulação de Requisições e outros;  Lista de controle de acessos flexível;  Limpeza de dados;  Flexibilidade com cache;  Internacionalização;  Funciona em qualquer subdiretório do seu website, com poucas configurações do Apache.Onde obter ajuda?Você começou no lugar certo. Este manual (e a API) deve ser provavelmente o primeiro lugarque você vá para procurar as respostas das suas dúvidas. Assim como acontece com muitosoutros projetos de código aberto, nós obtemos novos usuários regularmente. Tentamos ser osmelhores para responder seus questionamentos em primeiro lugar. As respostas podemdemorar a chegar, mas permanecerá por tempos e ajudará a esclarecer outras pessoas. Tantoo manual, quanto a API podem ser encontradas online.http://manual.cakephp.com.br (em português)http://manual.cakephp.org (em inglês)http://api.cakephp.org/1.2 (em inglês)Se você estiver assustado, dê um grito pelo canal de IRC internacional ou entre no grupo dacomunidade luso-brasileira. Além da equipe de desenvolvimento do núcleo do CakePHP nocanal, principalmente durante o dia. Se você precisar de alguma ajuda, deseja encontrarusuários na sua área ou gostaria de doar o novo carro esportivo, gostaríamos de falar comvocê.Grupo da comunidade luso-brasileira: http://groups.google.com/group/cake-php-pt#cakephp-pt @ irc.freenode.net (em português)#cakephp @ irc.freenode.net (em inglês)O CakePHP Bakery é uma casa para todas as coisas de CakePHP. Visite este site para vertutoriais, estudos de caso e exemplos de código. Assim que estiver familiarizado com oCakePHP, faça o login e compartilhe seus conhecimentos com a comunidade para ganhar famae fortuna.http://bakery.cakephp.org
  10. 10. Começando com CakePHP 9O CakeForge é outro recurso que os desenvolvedores podem usar para hospedar seus projetosusando CakePHP e compartilhar com outras pessoas. Se você está olhando para achar projetosexistentes, ou querendo compartilhar, acesso o CakeForge.http://www.cakeforge.orgO site oficial do CakePHP está sempre esperando sua visita. Ele tem links para sites de outrosdesenvolvedores, screencasts, oportunidade para doar ao projeto e downloads.http://www.cakephp.orgEntendendo o Model-View-Controller (MVC)IntroduçãoAplicações bem escritas em CakePHP segue o design pattern MVC (Model-View-Controller ouModelo-Visão-Controlador). Programando em MVC separa sua aplicação em três partesprincipais. O model representa os dados, a view representa a visualização dos dados e ocontroller manipula e roteia as requisições dos usuários. Figura 1. Requisição típica do CakePHPA Figura 1 mostra um exemplo de uma simples requisição MVC em CakePHP. Para finsilustrativos, digamos que um usuário chamado Ricardo apenas clicou no link “Comprar umbolo personalizado agora!” da sua aplicação. 1. Ricardo clica no link apontando para http://www.exemplo.com.br/cakes/comprar e seu navegador faz uma requisição ao site; 2. O dispatcher (expedidor) verifica a URL requisitada (/cakes/comprar) e redireciona ao controller correto; 3. O controller executa a lógica específica da aplicação. Por exemplo, verifica se o Ricardo está logado; 4. O controller também usa os models para acessar os dados da sua aplicação. 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 mágica sobre os dados, ele repassa para a view. A view faz com que os dados fiquem prontos para a representação do usuário. As views em CakePHP normalmente vem no formato HTML, mas pode ser facilmente exibidas em
  11. 11. Começando com CakePHP 10 PDF, documento XML, um objeto JSON ou outro formato qualquer, dependendo da sua necessidade; 6. Uma vez que a visão tenha usado os dados provenientes do controller para construir a página, o conteúdo é retornado ao browser do Ricardo.Aproximadamente toda requisição da sua aplicação seguirá o modelo básico do modelo. Nósvamos especificar os detalhes mais adiante, mas mantenha essa visão geral no seupensamento.BenefíciosPor que usar MVC? Porque é um verdadeiro padrão de desenvolvimento (design pattern) etorna fácil a manutenção da sua aplicação, com pacotes modulares de rápidodesenvolvimento. Elaborar tarefas divididas entre models, views e controllers, faz com que suaaplicação fique leve e independente. Novas funcionalidades são facilmente adicionadas e darnova cara nas características antigas pode ser feitas num piscar de olhos. O design modular eseparado também permite aos desenvolvedores e designers trabalhem simultaneamente,incluindo a habilidade de um construir um rápido protótipo. A separação também permite queos desenvolvedores alterem uma parte da aplicação sem afetar outras.Se você nunca desenvolveu uma aplicação neste sentido, isso vai lhe agradar muito, masestamos confiantes que depois de construir sua primeira aplicação em CakePHP, você não vaiquerer voltar atrás.
  12. 12. Princípios básicos do CakePHP 11 Parte II. Princípios básicos do CakePHPEstrutura CakePHPCakePHP possui a característica de usar as classes de Controller, Model e View, mas tambémpossui classes e objetos adicionais que fazem o desenvolvimento em MVC mais rápido eagradável. Components, Behaviors e Helpers são classes que proporcionam extensibilidade ereuso para adicionar funcionalidades rapidamente à base MVC das suas aplicações. Agoravamos começar a subir um pouco o nível para analisar os detalhes de como usar estasferramentas mais tarde.Extensões de controllerO Component (Componente) é uma classe que ajuda na lógica do controller. Se você tem amesma lógica e quer compartilhar entre controllers (ou aplicações), o component é uma boasaída. Por exemplo, o component interno EmailComponent cria e envia e-mails em segundoplano. Ao invés de escrever um método em cada controller que utiliza esta lógica, pode-se criarum component que empacote esta funcionalidade e seja compartilhado entre os controllers.Controllers também são equipados com callbacks. Estes callbacks estão disponíveis para quevocê possa utilizar, apenas se você precisar inserir uma lógica entre operações do núcleo doCakePHP. Os callbacks disponíveis incluem:  beforeFilter(), executado antes de qualquer ação do controller;  beforeRender(), executado depois da lógica do controller, mas antes da view ser renderizada;  afterFilter(), executado depois de todas as lógicas do controller, incluindo a renderização da view. Não há diferença entre afterRender() e afterFilter(), exceto que você tenha feito uma chamada manualmente para render() no seu método do controller e tenha incluído alguma lógica depois dessa chamada.Extensões de viewO Helper (Ajudante) é a classe que ajuda na lógica da view. Assim como o component ajuda ocontroller, os helpers permitem a apresentação lógica ser acessada e compartilhada entre asviews. AjaxHelper é um dos principais helpers. Ele faz requisições AJAX facilmente de dentrodas views.A maioria das aplicações tem partes do código que são usados repetidamente nas views.CakePHP facilita o reuso de código na view com a utilização de layouts e elements (elementos).Por padrão, toda view é renderizada por um controller seguindo algum layout. Os elements sãocomo pequenos trechos de código necessários que podem ser reutilizados em diversas views.Extensões do modelAssim como as outras extensões, os Behaviors funcionam do mesmo modo, adicionandofuncionalidades entre os models. Por exemplo, se você armazenar os dados do usuário emuma estrutura de árvore, você pode especificar o model User como comportamento de árvoree ganhar funcionalidades para remover, adicionar e alterar nós em sua estrutura de árvorefundamental.
  13. 13. Princípios básicos do CakePHP 12Os models também são suportados por outra classe chamada DataSource. DataSources sãoabstrações que permitem os models manipularem diferentes tipos de dadosconsistentemente. Enquanto a principal fonte de dados numa aplicação CakePHP é via bancode dados, você pode escrever DataSources adicionais que permitem seu model representar umfeed RSS, arquivo CSV, entidades LDAP ou eventos iCal. DataSources permite você associarregistros de diferentes fontes: ao invés de limitar em joins do SQL, DataSources permitem vocêchamar seu model de LDAP que está associada a vários eventos iCal.Assim como nos controllers, models têm recursos de callback como:  beforeFind()  afterFind()  beforeValidate()  beforeSave()  afterSave()  beforeDelete()  afterDelete()Os nomes desses métodos devem ser descritivos o bastante para que você saiba o que elesfazem. Certifique-se de pegar os detalhes no capítulo sobre model.Extensões de aplicaçãoTanto os controllers, helpers e models têm uma classe pai que você pode usar para definirmodificações na aplicação. AppController (localizado em “/app/app_controller.php”),AppHelper (localizado em “/app/app_helper.php”) e AppModel (localizado em“/app/app_model.php”) são bons lugares para colocar métodos que você precisa para acessarentre todos os controllers, helpers e models.Embora não sejam classes ou arquivos, as rotas definem regras na requisição feita para oCakePHP. As definições das rotas definem como o CakePHP deve mapear uma URL para ummétodo do controller. O behavior padrão assume que a URL “/controller/action/var1/var2”mapeia para Controller::action($var1, $var2), mas você pode usar rotas para personalizar URLse como elas devem ser interpretadas pela sua aplicação.Alguns recursos na sua aplicação podem ser empacotados com mérito. Um plugin é um pacotede model, controller e view que realiza um objetivo específico que pode abranger váriosaplicativos. Um sistema de gestão de usuários ou um blog simplificado podem ser bonsexemplos 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 darequisição básica do MVC, mas não sabe como que os arquivos são organizados.  app  cake  docs  index.php
  14. 14. Princípios básicos do CakePHP 13  vendorsQuando você faz o download do CakePHP, você verá que possui quatro pastas principais. Apasta app será o lugar da sua mágica: aqui serão guardados os arquivos da sua aplicação. Apasta cake é onde a mágica acontece. Faça um compromisso pessoal de não editar os arquivosdesta pasta! Nós não ajudamos você se você modificá-la. A pasta docs contém as informaçõesde alterações, licença, etc. Finalmente, a pasta vendors é onde você colocará aplicativos deterceiros para utilizar na aplicação, por exemplo, jQuery, prototype, FCKEditor, etc.Estrutura do diretório AppA pasta app do CakePHP é onde normalmente você colocará sua aplicação emdesenvolvimento, Vamos dar uma olhada mais de perto dentro desta pasta. Tabela 1. Descrição dos diretórios de appDiretório Descriçãoconfig Contém os arquivos de configuração. Detalhes das conexões ao banco de dados, bootstrapping, arquivos de configuração do núcleo e outros devem ser armazenados aqui.controllers Contém os controllers da sua aplicação e seus components.locale Guarda os arquivos com as strings para internacionalizaçao.models Contém os models, behaviors e datasources da sua aplicação.plugins Contém os pacotes de plugins.tmp Aqui é onde o CakePHP armazena os arquivos temporários. Os dados atuais são armazenados onde você tenha configurado o CakePHP, mas esta pasta normalmente é usada para guardar a descrição dos models, logs e outras informações, como as das sessões.vendors Qualquer classe ou biblioteca de terceiro deve ser armazenada aqui. Para fazer um acesso rápido e fácil, use a função vendors(). Você pode achar que esta pasta é redundante, já que existe uma pasta com mesmo nome no nível superior da estrutura. Nós vamos ver diferenças entre estas duas pastas quando discutirmos sobre manipulação de múltiplas aplicações e sistemas mais complexos.views Arquivos de apresentação devem vir aqui: elements, páginas de erro, helpers, layouts e arquivos de views.webroot No modo de produção, esta pasta deve servir como a pasta raiz da sua aplicação. Dentro desta pastas são guardados os arquivos públicos, como estilos CSS, imagens e arquivos de JavaScript.Requisição típica do CakePHPNós cobrimos os ingredientes básicos no CakePHP, então vamos ver como cada objetofunciona em uma completa requisição. Continuando com nossa requisição original deexemplo, vamos imaginar que nosso amigo Ricardo tenha clicado no link em “Comprar umbolo personalizado agora!” da sua aplicação CakePHP.
  15. 15. Princípios básicos do CakePHP 14Figura 2. Requisição típica no CakePHP. Em preto, elemento necessário; 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 requisição ao seu servidor de web; 2. O roteador processa a URL, extraindo os parâmetros desta requisição: o controller, action (ação) e qualquer outro argumento que vai afetar na lógica do negócio durante esta requisição; 3. Usando rotas, a requisição da URL é mapeada para a action do controller (um método específico da classe do controller). Neste caso, o método buy() do CakesController. O callback beforeFilter() do controller é chamado antes de qualquer action do controller ser executada; 4. O controller pode usar métodos para ter acesso aos dados da aplicação. Neste exemplo, o controller usa o model para ver no banco de dados as últimas compras de Ricardo. Qualquer callback aplicável do modelo, behaviors e DataSources podem ser aplicados durante esta operação. Enquanto um model não é necessário, 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 operações (manipular sessões, autenticação 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 são repassados as views usando o método set() do controller. Callbacks dos controllers podem ser aplicados antes dos dados serem enviados. A lógica da view é efetuada, podendo incluir elements ou helpers. Por padrão, as views são sempre renderizadas dentro de um layout; 8. Além disso, callbacks dos controllers (como afterFilter) pode ser aplicado. Para completar, o código renderizado pela view vai para o navegador do Ricardo.
  16. 16. Princípios básicos do CakePHP 15Convenções CakePHPNós somos grandes fãs de convenções nas configurações. Enquanto isso toma um pouco detempo para aprender as convenções do CakePHP, você ganha tempo em um longo processo:seguindo as convenções, você ganha funcionalidades gratuitamente e livra-sede madrugas demanutenção de arquivos de configuração. Convenções também fazem com que o sistemafique uniformemente desenvolvido, permitindo outros desenvolvedores o ajudem maisfacilmente.Convenções no CakePHP tem sido produzida por anos de experiência em desenvolvimentoweb e boas práticas. Enquanto nós sugerimos você a usar essas convenções enquantodesenvolve em CakePHP, nós devemos mencionar que muitos desses princípios são facilmentesobrescritos por alguma coisa que é especialmente passado quando trabalha-se com sistemaslegados.Convenções de arquivos e nome de classesEm geral, nome dos arquivos são sublinhados, enquanto nome de classes são CamelCased, ouseja, primeiras letras das palavras em maiúsculo. A classe KissesAndHugsController pode serencontrada no arquivo kisses_and_hugs_controller.php, por exemplo.Porém, o nome da class e seu tipo não são necessariamente encontrados no nome do arquivo.A classe EmailComponent é encontrada no arquivo chamado email.php e a classe HtmlHelperé encontrada no arquivo html.php.Convenções de modelosNome das classes de modelo devem ser no singular e CamelCased. Person, BigPerson eReallyBigPerson são todos os exemplos de nomes convencionados para modelos.Os nomes das tabelas correspondem ao nome do modelo do CakePHP, mas no plural esublinhados. As tabelas para os modelos mencionados anteriormente devem ser people,big_people e really_big_people, respectivamente.Tabelas associadas, usadas em relações hasAndBelongsToMany entre modelos, devem sernomeadas depois dos modelos das tabelas que a compõem, em ordem alfabética(apples_zebras em vez de zebras_apples). Se sua aplicação possui esse tipo de relação entre osmodelos Tag e Post, o nome deve ser posts_tags.Convenções de controladoresO nome das classes de controladores são no plural, CamelCased e no final “Controller”.PeopleController, BigPeopleController e ReallyBigPeopleController são todos os exemplosconvencionais para nome de controladores.A primeira função que você deve escrever em um controlador deve ser o método index().Quando alguém requisita um controlador sem ação, o behavior padrão é renderizar o métodoindex() do controlador. Por exemplo, a requisição para http://www.exemplo.com.br/apples/mapeia para a chamada da função index() do ApplesController, assim comohttp://www.exemplo.com.br/apples/view mapeia para a chamada da função view() noApplesController.
  17. 17. Princípios básicos do CakePHP 16Você também pode alterar a visibilidade das funções do controlador em CakePHP colocandosublinhados na frente do nome das funções. Se a função do controlador estiver comsublinhado na frente, a função não será disponibilizada para acesso da web através dodispatcher, mas estará disponível para uso interno.Convenções de visõesOs arquivos de template das visões são chamados depois das funções que os controladoresmostram, na forma com sublinhados. A função getReady() da classe PeopleController iráprocurar pelo template da visão em /app/views/people/get_ready.ctp.O modelo básico é /app/views/controller/underscored_function_name.ctp.Nomeando os pedaços da aplicação usando as convenções do CakePHP, você ganhafuncionalidades sem luta e proteção configuração. Aqui o exemplo final que vincula asassociações:  Tabela no banco de dados: “people”  Classe do Modelo: “Person”, encontrada em /app/models/person.php  Classe do Controlador: “PeopleController”, encontrado em /app/controllers/people_controller.php  Template da Visão: encontrado em /app/views/people/index.ctpUsando estas convenções, CakePHP sabe que a requisição parahttp://www.exemplo.com.br/people/ mapeia para a chamada da função index() doPeopleController, onde o modelo Person é automaticamente disponibilizado (eautomaticamente associado a tabela “people” no banco de dados), e renderiza isso para oarquivo. Nenhuma destas relações foram configuradas por qualquer meio que não seja atravésda criação 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 comofazer um blog em CakePHP, disponível na parte de Exemplos deste manual.
  18. 18. Desenvolvendo com CakePHP 17 Parte III. Desenvolvendo com CakePHPRequisitos  Servidor HTTP. Apache com mod_rewrite é preferido, mas não é obrigatório.  PHP 4.3.2 ou superior. Sim! CakePHP funciona com PHP 4 e PHP 5.Tecnicamente um banco de dados não é obrigatório, mas nós imaginamos que a maioria dasaplicações irão 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 instalaçãoBaixando o CakePHPHá duas maneiras de pegar uma cópia do CakePHP, Primeiro: você pode baixar o arquivo(zip/tar.gz/tar.bz2) ou você pode baixar o código do repositório SVN.Para pegar a cópia estável, visite o site http://www.cakephp.org. Lá haverá um link chamado“Download Now!” para baixar. Os arquivos do CakePHP também são armazenados noCakeForge e você pode visitar a página do projeto no sitehttp://cakeforge.org/projects/cakephp.Se você quer os arquivos mais atuais, verifique no sitehttp://cakephp.org/downloads/index/nightly e verás a última versão estável, porém nemsempre a última release. Nestas versões incluem correções entre releases. Ou seja, são versõesintermediárias entre releases, mas que são estáveis.Para pegar os arquivos direto do repositório SVN, conecte-se emhttps://svn.cakephp.org/repo/branches/1.2.x.x.PermissõesO CakePHP usa o diretório /app/tmp para diversas operações. Descritivos dos modelos, fazercache de visões e informações das sessões são alguns exemplos.Assim, tenha certeza que o diretório /app/tmp na instalação do seu cake permite escrita pelousuário do servidor de web.
  19. 19. Desenvolvendo com CakePHP 18InstalaçãoInstalando o CakePHP pode ser feito simplesmente descompactando o conteúdo no seuservidor web ou de forma mais complexa e flexível, do jeito que você preferir. Esta seção vaisfalar de três maneiras de instalar o CakePHP: desenvolvimento, produção e avançada.  Desenvolvimento: fácil para começar, URL dos seus aplicativos incluem o diretório de instalação do CakePHP e é menos seguro;  Produção: Requer maior habilidade para configurar o servidor web, porém mais seguro e com URLs mais amigáveis;  Avançada: Com algumas configurações, permite você colocar os diretórios do CakePHP em diferentes locais do sistema, possibilitando compartilhar o núcleo do CakePHP entre diversas aplicações.DesenvolvimentoApenas coloque seus arquivos do CakePHP no diretório público do seu servidor web(normalmente htdocs, www, public_html). Por exemplo, assumindo que o diretório público doseu servidor web seja /var/www/html, os arquivos devem ficar desta maneira:  /var/www/html o /cake_1_2  /app  /cake  /docs  /index.php  /vendorsPara ver a sua aplicação CakePHP, entre no link http://www.exemplo.com/cake_1_2/.ProduçãoPara utilizar-se do modelo de produção, você precisará ter privilégios de acessar o diretóriopúblico do servidor web. Escolhendo o modo de produção significa que todo o domínio agecomo um único pedido CakePHP.A disposição dos arquivos no modo de produção fica da seguinte maneira:  /pasta_para_o_cake/ o /app  /webroot (este diretório deve ser seu diretório público do servidor web) o /cake o /docs o /index.php o /vendorsSe sua aplicação está hospedada no Apache, a diretiva DocumentRoot para seu domínio deveficar assim:DocumentRoot /pasta_para_o_cake/app/webroot
  20. 20. Desenvolvendo com CakePHP 19Para ver sua aplicação CakePHP, entre no link http://www.exemplo.com.br.Instalação avançadaAqui estão algumas situações que você escolhe o lugar onde os diretórios do CakePHP vão ficarno seu sistema. Isto pode ser por causa de uma restrição do sistema ou para compartilhar asbibliotecas entre diferentes aplicações. Esta seção descreve como espalhar seus diretórios dosCakePHP no sistema.Primeiro, note que há três partes principais da sua aplicação CakePHP: 1. As bibliotecas do núcleo do CakePHP, em /cake; 2. O código da sua aplicação, em /app; 3. Os arquivos públicos da sua aplicação, normalmente em /app/webroot.Cada um desses diretórios pode ser colocado em qualquer lugar do seu sistema, com exceçãodo webroot, que precisa estar acessível pelo servidor web. Você pode mover a pasta webrootpara fora do diretório da sua aplicação (app), desde que informe ao Cake onde você vai colocá-la.Para configurar sua instalação do Cake, nós vamos ter que fazer algumas alterações no arquivo/app/webroot/index.php. Aqui existem três constantes que precisaremos editar: ROOT,APP_DIR e CAKE_CORE_INCLUDE_PATH.  ROOT deve ser configurada para informar o diretório onde sua aplicação 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 diretório onde estão as bibliotecas do CakePHP (a pasta cake).Vamos fazer um exemplo para que você veja como funciona a instalação avançada na prática.Imagine que eu quero que a aplicação funcione como segue:  As bibliotecas do CakePHP deverão ser colocadas em /usr/lib/cake;  O diretório público da minha aplicação (webroot) deve ser em /var/www/meusite;  O diretório da aplicação deve ser /home/eu/meusite.Com estas configurações, eu preciso editar o meu arquivo webroot/index.php (que no finaldeve 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, comentários foram removidos)
  21. 21. Desenvolvendo com CakePHP 20É recomendado que você use a constante DS no lugar das barras para entre os diretórios. Issoprevine que não cause erro quando se use a aplicação em sistemas operacionais diferentes,tornando seu código mais portável.Caminho de classes adicionaisEm algumas ocasiões é interessante você compartilhar as classes do MVC entre as aplicaçõesno mesmo sistema. Se você quer um mesmo controller para mesma aplicação, você pode usaro arquivo bootstrap.php do CakePHP para adicionar estas classes adicionais.No bootstrap.php, defina algumas variáveis com nomes especiais para fazer com que oCakePHP olhe nestes diretórios a procura da sua classe:$viewPaths = array();$controllerPaths = array();$modelPaths = array();$helperPaths = array();$componentPaths = array();$behaviorPaths = array();Cada um dessas variáveis especiais pode ser um conjunto na array com o diretório absolutoonde estão às classes que você desejar. Tenha certeza que cada diretório especificado incluaas barras com DS.Apache e mod_rewriteEnquanto o CakePHP é construído para trabalhar com o mod_rewrite e vimos que muitosusuários apanham para conseguir fazer isto funcionar nos seus sistemas, nós lhe daremosalgumas 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 seção que define seu Directory no servidor. Tenha certeza que AllowOverride está configurado como All para o diretório correto de DocumentRoot;  Tenha certeza que você está editando o httpd.conf do sistema antes da configuração do usuário ou do site em específico;  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 sinônimo de ocultamento. Tenha certeza que sua cópia do CakePHP é do site ou repositório oficial do CakePHP e que foi extraído 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 diretório do usuário (http://exemplo.com.br/~username), você terá que modificar o arquivo .htaccess no diretório da base da instalação do CakePHP. Apenas adicione a linha “RewriteBase /~meuusername/”.Comece agora!Tudo bem, vamos ver o CakePHP em ação. Dependendo de qual opção de instalação vocêutilizou, acesse no seu navegador o link http://exemplo.com.br ouhttp://exemplo.com.br/cake_instalado/. Neste ponto, você verá a página padrão do CakePHPe a mensagem do estado da configuração do seu banco de dados.
  22. 22. Desenvolvendo com CakePHP 21Parabéns! Você já pode criar sua primeira aplicação CakePHP.ConfiguraçãoConfiguração da base de dadosO CakePHP espera que os detalhes de configuração da base de dados estejam no arquivo“app/config/database.php”. Um exemplo de configuração da base de dados pode serencontrado em “app/config/database.php.default”.A configuração 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 configuração da base de dadosA conexão $default é usada a menos que outra configuração seja especificada pelapropriedade $useDbConfig em um model. Por exemplo, se minha aplicação tiver uma base dedados adicional do legacy além do padrão, eu poderia usá-la em meus models criando umanova conexão da base de dados de $legacy similar a configuração $default, e ajustando a var$useDbConfig = legacy; nos models apropriados.Preencha corretamente os pares de chave/valor na configuração para atender melhor às suasnecessidades. Tabela 2. Configurações da base de dadosChave Valordriver O nome do driver da base de dados para esta configuração. Exemplos: mysql, postgres, sqlite, pear-drivername, adodb-drivername, mssql, oracle, ou odbc.persistent Se usará ou não uma conexão persistente com a base de dados.host O nome do servidor da base de dados (ou endereço IP).login O usuário desta conta.password A senha desta conta.database O nome da base de dados que esta conexão irá usar.prefix Esta string será adicionada como prefixo no nome de todas tabelas de sua base(opcional) de dados.Se suas tabelas não possuem prefixo, deixe esta string vazia.port A porta TCP ou socket Unix usado para conectar com o servidor.(opcional)enconding Indica qual caractere definido será usado para enviar indicações SQL ao servidor.schema Usado em instalações de base de dados PostgreSQL para especificar qual schema usar.Note que as configurações de prefixo são para as tabelas, não para os models. Por exemplo, sevocê criou um relacionamento entre as tabelas Apple e Flavor, o nome seráprefixo_apples_flavors (não prefixo_apples_prefixo_flavors), isso se sua opção de prefixoestiver como prefixo_.
  23. 23. Desenvolvendo com CakePHP 22A partir deste ponto, você deve dar uma olhada nas Convenções CakePHP, mostradas nestemanual. A nomenclatura correta para suas tabelas (e o nome de algumas colunas) pode livrarde algumas implementações e configurações desnecessárias.Configuração do núcleoAs classes de configuraçãoClasses de configuraçãoVariáveis de configuração do núcleoConstantes de configuraçãoConfiguração de rotas (Routes)Routes é uma funcionalidade que mapeia URLs em ações do controller. Foi adicionado aoCakePHP para tornar URL amigáveis mais configuráveis e flexíveis. Não é obrigatório o uso domod_rewrite para usar routes, mas usando-o fará sua barra de endereços muito mais limpa earrumada.Routes no CakePHP 1.2 foi ampliada e pode ser muito mais poderosa.Antes de você aprender sobre como configurar suas próprias rotas, você deveria saber que oCakePHP vem configurado com um conjunto de rotas padrão. A configuração padrão de rotasdo CakePHP deixará as URLs mais bonitas para qualquer aplicação. Você pode acessardiretamente uma ação via URL colocando seu nome na requisição. Você pode também passarparâmetros para suas ações no controller usando a própria URL.URL para a rota padrão:http://examplo.com/controller/action/param1/param2/param3A URL /noticias/ler mapeia para a ação ler() do controller Noticias (NoticiasController), e/produtos/verInformacoes mapeia para a ação view_informacoes() do controller Produto(ProdutosController). Se nenhuma ação é especificada na URL, a ação index() será chamada.A rota padrão também permite passar parâmetros para as ações usando a URL. Umarequisição /noticias/ler/12 seria equivalente a chamar o método ler(12) no controller Noticias(NoticiasController), por exemplo.Uma novidade no CakePHP 1.2 é a possibilidade de usar parâmetros nomeados. Você podenomear parâmetros e enviar seus valores usando a URL. Uma requisição/noticias/ler/titulo:primeira+noticia/categoria:esportes teria como resultado uma chamada aação ler() do controller Noticias (NoticiasController). Nesta ação, você encontraria os valoresdos parâmetros título e categoria dentro de $this->passedArgs[titulo] e $this->passedArgs[categoria] respectivamente.Alguns exemplos para a rota padrão:URL mapeadas para as ações dos controladores, usando rotas padrão:URL: /monkeys/jump
  24. 24. Desenvolvendo com CakePHP 23Mapeado para: MonkeysController->jump();URL: /productsMapeado para: ProductsController->index();URL: /tasks/view/45Mapeado para: TasksController->view(45);URL: /donations/view/recent/2001Mapeado para: DonationsController->view(recent, 2001);URL: /contents/view/chapter:models/section:associationsMapeado para: ContentsController->view();$this->passedArgs[chapter] = models;$this->passedArgs[section] = associations;Definindo suas próprias rotas permite você definir como sua aplicação irá responder a umadada URL. Defina suas próprias rotas no arquivo “/app/config/routes.php” usando o métodoRouter::connect().O método connect() recebe três parâmetros: a URL que você deseja casar, o valor padrão paraos elementos de rota, e regras de expressões regulares para ajudar a encontrar elementos naURL.O formato básico para uma definição de rota é:Router::connect( URL, array(paramName => defaultValue), array(paramName => matchingRegex))Inflexão personalizadaAs convenções de nomenclatura do Cake podem ser realmente legais. Você pode nomear suatabela big_boxes, seu model BigBox, seu controller BigBoxesController e tudo isso funciona emconjunto automaticamente. A maneira que o CakePHP usa para associar todas juntas é atravésda utilização de inflections (inflexões), que transformam as palavras do singular em plural evice-versa.Existem ocasiões (especialmente para nossos amigos que não falam inglês - nosso caso), ondevocê pode rodar o inflector do CakePHP (a classe que pluraliza, singulariza, camelCases eunder_scores) e não funcionar como você gostaria. Se o CakePHP não reconhecer seu Foci ouFish, editando o arquivo de configuração personalizada de inflexões você poderá indicar seuscasos especiais. O arquivo de configuração é encontrado em /app/config/inflections.php.Neste arquivo, você irá encontrar seis variáveis. Cada uma permite você fazer o ajuste fino dasinflections do CakePHP.Variáveis do inflections.php Descrição$pluralRules Este array contém regras de expressões regulares para pluralizar casos especiais. A chave do array são os patterns e o valor são as substituições.
  25. 25. Desenvolvendo com CakePHP 24$uninflectedPlural Um array que contém palavras que não precisam ser alteradas quando passadas para o plural (lápis, etc.).$irregularPlural Um array que contém palavras e seus plurais. A chave do array contém a forma no singular e o valor a forma no plural. Este array deve ser usado para guardar palavras que não seguem as definições em $pluralRules.$singularRules Similar a $pluralRules, contém as regras para singularizar as palavras.$uninflectedSingular Similar a $uninflectedPlural, contém as palavras que não contém forma no singular. Por padrão, este array tem o mesmo valor de $uninflectedPlural.$irregularSingular Similar a $irregularPlural, contém as palavras que possuem apenas a forma singular.A versão para língua portuguesa do inflections.php pode ser encontrada nos apêndices, com otítulo Inflexão em português.Configuração de inicialização (bootstrap)Controllers (Controladores)IntroduçãoUm controller (ou controlador) é usado para gerenciar a lógica para uma parte de suaaplicação. Mais comumente, controllers são usados para gerenciar a lógica de um único model.Por exemplo, se você está construindo um site para uma padaria online, você pode ter umReceitasController e um IngredientesController gerenciando suas receitas e seus ingredientes.No CakePHP, controllers são nomeados de acordo com o model que manipulam, no plural.O model Receita é manipulado pelo ReceitasController, o model Produto é manipulado peloProdutosController, e por aí vai.Seus controllers de aplicação são classes que estendem a classe CakePHP AppController, a qualpor sua vez estende a classe núcleo Controller. A classe AppController pode ser definida emapp/app_controller.php e deve conter métodos que são compartilhados entre todos os seuscontrollers. A classe AppController estende o Controller que é uma classe padrão da bibliotecaCakePHP.Controllers podem incluir qualquer número de métodos que são geralmente referidos comoactions (ações). Actions são métodos do controlador usados para mostrar views (visões). Umaaction é um único método de um controller. O dispatcher (despachante) do CakePHP chamaactions quando uma requisição casa uma URL com uma action do controller. Retornando aonosso exemplo da padaria online, nosso ReceitasController pode conter as actions ver(),compartilhar() e buscar(). O controller poderia ser encontrado emapp/controllers/receitas_controller.php e poderia conter:<?phpclass ReceitasController extends AppController { function ver($id) { // a lógica da action vai aqui... }
  26. 26. Desenvolvendo com CakePHP 25 function compartilhar($cliente_id, $receita_id) { // a lógica da action vai aqui... } function buscar($busca) { // a lógica da action vai aqui... }}?> app/controllers/receitas_controller.phpPara que você possa usar o controller de forma mais efetiva em sua aplicação, vamos cobriralguns dos principais atributos e métodos fornecidos pelos controllers do CakePHP.AtributosPara uma lista completa de atributos do controller e suas descrições visite a API do CakePHP.Dê uma olhada http://api.cakephp.org/1.2/classController.html.$nameUsuários PHP4 devem iniciar suas definições de controllers usando o atributo $name. Oatributo $name deve conter o nome do controller. Geralmente é apenas a forma plural donome do model. Isso cuida de alguns dos problemas de nomes de classe do PHP4 e ajuda oCakePHP a encontrar os nomes das coisas.<?phpclass ReceitasController extends AppController { var $name = Receitas;}?> Exemplo de uso do atributo $name do controller$components, $helpers e $usesOs próximos atributos de controller usados com maior freqüência dizem ao CakePHP quehelpers (ajudantes), components (componentes), e models você usará junto com o controlleratual. Usar esses atributos disponibiliza essas classes MVC para o controller como variáveis declasse ($this->NomeDoModel, por exemplo).Por favor, perceba que cada controller tem algumas dessas classes disponíveis por padrão,então você pode nem mesmo ter que configurar o seu controller.Controllers tem por padrão seu model principal disponível. Nosso ReceitasController terá omodel Receita disponível em $this->Receita, e nosso ProdutosController também tem acessoao model Produto em $this->Produto.Os helpers Html e Session estão sempre disponíveis por padrão, assim como o componentSession. Para aprender mais sobre essas classes, lembre-se de dar uma olhada em suasrepectivas sessões mais a frente nesse manual.
  27. 27. Desenvolvendo com CakePHP 26Vamos ver como chamar um controller CakePHP no qual você planeja usar classes MVCadicionais.<?phpclass ReceitasController extends AppController { var $name = Receitas; var $uses = array(Receita, Usuário); var $helpers = array(Html, Ajax); var $components = array(Session, Email);}?>Quando estiver definindo esses atributos, tenha certeza de incluir as classes padrão (comoHtml no array $helpers, por exemplo) se você pretende usá-los.Relativo à página: $layout e $pageTitleAlguns poucos atributos existem nos controllers CakePHP que dão maior controle sobre comosuas views são 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 aextensão .ctp. Se esse atributo não for definido, o CakePHP renderiza o layout default(padrão). Se você não definiu um em /app/views/default.ctp, o layout default do núcleo doCakePHP será renderizado.<?phpclass RecipesController extends AppController { function quickSave() { $this->layout = ajax; }}?> Usando $layout para definir um layout alternativoO atributo $pageTitle do controller torna possível definir o título da página renderizada. Paraque isso funcione apropriadamente, seu layout precisa ter embutido a variável$title_for_layout entre as tags <title> no cabeçalho do documento HTML.Apenas atribua à $pageTitle a string que você quer ver no <title> do seu documento.Atributos dos parâmetros ($params)Parâmetros do controller estão disponíveis em $this->params no seu controller CakePHP. Essavariável é usada para dar acesso à informação sobre a requisição atual. O uso mais comum do$this->params é obter acesso à informação que foi enviada ao controller via operações POSTou GET.  $this->params[form]
  28. 28. Desenvolvendo com CakePHP 27 o Qualquer dado do POST de qualquer formulário é guardado aqui, incluindo também informação encontrada em $_FILES.  $this->params[bare] o Guarda 1 se o layout atual está vazio, 0 se não.  $this->params[isAjax] o Guarda 1 se o layout atual é ajax, 0 se não. Essa variável só é configurada se o component RequestHandler está sendo usado no controller.  $this->params[controller] o Guarda o nome do controller atual manipulando a requisição. 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 requisição. 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 requisição 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 variáveis GET. Por exemplo, se a URL /posts/view/?var1=3&var2=4 foi chamada, $this- >params[url] conterá: [url] => Array( [url] => posts/view [var1] => 3 [var2] => 4)  $this->data o Usado para manipular os dados POST enviados dos formulários FormHelper ao controller.// O FormHelper é usado para criar um elemento form:$form->text(Usuario.primeiro_nome);// Quando rederizado, se parece com:<input name="data[Usuario][primeiro_nome]" value="" type="text" />// Quando o formulário é enviado para o controller via POST,// os dados são mostrados em $this->data// O primeiro nome pode ser encontrado aqui:$this->data[Usuario][primeiro_nome];Outros atributosAinda que você possa dar uma olhada nos detalhes de todos os atributos de controllers na API,existem outros atributos de controllers que merecem suas próprias sessões no manual.
  29. 29. Desenvolvendo com CakePHP 28O atributo $cacheAction serve para criar cache das views, e o atributo $paginate é usado paracriar a paginação padrão para o controller. Para mais informação sobre como usar essesatributos, dê uma olhada em suas respectivas sessões mais a frente nesse manual.MétodosPara uma lista completa de métodos do controller e suas descrições visite a API CakePHP. Dêuma olhada http://api.cakephp.org/1.2/class_controller.html.Interagindo com as visões  set(string $var, mixed $value)O método set() é a principal forma de enviar dados do seu controller para sua view. Uma vezque você usou set(), a variável pode ser acessada na sua view.// Primeiro você passa os dados do controller:$this->set(cor, "pink");// Então, na view, você pode utilizar os dados:<p>Você selecionou a cor <?php echo $cor; ?> para colorizar o cake.</p> Exemplo de uso do set()O método set() também pega um array associativo como seu primeiro parâmetro. Esse podeser geralmente um caminho rápido para atribuir um grupo de informações para a view.Perceba que os índices de seu array sofrerão inflection antes de serem atribuídos à view(indice_com_underline se torna indiceComUnderline, etc.):$dados = array( cor => pink, tipo => açucar, preco_base => 23.95);// fazem $cor, $tipo, e $precoBase// disponíveis na view:$this->set($dados);  render(string $action, string $layout, string $file)O método render() é automaticamente chamado ao final de cada action do controllerrequisitada. Esse método executa toda a lógica da view (usando dados que você forneceuusando o método set()), insere a view dentro do layout e o serve de volta para o usuário final.O arquivo de view padrão renderizado é determinado por convenção. Se a action buscar() doReceitasController é requisitada, o arquivo de view /app/views/receitas/buscar.ctp serárenderizado.
  30. 30. Desenvolvendo com CakePHP 29Ainda que o CakePHP vá automaticamente chamá-lo (a menos que você configure $this->autoRender para false) depois de cada lógica de action, você pode usá-lo para especificar umarquivo de view alternativo configurando o nome da action no controller usando $action. Vocêpode também especificar um arquivo alternativo um terceiro parâmetro, $file. Quando usar$file, lembre-se de utilizar um pouco das constantes globais do CakePHP (como a VIEWS).O parâmetro $layout permite especificar o layout na qual a view é renderizada.Fluxo de controle  redirect(string $url, integer $status, boolean $exit)O método de controle de fluxo que você vai usar com maior freqüência é o redirect(). Essemétodo pega seu primeiro parâmetro na forma de uma URL relativa CakePHP. Quando umusuário fez uma compra com sucesso, você provavelmente irá redirecioná-lo para a tela derecibo.function comprar() { // A lógica para finalizar a compra vai aqui... if($sucesso) { $this->redirect(/compras/obrigado); } else { $this->redirect(/compras/confirmar); }} Exemplo de uso do redirect()O segundo parâmetro do redirect() lhe permite definir um código de status HTTP paraacompanhar o redirecionamento. Você pode querer usar 301 (movido permanentemente) ou303 (veja outro), dependendo da natureza do redirecionamento.Esse método não chama exit() depois de redirecionar a menos que você configure o terceiroparâmetro para true.  flash(string $message, string $url, integer $pause)Similarmente, o método flash() é usado para direcionar o usuário para uma nova página depoisde uma operação. O método flash() é diferente pelo fato de mostrar uma mensagem antes depassar o usuário para uma outra URL.O primeiro parâmetro deve guardar a mensagem a ser mostrada, e o segundo parâmetro éuma URL relativa CakePHP. CakePHP vai mostrar a mensagem na variável $message, por umtempo definido em segundos na variável $pause antes de direcionar o usuário.Para mensagens flash dentro da página, dê uma olhada no método setFlash() do componentSession.CallbacksControllers CakePHP vem com callbacks para inserir lógica exatamente antes ou depois dasactions serem rederizadas.
  31. 31. Desenvolvendo com CakePHP 30  beforeFilter()Essa função é executada antes de qualquer action no controller. É o lugar ideal para checaruma sessão ativa ou inspecionar permissões.  beforeRender()Chamada após a lógica da action do controller, mas antes da view ser renderizada. Essecallback não é usado geralmente, mas pode ser necessário 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 métodos  constructClasses()Esse método carrega os models requeridos pelo controller. Esse processo de carregamento éfeito pelo CakePHP normalmente, mas o método é uma boa quando estiver acessandocontrollers de diferentes perspectivas. Se você precisa do CakePHP em um script de linha decomando ou outro uso de fora, constructClasses() pode ser uma boa.  referrer()Retorna a URL referida pela requisição atual.  disableCache()Usado para dizer ao navegador do usuário não fazer cache dos resultados na requisição atual.Isso é diferente do cache da view, coberto no capítulo anterior.  postConditions(array $data, mixed $op, string $bool, boolean $exclusive)Use esse método para tornar um grupo de dados enviados por POST (de inputs compatíveiscom o helper Html) em um grupo de condições de busca para o model. Essa função oferece umatalho rápido para criar lógica de busca. Por exemplo, um usuário administrativo pode quererser capaz de buscar compras para saber quais itens precisam ser enviados. Você pode criar umrápido formulário baseado no model Compra. Então a action do controller pode usar os dadosenviados do formulário para criar as condições de busca.function index() { $c = $this->Compras->findAll($this->postConditions($this->data)); $this->set(compras, $c);}
  32. 32. Desenvolvendo com CakePHP 31Se $this->data[Compra][destino] é igual a “Padaria da Cidade Velha”, postConditionsconverte essa condição para um array compatível para uso no método NomeDoModel->findAll(). Nesse caso, array(“Compra.destino” => “Padaria da Cidade Velha”).Se você quer usar um operador SQL diferente entre os termos, forneça-os usando o segundoparâmetro./*Conteúdo de $this->dataarray( Compra => array( num_de_itens => 4, fornecedor => Trigo Integral LTDA ))*/// Vamos pegar compras que tem ao menos 4 itens e contém Trigo IntegralLTDA$c = $this->Compra->findAll($this->postConditions( $this->data, array(>=, LIKE)));O índice nas especificações de operadores é a ordem das colunas no array $this->data. Já quenum_de_itens é o primeiro, o operador >= aplica-se a ele.O terceiro parâmetro lhe permite dizer ao CakePHP que operador booleano SQL usar entre ascondições de busca. Strings com AND, OR, e XOR são todos valores válidos.Finalmente, se o último parâmetro está configurado para true, e o parâmetro $op é um array,os campos não incluídos em $op não serão incluídos nas condições retornadas.  cleanUpFields(string $modelClass = null)Esse método de conveniência concatena as várias partes de datas em $this->data antes desalvar. Se você tem inputs de data do helper Form, esse método concatena o ano, mês, dia ehora em uma string mais compatível com banco de dados.Esse método usa o model padrão do controller (por ex.: o model Cookie para o controllerCookiesController) como alvo para a concatenação, mas uma classe alternativa pode ser usadacomo primeiro parâmetro.  paginate()Esse método é usado para paginar os resultados divididos pelos seus models. Você podeespecificar tamanhos de páginas, condições de busca do model e mais. Detalhes sobre essemétodo mais a frente. Dê uma olhada no capítulo de paginação mais a frente nesse manual.  requestAction(string $url, array $options)Essa função chama uma action de controller de qualquer lugar e retorna os dados dessa action.A $url passada é uma URL relativa ao CakePHP
  33. 33. Desenvolvendo com CakePHP 32(/nomedocontroller/nomedaaction/parametros). Se o array $options incluir um valor dereturno. AutoRender é automaticamente configurada para true para a action do controller,tendo a requestAction te levando para a view totalmente renderizada.Nota: apesar de ser possível usar requestAction() para pegar uma view totalmenterenderizada, a perda performance que você obtém passando por toda a camada da viewnovamente na realidade não faz valer a pena. O método requestAction() é melhor usado emconjunto com elements - como um caminho para enviar lógica de negócio para um elementantes da renderização.Primeiro, vamos ver como pegar dados da action do controller. Primeiro, nós precisamos criara action do controller que retorna algum dado que precisamos em vários lugares através daaplicação:// Aqui está nosso controller simples:class UsuariosController extends AppController { function pegarListaDeUsuarios() { return $this->Usuario->findAll("Usuario.ativo = 1"); }}Imagine que nós precisamos criar uma simples tabela mostrando os usuários ativos nosistema. Ao invés de duplicar o código de geração de lista em outro controller, nós podemospegar dados do UsuariosController->pegarListaDeUsuarios() ao invés de usar requestAction();class ProdutosController extends AppController { function mostrarProdutosDoUsuario() { $this->set( usuarios, $this->requestAction(/usuarios/pegarListaDeUsuarios) ); // Agora a variável $usuarios na view vai ter dados do // UsuariosController::pegarListaDeUsuarios(). }}Se você tem um element na sua aplicação que não é estático, você pode querer usarrequestAction() para enviar lógica equivalente à do controller para o element a medida em quevocê o injeta nas suas views. Apesar de elements sempre tem acesso a qualquer variável daview que o controller passou, essa é uma forma de passar dados para o element vindos deoutro controller.Se você criou uma action do controller que fornece a lógica necessária, você pode pegar dadose passá-lo para o segundo parâmetro do método renderElement() da view usandorequestAction().<?phpecho $this->renderElement( usuarios, $this->requestAction(/usuarios/pegarListaDeUsuarios));
  34. 34. Desenvolvendo com CakePHP 33?>Se o array $options contiver um valor “return”, a action do controller será renderizada dentrode um layout vazio e retornada. Dessa forma, a função requestAction() é útil também emsituações Ajax onde um pequeno elemento de uma view precisa ser preenchido antes oudurante uma atualização Ajax.Components (Componentes)IntroduçãoComponents (Componentes) são pacotes com funções lógicas que são usadas para seremcompartilhadas entre os controllers. Se você está querendo copiar e colar coisas entre oscontrollers, você pode criar funcionalidades em components para isso.O CakePHP já vem com um conjunto de components para os mais diversos usos, por exemplo:  Segurança  Sessões  Lista de controle de acessos (ACL)  E-mails  Cookies  Autenticação  Manipulação de requisiçõesCada um dos components será explicado em outros capítulos. Por enquanto, mostraremosapenas como criar seus próprios components. Criando components ajuda a manter o código docontroller limpo e permite que você reuse o código entre os projetos ou controllers.Construindo componentes personalizadosSuponha que sua aplicação online precisa utilizar funções complexas de matemática emdiversas partes da aplicação. Poderíamos, então, criar um component para que esta lógica sejacompartilhada 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 básica do arquivo do component ésimilar a apresentada abaixo.<?phpclass MathComponent extends Object { function doComplexOperation($amount1, $amount2) { return $amount1 + $amount2; }}?>Quando seu component estiver criado, nós podemos utilizá-lo nos controllers da aplicaçãocolocando o nome do component no vetor da variável $components:// Isso faz com que o novo component possa ser acessado usando $this->Math

×