CakePHPCookbook.pdf

138
CakePHP Cookbook Documentation Versão 2.x Cake Software Foundation 19 April, 2015

Transcript of CakePHPCookbook.pdf

  • CakePHP Cookbook DocumentationVerso 2.x

    Cake Software Foundation

    19 April, 2015

  • Contedo

    1 Primeiros Passos 1Blog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1Blog - Continuao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5

    2 Instalao 25Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25Licena . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25Baixando o CakePHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Permisses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Configurao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26Desenvolvimento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27Produo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28Instalao Avanada e Configurao Especfica por Servidor . . . . . . . . . . . . . . . . . . . . 28Comece agora! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34

    3 Viso Geral do CakePHP 37O que o CakePHP? Porque us-lo? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37Entendendo o Model-View-Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38Onde obter ajuda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41

    4 Controllers 43A Classe AppController . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43Parmetros de Requisio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44Aes de Controllers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44Ciclo de Vida dos Callbacks em uma Requisio . . . . . . . . . . . . . . . . . . . . . . . . . . . 45Mtodos dos Controllers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45Atributos do Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52Mais sobre Controllers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

    5 Views 71

    i

  • View Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71Usando Blocos de Views (Vises) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73Layouts . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75Elements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77View API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

    6 Plugins 83Instalando um Plugin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83Usando um Plugin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84Criando Seus Prprios Plugins . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85Plugin Controllers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86Plugin Models . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86Plugin Views . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87Imagens de Plugin, CSS e Javascript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88Components, Helpers e Behaviors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88Expanda seu Plugin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89Plugin Dicas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89

    7 Desenvolvimento 91Configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91Routing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91Sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92Error Handling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92Debugging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93REST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93

    8 Implementao 95Definindo a Raiz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95Atualizar o core.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95Multiplas aplicaes usando o mesmo core do CakePHP . . . . . . . . . . . . . . . . . . . . . . 96

    9 Tutoriais & Exemplos 97Blog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97Blog - Continuao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101Autenticao simples e Autorizao da Aplicao . . . . . . . . . . . . . . . . . . . . . . . . . . 112Simple Acl controlled Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118Simple Acl controlled Application - part 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119

    10 Apndices 121Guia de Migrao para a Verso 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121Guia de Migrao para a Verso 2.1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122Migrando da Verso 1.2 para 1.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129Informaes Gerais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130

    11 Indices and tables 131

    ndice 133

    ii

  • CAPTULO 1

    Primeiros Passos

    O framework CakePHP fornece uma base robusta e slida para suas aplicaes. Podendo tratar todos os as-pectos, da requisio inicial do usurio at a renderizao de uma pgina web. Visto que o framework segueo princpio MVC, ele lhe permite customizar e estender facilmente muitos dos aspectos de sua aplicao.

    O framework tambm fornece uma organizao estrutural bsica de nome de arquivos a nomes de tabelas dobanco de dados, mantendo toda sua aplicao consistente e lgica. Este conceito simples mas poderoso.Siga as convenes e voc sempre saber exatamente onde as coisas esto e como esto organizadas.

    A melhor maneira de experimentar e aprender o CakePHP sentar em frente ao computador e construiralguma coisa. Para comear vamos construir um blog simples.

    Blog

    Bem vindo ao CakePHP. Voc provavelmente est lendo este tutorial porque quer aprender mais sobre comoo CakePHP funciona. Nosso objetivo aumentar a produtividade e fazer a programao uma tarefa maisdivertida: Esperamos que voc veja isto na prtica enquanto mergulha nos cdigos.

    Este tutorial ir cobrir a criao de uma aplicao de blog simples. Ns iremos baixar e instalar o Cake, criare configurar o banco de dados e criar a lgica da aplicao suficiente para listar, adicionar, editar e deletarposts do blog.

    Aqui vai uma lista do que voc vai precisar:

    1. Um servidor web rodando. Ns iremos assumir que voc esteja usando o Apache, embora as in-strues para usar outros servidores sejam bem semelhantes. Talvez tenhamos que brincar um poucocom as configuraes do servidor mas a maioria das pessoas sero capazes de ter o Cake rodando semprecisar configurar nada.

    2. Um servidor de banco de dados. Ns iremos usar o MySQL Server neste tutorial. Voc precisa sabero mnimo sobre SQL para criar um banco de dados. O Cake pegar as rdeas a partir deste ponto.

    3. Conhecimento bsico da linguagem PHP. Quanto mais orientado a objetos voc j programou, melhor:mas no tenha medo se f de programao procedural.

    1

  • CakePHP Cookbook Documentation, Verso 2.x

    4. E por ltimo, voc vai precisar de um conhecimento bsico do padro de projetos MVC. Uma rpidaviso geral pode ser encontrada em Entendendo o Model-View-Controller. No se preocupe, deve termeia pgina ou menos.

    Ento, vamos comear!

    Baixando o Cake

    Primeiro, vamos baixar uma cpia recente do CakePHP.

    Para fazer o download de uma cpia recente, visite o projeto do CakePHP no github:http://github.com/cakephp/cakephp/downloads e faa o download da ltima verso 2.0.

    Voc tambm pode clonar o repositrio usando o git1. git clonegit://github.com/cakephp/cakephp.git.

    Idependente da maneira de como voc baixou o Cake, coloque o cdigo obtido dentro do seu diretrio webpblico. A estrutura dos diretrios deve ficar parecido com o seguinte:

    /caminho_para_diretorio_web_publico/app/lib/plugins/vendors.htaccessindex.phpREADME

    Agora pode ser um bom momento para aprender um pouco sobre como funciona a estrutura de diretrios doCakePHP: Veja a seo Estrutura de Diretrios no CakePHP.

    Criando o Banco de Dados do Blog

    Em seguida, vamos configurar o banco de dados correspondente ao nosso blog. Se voc j no tiver feitoisto, crie um banco de dados vazio para usar neste tutorial com o nome que desejar. Neste momento, vamoscriar apenas uma tabela para armazenar nossos posts. Tambm vamos inserir alguns posts para usar comoteste. Execute as instrues a seguir no seu banco de dados:

    -- Primeiro, criamos nossa tabela de postsCREATE TABLE posts (

    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,title VARCHAR(50),body TEXT,created DATETIME DEFAULT NULL,modified DATETIME DEFAULT NULL

    );

    -- Agora inserimos alguns posts para testarINSERT INTO posts (title, body, created)

    VALUES ('The title', 'This is the post body.', NOW());

    1http://git-scm.com/

    2 Captulo 1. Primeiros Passos

  • CakePHP Cookbook Documentation, Verso 2.x

    INSERT INTO posts (title, body, created)VALUES ('A title once again', 'And the post body follows.', NOW());

    INSERT INTO posts (title, body, created)VALUES ('Title strikes back', 'This is really exciting! Not.', NOW());

    A escolha do nome de tabelas e colunas no so arbitrrias. Se voc seguir as convenes de nomenclaturapara estruturas do banco de dados e as convenes para nomes de classes (ambas descritas em Convenesno CakePHP), voc ser capaz de tirar proveito de muitas funcionalidades do CakePHP e evitar arquivosde configuraes. O Cake flexivel o bastante para acomodar at mesmo os piores esquemas de banco dedados legados, mas aderindo as convenes voc poupa seu tempo.

    Veja Convenes no CakePHP para mais informaes. Aqui, basta dizer que ao nomear nossa tabela deposts, automaticamente ela ser ligada ao nosso model Post e as colunas modified e created seroautomagicamente atualizadas pelo CakePHP.

    Configuraes do Banco de Dados

    Para o Alto e Avante: Vamos agora avisar ao Cake onde est nosso banco de dados e como conectar a ele.Para muitos, esta a primeira e ltima configurao a ser feita.

    Uma exemplo de arquivo de configurao do banco de dados pode ser encontrado em/app/Config/database.php.default. Copie este arquivo no mesmo diretrio renomeando-opara database.php.

    O arquivo bem simples: basta alterar os valores da varivel $default com os dados da nossa configurao.Um exemplo completo desta configurao ir se parecer com esta:

    public $default = array('datasource' => 'Database/Mysql','persistent' => false,'host' => 'localhost','port' => '','login' => 'cakeBlog','password' => 'c4k3-rUl3Z','database' => 'cake_blog_tutorial','schema' => '','prefix' => '','encoding' => ''

    );

    Aps salvar seu novo arquivo database.php, voc estar apto para abrir seu navegador e ver a pgina de boasvindas do Cake. A pgina de boas vindas dever lhe mostrar uma mensagem dizendo que seu arquivo deconexo com o banco de dados foi encontrado, e que o Cake conseguiu se conectar com o banco de dados.

    Configurao Opcional

    Existem outros trs itens que podem ser configurados. Muitos desenvolvedores sempre configuram estesitens, mas eles no so obrigatrios para este tutorial. Uma das configuraes customizar uma string (ousalt) para ser utilizada nos hashes de segurana. O segundo definir um nmero (ou seed) para uso emcriptografia. E o terceiro dar permisso de escrita para o CakePHP na pasta tmp.

    Blog 3

  • CakePHP Cookbook Documentation, Verso 2.x

    O security salt utilizado para gerar hashes. Altere o valor padro do salt editando o arquivo/app/Config/core.php na linha 187. No importa muito o que o novo valor seja, basta que noseja fcil de adivinhar.

    /*** A random string used in security hashing methods.

    */Configure::write('Security.salt', 'pl345e-P45s_7h3*S@l7!');?>

    O cipher seed usado para criptografar/descriptografar strings. Altere o valor padro editando o arquivo/app/Config/core.php na linha 192. Como no security salt, no importa muito o que o novo valorseja, basta que no seja fcil de adivinhar.

    /*** A random numeric string (digits only) used to encrypt/decrypt strings.

    */Configure::write('Security.cipherSeed', '7485712659625147843639846751');?>

    A ltima tarefa garantir acesso de escrita para a pasta app/tmp. A melhor maneira para fazer isto localizar o usurio com que o seu servidor web executado () e alterar odono da pasta app/tmp para este usurio. Voc pode executar (em *nix) o comando a seguir para alterar ousurio dono da pasta.

    $ chown -R www-data app/tmp

    Se por alguma razo o CakePHP no conseguir escrever nesta pasta, voc ser avisado por uma mensagemenquanto estiver em modo de desenvolvimento.

    Uma Palavra Sobre o mod_rewrite

    Ocasionalmente, um novo usurio ir esbarrar em problemas com o mod_rewrite, ento vou abord-los su-perficialmente aqui. Se a pgina de boas-vindas do CakePHP parecer um pouco sem graa (sem imagens,sem cores e sem os estilos css), isso um indcio de que o mod_rewrite provavelmente no esteja funcio-nando em seu sistema. Aqui esto algumas dicas para lhe ajudar a deixar tudo funcionando corretamente:

    1. Certifique-se de que a sobrescrita de opes do .htaccess est habilitada: em seu arquivo httpd.conf,voc deve ter uma parte que define uma seo para cada do seu servidor. Certifique-se deque a opo AllowOverride esteja com o valor All para o correto. Por questes desegurana e performance, no defina AllowOverride para All em . Ao invsdisso, procure o bloco que se refere ao seu diretrio raz de seu website.

    2. Certifique-se de estar editando o arquivo httpd.conf ao invs de algum especfico, que seja vlidoapenas para um dado usurio ou para um dado site.

    3. Por alguma razo, voc pode ter obtido uma cpia do CakePHP sem os arquivos .htaccess. Istoalgumas vezes acontece porque alguns sistemas operacionais tratam arquivos que comeam com .como arquivos ocultos e normalmente no fazem cpias deles. Certifique-se de obter sua cpia doCakePHP diretamente da seo de downloads do site ou de nosso repositrio git.

    4 Captulo 1. Primeiros Passos

  • CakePHP Cookbook Documentation, Verso 2.x

    4. Certifique-se de que o Apache esteja carregando o mod_rewrite corretamente! Voc deve ver algocomo:

    LoadModule rewrite_module libexec/httpd/mod_rewrite.so

    ou (para o Apache 1.3):

    AddModule mod_rewrite.c

    em seu httpd.conf.

    Se voc no quiser ou no puder carregar o mod_rewrite (ou algum outro mdulo compatvel)em seu servidor, voc vai precisar usar o recurso de URLs amigveis do CakePHP. No arquivo/app/Config/core.php, descomente uma linha parecida com:

    Configure::write('App.baseUrl', env('SCRIPT_NAME'));

    E remova tambm os arquivos .htaccess em:

    /.htaccess/app/.htaccess/app/webroot/.htaccess

    Com isto, suas URLs ficaro parecidas com www.exemplo.com/index.php/nomecontroller/nomeaction/paramao invs de www.exemplo.com/nomecontroller/nomeaction/param.

    Se voc est instalando o CakePHP em outro webserver diferente do Apache, voc pode encontrar instruespara ter a reescrita de URLs funcionando na seo Instalao Avanada.

    Continue lendo este tutorial em Blog - Continuao para comear a construir sua primeira aplicaoCakePHP.

    Blog - Continuao

    Crie um Model Post

    A classe Model o po com manteiga das aplicaes CakePHP. Ao criar um model do CakePHP queir interagir com nossa base de dados, teremos os alicerces necessrios para posteriormente fazer nossasoperaes de visualizar, adicionar, editar e excluir.

    Os arquivos de classe do tipo model do CakePHP ficam em /app/Model e o arquivo que iremos criar sersalvo em /app/Model/Post.php. O contedo completo deste arquivo deve ficar assim:

    class Post extends AppModel {public $name = 'Post';

    }

    A nomenclatura da classe segue uma conveno que muito importante no CakePHP. Ao chamar nossomodel de Post, o CakePHP pode automaticamente deduzir que este model ser usado num PostsController,e que manipular os dados de uma tabela do banco chamada de posts.

    Nota: O CakePHP ir criar um objeto (instncia) do model dinamicamente para voc, se no encontrar

    Blog - Continuao 5

  • CakePHP Cookbook Documentation, Verso 2.x

    um arquivo correspondente na pasta /app/Model. Isto tambm significa que, se voc acidentalmente der umnome errado ao seu arquivo (p.ex. post.php ou posts.php) o CakePHP no ser capaz de reconhecer nenhumade suas configuraes adicionais e ao invs disso, passar a usar seus padres definidos internamente naclasse Model.

    Para saber mais sobre models, como prefixos de nomes de tabelas, callbacks e validaes, confira o captulosobre /models deste manual.

    Crie o Controller Posts

    A seguir, vamos criar um controller para nossos posts. O controller onde toda a lgica de negcio parainteraes vai acontecer. De uma forma geral, o local onde voc vai manipular os models e lidar como resultado das aes feitas sobre nossos posts. Vamos pr este novo controller num arquivo chamadoPostsController.php dentro do diretrio /app/Controller. Aqui est como um controllerbsico deve se parecer:

    class PostsController extends AppController {public $helpers = array ('Html','Form');public $name = 'Posts';

    }

    Agora, vamos adicionar uma action ao nosso controller. Actions quase sempre representam umanica funo ou interface numa aplicao. Por exemplo, quando os usurios acessarem o endereowww.exemplo.com/posts/index (que, neste caso o mesmo que www.exemplo.com/posts/), eles esperamver a listagem dos posts. O cdigo para tal ao deve se parecer com algo assim:

    class PostsController extends AppController {public $helpers = array ('Html','Form');public $name = 'Posts';

    function index() {$this->set('posts', $this->Post->find('all'));

    }}

    Deixe-me explicar a ao um pouco. Definindo a funo index() em nosso PostsController, os usuriospodem acessar esta lgica visitando o endereo www.exemplo.com/posts/index. De maneira semelhante,se definirmos um mtodo chamado foobar() dentro do controller, os usurios deveriam ser capazes deacess-lo pelo endereo www.exemplo.com/posts/foobar.

    Aviso: Voc pode ficar tentado a nomear seus controller e actions de uma certa maneira visando obteruma certa URL. Mas resista a esta tentao. Siga as convenes do CakePHP (nomes de controllersno plural, etc) e crie nomes de actions e controllers que sejam legveis e tambm compreensveis. Vocsempre vai poder mapear URLs para seu cdigo utilizando rotas, conforme mostraremos mais frente.

    A nica declarao na nossa action utiliza o mtodo set() para passar dados do controller para a view(que vamos criar logo mais). A linha define uma varivel na view chamada posts que vai conter o retornoda chamada do mtodo find(all) do model Post. Nosso model Post est automaticamente disponvelcomo $this->Post uma vez que seguimos as convenes de nomenclatura do Cake.

    6 Captulo 1. Primeiros Passos

  • CakePHP Cookbook Documentation, Verso 2.x

    Para aprender mais sobre controllers do CakePHP, confira a seo Controllers.

    Criando as Views de Posts

    Agora que temos nossos dados chegando ao nosso model e com a lgica da nossa aplicao definida emnosso controller, vamos criar uma view para a ao index() que criamos acima.

    As views do Cake so meros fragmentos voltados apresentao de dados que vo dentro do layout daaplicao. Para a maioria das aplicaes, as views sero marcaes HTML intercalados com cdigo PHP,mas as views tambm podem ser renderizadas como XML, CVS ou mesmo como dados binrios.

    Os layouts so pginas que encapsulam as views e que podem ser intercambiveis, mas por agora, vamosapenas usar o layout padro.

    Lembra da ltima seo, em que associamos a varivel posts para a view usando o mtodo set()? Comaquilo, os dados foram repassados para a view num formato parecido com este:

    // print_r($posts) output:

    Array(

    [0] => Array(

    [Post] => Array(

    [id] => 1[title] => The title[body] => This is the post body.[created] => 2008-02-13 18:34:55[modified] =>

    ))

    [1] => Array(

    [Post] => Array(

    [id] => 2[title] => A title once again[body] => And the post body follows.[created] => 2008-02-13 18:34:56[modified] =>

    ))

    [2] => Array(

    [Post] => Array(

    [id] => 3[title] => Title strikes back[body] => This is really exciting! Not.[created] => 2008-02-13 18:34:57[modified] =>

    )

    Blog - Continuao 7

  • CakePHP Cookbook Documentation, Verso 2.x

    ))

    Os arquivos de view do Cake so armazenados na pasta /app/View dentro de uma pasta com o mesmonome do controller a que correspondem (em nosso caso, vamos criar uma pasta chamada Posts). Paraapresentar os dados do post num formato adequado de tabela, o cdigo de nossa view deve ser algo como:

    Posts do Blog

    IdTtuloData de Criao

    Isto to simples quanto parece!

    Voc deve ter notado o uso de um objeto chamado $this->Html. Esta uma instncia da classeHtmlHelper do CakePHP. O CakePHP vem com um conjunto de helpers que tornam uma moleza fazercoisas como criar links, gerar formulrios, Javascript e elementos dinmicos com Ajax. Voc pode aprendermais sobre como us-los na seo /views/helpers, mas o importante a ser notado aqui que o mtodolink() ir gerar um link em HTML com o ttulo (o primeiro parmetro) e URL (o segundo parmetro)dados.

    Ao especificar URLs no Cake, recomendado que voc use o formato de array. Este assunto expli-cado com mais detalhes na seo sobre Rotas. Usar o formato de array para URLs, permite que voctire vantagens da capacidade do CakePHP de reverter este formato de URL em URLs relativas e viceversa. voc tambm pode simplesmente informar um caminho relativo base da aplicao na forma /con-troller/action/parametro_1/parametro_2.

    Neste ponto, voc deve ser capaz de apontar seu navegador para http://www.exemplo.com/posts/index. Vocdeve ver sua view, corretamente formatada com o ttulo e a tabela listando os posts.

    Se lhe ocorreu clicar num dos links que criamos nesta view (no ttulo do post e que apontam para uma URL/posts/view/algum_id), voc provavelmente recebeu uma mensagem do CakePHP dizendo que a action ainda

    8 Captulo 1. Primeiros Passos

  • CakePHP Cookbook Documentation, Verso 2.x

    no foi definida. Se voc no tiver visto um aviso assim, ento ou alguma coisa deu errado ou ento voc jtinha definido uma action anteriormente, e neste caso, voc muito afoito. Se no, vamos cri-la em nossoPostsController agora:

    class PostsController extends AppController {public $helpers = array('Html', 'Form');public $name = 'Posts';

    public function index() {$this->set('posts', $this->Post->find('all'));

    }

    public function view($id = null) {$this->Post->id = $id;$this->set('post', $this->Post->read());

    }}

    A chamada do mtodo set() deve lhe parece familiar. Perceba que estamos usando o mtodo read() aoinvs do find(all) porque ns realmente s queremos informaes de um nico post.

    Note que a action de nossa view recebe um parmetro: O ID do post que queremos ver. Este parmetro repassado action por meio da URL requisitada. Se um usurio acessar uma URL /posts/view/3, ento ovalor 3 ser atribudo ao parmetro $id.

    Agora vamos criar a view para nossa nova action view e coloc-la em /app/View/Posts/view.ctp:

    Created:

    Confira se est funcionando tentando acessar os links em /posts/index ou requisitando diretamente umpost acessando /posts/view/1.

    Adicionando Posts

    Ler a partir da base de dados e exibir os posts foi um grande comeo, mas precisamos permitir tambm queos usurios adicionem novos posts.

    Primeiramente, comece criando uma action add() no PostsController:

    class PostsController extends AppController {public $helpers = array('Html', 'Form');public $name = 'Posts';public $components = array('Session');

    public function index() {$this->set('posts', $this->Post->find('all'));

    }

    Blog - Continuao 9

  • CakePHP Cookbook Documentation, Verso 2.x

    public function view($id) {$this->Post->id = $id;$this->set('post', $this->Post->read());

    }

    public function add() {if ($this->request->is('post')) {

    if ($this->Post->save($this->request->data)) {$this->Session->setFlash('Your post has been saved.');$this->redirect(array('action' => 'index'));

    }}

    }}

    Nota: Voc precisa incluir o componente SessionComponent e o helper SessionHelper em qualquer con-troller que voc manipula variveis de sesso. Neste caso, inclumos apenas o componente porque elecarrega o helper automaticamente. Se voc sempre utiliza sesses, inclua o componente no seu arquivoAppController.

    Aqui est o que a action add() faz: se o mtodo da requisio feita pelo cliente for do tipo post, ou seja, seele enviou dados pelo formulrio, tenta salvar os dados usando o model Post. Se, por alguma razo ele nosalvar, apenas renderize a view. Isto nos d uma oportunidade de mostrar erros de validao e outros avisosao usurio.

    Quando um usurio utiliza um formulrio para submeter (POSTar) dados para sua aplicao, esta informaofica disponvel em $this->request->data.Voc pode usar as funes pr() ou debug() para exibiros dados se voc quiser conferir como eles se parecem.

    Ns usamos o mtodo SessionComponent::setFlash() do componente SessionComponent paradefinir uma varivel de sesso com uma mensagem a ser exibida na pgina depois de ser redirecionada. Nolayout, ns temos SessionHelper::flash que exibe a mensagem e limpa a varivel de sesso corre-spondente. O mtodo Controller::redirect do controller redireciona para outra URL. O parmetroarray(action => index) convertido para a URL /posts, em outras palavras, a action indexdo controller posts. Voc pode conferir a funo Router::url() na API para ver os formatos que vocpode usar ao especificar uma URL para actions do CakePHP.

    Chamar o mtodo save() ir verificar por erros de validao e abortar o salvamento se algum erro ocorrer.Vamos falar mais sobre erros de validao e sobre como manipul-los nas sees seguintes.

    Validao de Dados

    O CakePHP percorreu uma longa estrada combatendo a monotonia da validao de dados de formulrios.Todo mundo detesta codificar formulrios interminveis e suas rotinas de validao. O CakePHP torna tudoisso mais fcil e mais rpido.

    Para usufruir das vantagens dos recursos de validao, voc vai precisar usar o FormHelper do Cake em suasviews. O FormHelper est disponvel por padro em todas as suas views na varivel $this->Form.

    10 Captulo 1. Primeiros Passos

  • CakePHP Cookbook Documentation, Verso 2.x

    Aqui est nossa view add:

    Add Post

  • CakePHP Cookbook Documentation, Verso 2.x

    chamado. Aqui, eu especifiquei que tanto os campos body e title no podem ser vazios. O mecanismode validao do CakePHP robusto, com diversas regras predefinidas (nmeros de carto de crdito, en-dereos de e-mail, etc.) alm de ser bastante flexvel, permitindo adicionar suas prprias regras de validao.Para mais informaes, confira o captulo sobre /models/data-validation.

    Agora que voc incluiu as devidas regras de validao, tente adicionar um post com um ttulo ou com o corpovazio para ver como funciona. Uma vez que usamos o mtodo FormHelper::input() do FormHelperpara criar nossos elementos de formulrio, nossas mensagens de erros de validao sero mostradas auto-maticamente.

    Editando Posts

    Edio de Posts: Aqui vamos ns. A partir de agora voc j um profissional do CakePHP, ento voc deveter identificado um padro. Criar a action e ento criar a view. Aqui est como o cdigo da action edit()do PostsController deve se parecer:

    function edit($id = null) {$this->Post->id = $id;if ($this->request->is('get')) {

    $this->request->data = $this->Post->read();} else {

    if ($this->Post->save($this->request->data)) {$this->Session->setFlash('Your post has been updated.');$this->redirect(array('action' => 'index'));

    }}

    }

    Esta action primeiro verifica se a requisio do tipo GET. Se for, ns buscamos o Post e passamos para aview. Se a requisio no for do tipo GET, provavelmente esta contm dados de um formulrio POST. Nsusaremos estes dados para atualizar o registro do nosso Post ou exibir novamente a view mostrando para ousurio os erros de validao.

    A view edit pode ser algo parecido com isto:

    Edit Post

  • CakePHP Cookbook Documentation, Verso 2.x

    Voc agora pode atualizar sua view index com os links para editar os posts especficos:

    Blog posts

    IdTitle

    ActionCreated

    Deletando Posts

    A seguir, vamos criar uma maneira para os usurios exclurem posts. Comece com uma action delete()no PostsController:

    function delete($id) {if (!$this->request->is('post')) {

    throw new MethodNotAllowedException();}if ($this->Post->delete($id)) {

    $this->Session->setFlash('The post with id: ' . $id . ' has been deleted.');$this->redirect(array('action' => 'index'));

    }}

    Esta lgica exclui o post dado por $id, e utiliza $this->Session->setFlash() para mostrar uma

    Blog - Continuao 13

  • CakePHP Cookbook Documentation, Verso 2.x

    mensagem de confirmao para o usurio depois de redirecion-lo para /posts.

    Se o usurio tentar deletar um post usando uma requisio do tipo GET, ns lanamos uma exceo. Ex-cees no apanhadas so capturadas pelo manipulador de excees do CakePHP e uma pgina de erroamigvel mostrada. O CakePHP vem com muitas Exceptions que voc pode usar para indicar vrios tiposde erros HTTP que sua aplicao pode precisar gerar.

    Como estamos executando apenas uma lgica de negcio e redirecionando, esta action no tem uma view.Voc pode querer atualizar sua view index com links que permitam ao usurios excluir posts, porm, comoum link executa uma requisio do tipo GET, nossa action ir lanar uma exceo. Precisamos ento criarum pequeno formulrio que enviar um mtodo POST adequado. Para estes casos o helper FormHelperfornece o mtodo postLink():

    Blog posts

    IdTitle

    ActionsCreated

    Nota: O cdigo desta view tambm utiliza o HtmlHelper para solicitar uma confirmao do usurio comum dilogo em Javascript antes de tentar excluir o post.

    14 Captulo 1. Primeiros Passos

  • CakePHP Cookbook Documentation, Verso 2.x

    Rotas

    Para alguns, o roteamento padro do CakePHP funcionar muito bem. Os desenvolvedores que estiveremmais afeitos a criar produtos ainda mais amigveis aos usurios e aos mecanismos de busca iro gostar damaneira que as URLs do CakePHP so mapeadas para actions especficas. Ento vamos fazer uma pequenaalterao de rotas neste tutorial.

    Para mais informaes sobre tcnicas avanadas de roteamento, veja routes-configuration.

    Por padro, o CakePHP responde a requisies para a raiz de seu site (i.e. http://www.exemplo.com) usandoseu PagesController e renderizando uma view chamada de home. Ao invs disso, vamos substituir istopor nosso PostsController criando uma regra de roteamento.

    As rotas do Cake so encontrada no arquivo /app/Config/routes.php. Voc vai querer comentar ouremover a linha que define a rota raiz padro. Ela se parece com:

    Router::connect('/', array('controller' => 'pages', 'action' => 'display', 'home'));

    Esta linha conecta a URL / com a home page padro do CakePHP. Queremos conect-la com nosso prpriocontroller, ento adicionamos uma linha parecida com isto:

    Router::connect('/', array('controller' => 'posts', 'action' => 'index'));

    Isto deve conectar as requisies de / action index() que criaremos em nosso PostsController.

    Nota: O CakePHP tambm faz uso do roteamento reverso - se, com a rota definida acima, voc passararray(controller => posts, action => index) a um mtodo que espere umarray, a URL resultante ser /. sempre uma boa ideia usar arrays para URLs, j que a partir disto quesuas rotas definem para onde suas URLs apontam, alm de garantir que os links sempre apontem para omesmo lugar.

    Concluso

    Criar aplicaes desta maneira ir lhe trazer paz, honra, amor e dinheiro alm de satisfazer s suas maisousadas fantasias. Simples, no? Tenha em mente que este tutorial foi muito bsico. O CakePHP possuimuito mais recursos a oferecer e flexvel de tantas maneiras que no conseguimos mostrar aqui por questesde simplicidade. Utilize o resto deste manual como guia para construir mais aplicaes ricas em recursos.

    Agora que voc criou uma aplicao bsica com o Cake, voc est pronto para a coisa real. Comece seuprprio projeto, leia o restante do Manual e da API2.

    E se voc precisar de ajuda, nos vemos no canal #cakephp (e no #cakephp-pt). Seja bem-vindo ao CakePHP!

    Leitura Recomendada

    Estas so as tarefas comuns que pessoas aprendendo o CakePHP geralmente querem estudar:

    1. Layouts: Customizando o layout do seu website2http://api20.cakephp.org

    Blog - Continuao 15

  • CakePHP Cookbook Documentation, Verso 2.x

    2. Elements Incluindo e reutilizando trechos de cdigo

    3. Scaffolding (arcabouos): Prototipando antes de programar

    4. /console-and-shells/code-generation-with-bake Gerando cdigo CRUD bsico

    5. Autenticao simples e Autorizao da Aplicao: Tutorial de autenticao e autorizao de usurios

    Leitura Adicional

    Uma Requisio Tpica do CakePHP

    Ns j abordamos os ingredientes bsicos do CakePHP, ento agora vamos dar uma olhada em como osobjetos trabalham juntos para completar uma requisio bsica. Continuando com o exemplo da requisiooriginal, vamos imaginar que nosso amigo Ricardo apenas clicou no link Compre um bolo personalizadoagora! em uma landing page3 de uma aplicao CakePHP.

    Figura 1.1: Um diagrama de fluxo mostrando uma tpica requisio CakePHP

    Figure: 2. Requisio tpica do CakePHP.

    Em preto = elemento requerido, em cinza = elemento opcional, em Azul = callbacks3http://pt.wikipedia.org/wiki/Landing_page

    16 Captulo 1. Primeiros Passos

  • CakePHP Cookbook Documentation, Verso 2.x

    1. Ricardo clica no link apontando para http://www.example.com/cakes/buy, e o navegador dele faz umarequisio para seu servidor web.

    2. O roteador analisa a URL para extrair os parmetros desta requisio: o controller, a ao, e qualqueroutro argumento que afeta a lgica do negcio durante esta requisio.

    3. Usando rotas, a URL da requisio mapeada para uma ao de um controller (um mtodo emuma classe controller especfica). Neste caso, ser o mtodo buy() do controller CakesController.O callback beforeFilter() do controller chamado antes de qualquer ao lgica do controller. Aslinhas tracejadas em azul mostram isso no diagrama.

    4. O controller pode usar models para obter acesso aos dados do aplicativo. Neste exemplo o con-troller usa o model para pegar no banco de dados as ltimas compras do Ricardo. Qualquer callbackdo model, behaviors ou DataSources que for aplicvel neste momento, ser chamado. Enquanto autilizao de Models no seja obrigatria, todas os controllers inicialmente requerem ao menos ummodel.

    5. Aps o model buscar os dados, estes so retornados para o controller. Callbacks de um Model podemser aplicados.

    6. O controller poder utilizar componentes para refinar os dados ou executar outras operaes (manip-ular sesso, autenticar ou enviar e-mails so exemplos)

    7. Uma vez que o controller usou os models e componentes para preparar os dados de forma suficiente,os dados so passados para a view usando o mtodo set() do controller. Callbacks do controllerpodem ser chamados antes que os dados sejam passados. A view executada, podendo incluir o usode elementos e/ou helpers. Por padro, a view renderizada dentro de um layout.

    8. Adicionalmente, callbacks do controller (como o afterFilter) podem ser aplicados. A view renderizadae completa enviada para o navegador do Ricardo.

    Convenes no CakePHP

    Ns somos grandes fns de convenes sobre configurao4. Enquanto pode levar um tempo para aprenderas convenes do CakePHP, voc ganhar muito tempo a longo prazo: seguindo as convenes voc ganharfuncionalidades e ficar livre dos pesadelos de manter arquivos de configurao. As convenes tambmcontribuem para o desenvolvimento de sistemas mais uniformes, permitindo que outros desenvolvedoresentrem no projeto e comecem a trabalhar muito mais rapidamente.

    As convenes do CakePHP foram destiladas ao longo de anos de experincia no desenvolvimento de apli-caes web e boas prticas. Da mesma forma que sugerimos que voc use essas convenes enquantodesenvolve com o CakePHP, devemos mencionar que muitos destes princpios so facilmente sobrescritos algo que especialmente til quando se trabalha com sistemas legados.

    Convenes nos Controllers

    As classes Controllers devem ser escritas no plural, usando o formato CamelCase5 e terminarem com apalavra Controller. PeopleController e LatestArticlesController so dois exemplos

    4http://pt.wikipedia.org/wiki/Conven%C3%A7%C3%A3o_sobre_configura%C3%A7%C3%A3o5http://pt.wikipedia.org/wiki/CamelCase

    Blog - Continuao 17

  • CakePHP Cookbook Documentation, Verso 2.x

    de nomes de controllers que seguem a conveno.

    O primeiro mtodo que voc pode escrever para um controller o mtodo index(). Quando uma req-uisio especifica o controller mas no a ao, o comportamento padro do CakePHP executar o mtodoindex(). Por exemplo, uma requisio para http://www.example.com/apples/ mapeada para o mtodoindex() do controller ApplesController, enquanto a URL http://www.example.com/apples/view/ mapeada para a chamada do mtodo view() do mesmo controller.

    Voc tambm pode alterar a visibilidade dos mtodos de controllers no CakePHP prefixando os nome dosmtodos com underscores. Se um mtodo de um controller for prefixado, o mtodo no poder ser acessadodiretamente da web mas estar disponvel para uso interno. Por exemplo:

    class NewsController extends AppController {

    function latest() {$this->_findNewArticles();

    }

    function _findNewArticles() {// lgica para encontrar os os ltimos artigos

    }}

    Enquanto a pgina http://www.example.com/news/latest/ pode ser acessada normalmente pelos usurios,alguem tentando visitar a pgina http://www.example.com/news/_findNewArticles/ receber um erro porqueo nome do mtodo prefixado com um underscore. Voc tambm pode utilizar as palavras-chave de visi-bilidade do PHP para indicar se um mtodo pode ou no ser acessado por uma URL. Mtodos privados nopodem ser acessados.

    Consideraes sobre URLs para nomes de Controllers Como voc viu, controllers com nomes forma-dos por uma palavra so mapeados por URLs em caixa baixa. Por exemplo, ApplesController (queseria definido em um arquivo com o nome de ApplesController.php) pode ser acessado com a seguinteURL: http://example.com/apples.

    Controllers formados por mais de uma palavra podem ter qualquer forma flexionada do nome:

    /redApples

    /RedApples

    /Red_apples

    /red_apples

    Todas sero resolvidas para o mtodo index do controller RedApples. Porm, a conveno diz que suasURLs devem ser em caixa baixa e usar underscores, portanto /red_apples/go_pick a forma mais apropriadapara acessar a ao RedApplesController::go_pick.

    Para mais informaes sobre as URLs do CakePHP e o tratamento de parmetros, veja routes-configuration.

    18 Captulo 1. Primeiros Passos

  • CakePHP Cookbook Documentation, Verso 2.x

    Convenes de Arquivos e Nomes de Classes

    Geralmente, nomes de arquivos correspondem com o nome de suas classes, que so em CamelCase6. Entose voc possui uma classe MyNiftyClass, para o Cake, o nome do arquivo deve ser MyNiftyClass.php.Abaixo esto alguns exemplos de como nomear arquivos para diferentes tipos de classes que voc usar emaplicaes CakePHP:

    O controller KissesAndHugsController seria encontrado em um arquivo chamado KissesAnd-HugsController.php

    O componente MyHandyComponent seria encontrado em um arquivo chamado MyHandyCompo-nent.php

    O model OptionValue seria encontrado em um arquivo chamado OptionValue.php

    O behavior EspeciallyFunkableBehavior seria encontrado em um arquivo chamado Especially-FunkableBehavior.php

    A View SuperSimpleView seria encontrado em um arquivo chamado SuperSimpleView.php

    O helper BestEverHelper seria encontrado em um arquivo chamado BestEverHelper.php

    Cada arquivo dever estar em uma pasta apropriada no diretrio app da sua aplicao.

    Convenes de Models e Banco de Dados

    O nome dos Models devem ser escritos no singular e no formato CamelCase7. Car, BigCar e ReallyBigCarso todos exemplos de nomes de models que seguem a conveno.

    Nomes de tabelas correspondentes models do CakePHP so escritos no plural e usando underscores.As tabelas correspondentes para os models mencionados acima so respectivamente cars, big_cars ereally_big_cars.

    Voc pode usar a biblioteca utilitria Inflector para verificar a forma singular/plural das palavras. Vejaa classe /core-utility-libraries/inflector para mais informaes.

    Nomes de colunas formadas por mais de uma palavra devem ser separadas usando underscore como emfirst_name.

    Chaves estrangeiras em associaes do tipo hasMany, belongsTo ou hasOne so reconhecidas por padrocomo o nome (no singular) das tabelas relacionadas seguidas por _id. Ento, se Baker hasMany (possuimuitos) Cake, a tabela cakes ir fazer referncia a tabela bakers via chave estrangeira baker_id. Para tabelasformadas por mais de uma palavra como category_types, a chave estrangeira seria category_type_id.

    Tabelas de junes usadas em relacionamentos do tipo hasAndBelongsToMany (HABTM) entre modelsdevem ser nomeadas usando o nome das tabelas dos models referenciados unidas em ordem alfabtica(apples_zebras ao invs de zebras_apples).

    Todas as tabela com que models do CakePHP interagem (com exceo das tabelas de juno) requerem umachave primria para identificar unicamente cada registro. Se voc quiser modelar uma tabela que no possua

    6http://pt.wikipedia.org/wiki/CamelCase7http://pt.wikipedia.org/wiki/CamelCase

    Blog - Continuao 19

  • CakePHP Cookbook Documentation, Verso 2.x

    uma chave primria nica, a conveno do CakePHP diz que voc deve adicionar uma se quiser utiliz-lacom um model.

    O CakePHP no suporta chaves primrias compostas. Se voc quiser manipular os dados das tabelas dejunes diretamente, use chamadas de query diretas ou adicione uma chave primaria para us-las como ummodel normal. Ex.:

    CREATE TABLE posts_tags (id INT(10) NOT NULL AUTO_INCREMENT,post_id INT(10) NOT NULL,tag_id INT(10) NOT NULL,PRIMARY KEY(id)

    );

    Ao invs de usar chaves auto incrementadas, voc tambm pode usar o tipo char(36). Desta forma o Cakeir usar um identificador nico (uuid) de 36 caracteres criado por String::uuid sempre que voc salvar umnovo registro usando o mtodo Model::save.

    Convenes de Views

    Arquivos de templates de views so nomeados de acordo com o nome do mtodo do controller que exibemno formato underscore. O mtodo getReady() da classe PeopleController ir utilizar uma view localizadaem /app/View/People/get_ready.ctp.

    O molde padro /app/View/Controller/underscored_function_name.ctp.

    Nomeando as partes de sua aplicao usando as convenes do CakePHP, voc ganha funcionalidades semos incmodos e problemticos arquivos de configurao. Segue agora um exemplo final que mostra asconvenes todas juntas.

    Tabela do banco de dados: cars

    Classe Model: Car, encontrada em /app/Model/Car.php

    Classe Controller: CarsController, encontrada em /app/Controller/CarsController.php

    Arquivo de View encontrada em /app/View/Cars/index.ctp

    Usando estas convenes o CakePHP saber que uma requisio feita pela URL http://example.com/cars/refere-se a uma chamada para o mtodo index() da classe CarsController, onde o model Car automati-camente disponibilizado (e automaticamente amarrado com a tabela cars no banco de dados) e renderizao arquivo /app/View/Cars/index.ctp. Nenhum destes relacionamentos precisou ser configurado, a no ser acriao de classes e arquivos que voc precisaria criar de qualquer maneira.

    Agora que voc j foi introduzido aos fundamentos do CakePHP, voc pode tentar o Blog para ver comotodas as coisas se encaixam juntas.

    Estrutura de Diretrios no CakePHP

    Aps ter baixado e extrado o CakePHP, voc dever encontrar os seguintes arquivos e pastas:

    app

    20 Captulo 1. Primeiros Passos

  • CakePHP Cookbook Documentation, Verso 2.x

    lib

    vendors

    plugins

    .htaccess

    index.php

    README

    Voc encontrar trs pastas principais:

    No diretrio app onde voc far sua mgica, ou seja: o lugar que voc colocar os arquivos de suaaplicao.

    No diretrio lib onde fazemos nossa mgica. comprometa-se em no editar nenhum arquivo destediretrio. No podemos ajud-lo se voc modificar o ncleo do framework.

    E finalmente, no diretrio vendors onde voc pode colocar as bibliotecas de terceiros que precisarusar em suas aplicaes com o CakePHP.

    O Diretrio App

    No diretrio app do Cake onde voc faz a maior parte do desenvolvimento de sua aplicao. Vamos daruma olhada mais de perto nas pastas que esto dentro de app.

    Config Armazena os (poucos) arquivos de configurao que o CakePHP utiliza. Parmetros de conexocom o banco de dados, inicializao do sistema (Bootstrapping8), arquivos de configurao do ncleodo framework, e outros, devem ficar aqui.

    Controller Contm os controllers e componentes da sua aplicao.

    Lib Contm suas bibliotecas pessoais e diferentes das obtidas de terceiros. Isto permite separar as bibliote-cas internas de sua empresa das que foram criadas por outras pessoas ou fornecedores.

    Locale Armazena arquivos contendo strings de internacionalizao.

    Model Contm os Models, behaviors e datasources de sua aplicao.

    Plugin Contm pacotes de plugins.

    tmp Este diretrio onde o CakePHP armazena dados temporrios. Os dados armazenados dependem decomo voc configurou o CakePHP mas geralmente usada para armazenar o cache das descries dosmodels, logs e por vezes os dados de sesso.

    Tenha certeza de que esta pasta exista e que seja gravvel, seno o desempenho de sua aplicao serprejudicado severamente.

    Vendor Qualquer classe ou biblioteca de terceiros devem ficar aqui. Fazendo isto, torna fcil acess-las us-ando o mtodo App::import(vendor, name). Olhos aguados notaram que isto parece redundante,j que temos outra pasta chamada vendors, um nvel acima do diretrio app. Ns entraremos nos

    8http://pt.wikipedia.org/wiki/Bootstrapping

    Blog - Continuao 21

  • CakePHP Cookbook Documentation, Verso 2.x

    detalhes, explicando a diferena dos dois diretrios quando estivermos discutindo sobre como gerirmltiplas aplicaes e configuraes de sistemas mais complexos.

    View Arquivos de apresentao so colocados aqui: elementos, pginas de erros, helpers, layouts e arquivosde views.

    webroot Quando voc configurar sua aplicao para rodar em produo, este diretrio deve ser a raiz do seudiretrio web pblico. Pastas aqui dentro tambm servem para colocar seus arquivos CSS, imagens eJavascripts.

    Estrutura do CakePHP

    O CakePHP possui as classes essenciais Controller, Model e View, mas tambm apresenta algumas outrasclasses e objetos adicionais que fazem o desenvolvimento com o MVC um pouco mais rpido e divertido.Componentes, Behaviors e Helpers so classes que fornecem extensibilidade e reusabilidade para adicionarfuncionalidades base das classes do MVC em sua aplicao. Por enquanto, vamos fazer uma explicaosuperficial destas ferramentas e detalh-las mais tarde.

    Extenses de Aplicao

    Cada controller, helper e model possui uma classe me que voc pode usar paraincluir mudanas vlidas por toda a aplicao. As classes AppController (lo-calizada em /app/Controller/AppController.php), AppHelper (local-izada em /app/View/Helper/AppHelper.php) e AppModel (localizada em/app/Model/AppModel.php) so excelentes lugares para colocar mtodos que voc quer com-partilhar entre todos os controllers, helpers ou models.

    Embora rotas no sejam classes ou arquivos, elas desempenham um papel nas requisies feitas ao CakePHP.Definies de rotas dizem ao CakePHP como mapear URLs para as aes de controllers. O comportamentopadro assume que a URL /controller/action/var1/var2 deve ser mapeada para o mtodo Con-troller::action($var1, $var2), mas voc pode usar as rotas para customizar as URLs e como elas so inter-pretadas por sua aplicao.

    Alguns recursos em uma aplicao merecem ser reunidas em um pacote. Um plugin um pacote de models,controllers e views que cumprem um objetivo especfico e que podem ser utilizados em vrias aplicaes.Um sistema de gerenciamento de usurios ou um blog simplificado podem ser bons candidatos para pluginsdo CakePHP.

    Extenses de Controllers (Componentes)

    Um Component uma classe que d suporte s lgicas nos controllers. Se voc possui uma lgica quequeira compartilhar entre controllers, um componente geralmente uma boa escolha para coloc-la. Comoum exemplo, a classe EmailComponent do Cake permite criar e enviar emails num piscar de olhos.

    Ao invs de escrever um mtodo em um controller nico que executa esta lgica, voc pode empacotar algica para que seja possvel compartilh-la.

    22 Captulo 1. Primeiros Passos

  • CakePHP Cookbook Documentation, Verso 2.x

    Os controllers tambm esto equipados com callbacks. Estes callbacks esto disponveis para que vocpossa utiliz-los, bem nos casos em que voc precisa inserir alguma lgica entre as operaes do ncleo doCakePHP. Os callbacks disponibilizados so:

    beforeFilter(), executado antes de qualquer ao de um controller.

    beforeRender(), executado aps a lgica de um controller, mas antes da view ser renderizada.

    afterFilter(), executada aps a lgica de um controller, incluindo a renderizao da view. Podeno haver diferenas entre o afterRender() e o afterFilter() ao menos que voc tenhachamado o mtodo render() na ao de um controller e tenha includo alguma lgica depois destachamada.

    Extenses de Models (Behaviors)

    Similarmente, Behaviors trabalham para adicionar funcionalidades comuns entre models. Por exemplo, sevoc armazena os dados dos usurios em uma estrutura de dados do tipo rvore, voc pode especificar queseu model Usuario se comporta tal como uma rvore e assim, ganha funcionalidades para remover, adicionare substituir ns na estrutura que existe por baixo do model.

    Models tambm recebem o suporte de outra classe chamada DataSource. DataSources so uma abstraoque permite os models manipularem consistentemente diferentes tipos de dados. Embora a fonte principal dedados em uma aplicao usando o CakePHP seja banco de dados, voc pode escrever DataSources adicionaisque permitem seus models representarem feeds RSS, arquivos CSV, entradas LDAP ou eventos do iCal. OsDataSources permitem voc associar registros de diferentes fontes: Diferente de estar limitado pelas junesdo SQL, os DataSources permitem voc dizer para seu Model LDAP que est associado muitos eventosdo iCal.

    Assim como os controllers, os models tambm possuem callbacks:

    beforeFind(), executado antes de uma busca.

    afterFind(), executado aps uma busca.

    beforeValidate(), executado antes de fazer uma validao de dados.

    beforeSave(), executado antes de salvar ou atualizar registros de um model.

    afterSave(), executado aps salvar ou atualizar registros de um model.

    beforeDelete(), executado antes de remover registros de um model.

    afterDelete(), executado aps remover registros de um model.

    Com a mnima descrio dada, deve ser possvel saber o que estes callbacks fazem. Voc pode encontrarmais detalhes no captulo dos models.

    Extenses de Views (Helpers)

    Um Helper uma classe que ajuda na lgica das views. Muito parecido como os componentes que sousados pelos controllers, os helpers ajudam na lgica de apresentao que podem ser acessadas e compar-tilhadas entre as views. Um dos Helpers que acompanha o Cake o AjaxHelper que torna requisies emajax nas views muito mais fcil.

    Blog - Continuao 23

  • CakePHP Cookbook Documentation, Verso 2.x

    Muitas aplicaes possuem pedaos de cdigo de apresentao que so usados repetidamente. O CakePHPfacilita a reutilizao destes trechos com layouts e elementos. Por padro, cada view renderizada por umcontroller colocada dentro de um layout. Elementos so usados quando pequenos trechos de contedoprecisam ser reusados em muitas views.

    24 Captulo 1. Primeiros Passos

  • CAPTULO 2

    Instalao

    O CakePHP rpido e fcil de instalar. Os requisitos mnimos so um servidor web e uma cpia do Cake, sisso! Apesar deste manual focar principalmente na configurao do Apache (porque ele o mais comum),voc pode configurar o Cake para executar em diversos servidores web, tais como lighttpd ou Microsoft IIS.

    Requisitos

    Servidor HTTP. Por exemplo: Apache. prefervel ter o mod_rewrite habilitado mas no umaexigncia.

    PHP 5.2.8 ou superior.

    Tecnicamente no exigido um banco de dados mas imaginamos que a maioria das aplicaes ir utilizarum. O CakePHP suporta uma variedade deles:

    MySQL (4 ou superior)

    PostgreSQL

    Microsoft SQL Server

    SQLite

    Nota: Todos os drivers inclusos internamente requerem o PDO. Voc deve ter certeza que possui a extensocorreta do PDO instalada.

    Licena

    O CakePHP licenciado sob uma Licena MIT. Isto significa que voc tem liberdade para modificar, dis-tribuir e republicar o cdigo-fonte com a condio de que os avisos de copyright permaneam intactos. Voctambm tem liberdade para incorporar o CakePHP em qualquer aplicao comercial ou de cdigo fechado.

    25

  • CakePHP Cookbook Documentation, Verso 2.x

    Baixando o CakePHP

    H duas maneiras de se obter uma cpia atualizada do CakePHP. Voc pode fazer o download de um arquivocomprimido (zip/tar.gz/tar.bz2) no site principal ou obter o cdigo a partir do repositrio git.

    Para fazer o download da verso estvel mais recente do CakePHP, visite o site principal http://cakephp.org.L haver um link chamado Download Now! para baixar.

    Todas as verses liberadas do CakePHP esto hospedadas no Github1. O Github do CakePHP abriga oprprio Cake assim como muitos outros plugins para ele. As verses disponveis esto na pgina Githubtags2.

    Alternativamente voc pode obter uma cpia contendo todas as correes de bugs e atualizaes recentesclonando o repositrio do Github:

    git clone git://github.com/cakephp/cakephp.git

    Permisses

    O CakePHP usa o diretrio /app/tmp para diferentes operaes. Descries do modelo, cache das views,e informaes das sesses so alguns exemplos.

    Assim, tenha certeza que o diretrio /app/tmp na sua instalao do cake permite a escrita pelo usurio doservidor web.

    Um problema comum que ambos os diretrios e subdiretrios de app/tmp devem poder ser gravados peloservidor web e pelo usurio da linha de comando. Em um sistema UNIX, se o seu usurio do servidor web diferente do seu usurio da linha de comando, voc pode pode executar os seguintes comandos apenas umavez em seu projeto para assegurar que as permisses sero configuradas apropriadamente:

    HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d\ -f1`setfacl -R -m u:${HTTPDUSER}:rwx app/tmp

    setfacl -R -d -m u:${HTTPDUSER}:rwx app/tmp

    Configurao

    Configurar o CakePHP pode ser to simples como descompact-lo em seu servidor web, ou to complexoe flexvel se voc desejar. Esta seo ir cobrir trs principais tipos de instalao do CakePHP: desenvolvi-mento, produo e avanada.

    Desenvolvimento: fcil para comear, as URLs da aplicao incluem o nome do diretrio de insta-lao e menos seguro.

    Produo: Requer maior habilidade para configurar o diretrio raiz do servidor web, URLs limpas,muito seguro.

    1http://github.com/cakephp/cakephp2https://github.com/cakephp/cakephp/tags

    26 Captulo 2. Instalao

  • CakePHP Cookbook Documentation, Verso 2.x

    Avanada: Com algumas configuraes, permite que voc coloque os diretrios do CakePHP emdiferentes locais do sistema de arquivos, permitindo compartilhar o ncleo do CakePHP entre diversasaplicaes.

    Desenvolvimento

    A instalao de desenvolvimento o mtodo mais rpido de configurao do Cake. Este exemplo ir teajudar a instalar uma aplicao CakePHP e torn-la disponvel em http://www.example.com/cake_2_0/.Assumimos, para efeitos deste exemplo que a sua raiz do documento definido como /var/www/html.

    Descompacte o contedo do arquivo do Cake em /var/www/html. Voc agora tem uma pasta na raiz doseu servidor web com o nome da verso que voc baixou (por exemplo, cake2.0.0). Renomeie essa pastapara cake_2_0. Sua configurao de desenvolvimento ser semelhante a esta em seu sistema de arquivos:

    /var/www/html/cake_2_0/

    app/lib/plugins/vendors/.htaccessindex.phpREADME

    Se o seu servidor web est configurado corretamente, agora voc deve encontrar sua aplicao Cakeacessvel em http://www.example.com/cake_2_0/.

    Utilizando um pacote CakePHP para mltiplas Aplicaes

    Se voc est desenvolvendo uma srie de aplicaes, muitas vezes faz sentido que elas compartilhem omesmo pacote. Existem algumas maneiras em que voc pode alcanar este objetivo. Muitas vezes, o maisfcil usar o PHP include_path. Para comear, clone o CakePHP em um diretrio. Para esse exemplo,ns vamos utilizar /home/mark/projects:

    git clone git://github.com/cakephp/cakephp.git /home/mark/projects/cakephp

    Isso ira clonar o CakePHP no seu diretrio /home/mark/projects. Se voc no quiser utilizar git,voc pode baixar um compilado e os prximos passos sero os mesmos. Em seguida voc ter que localizare modificar seu php.ini. Em sistemas *nix est localizado na maioria das vezes em /etc/php.ini,mas utilizando php -i e procurando por Loaded Configuration File, voc pode achar a localizao atual.Uma vez que voc achou o arquivo ini correto, modifique a configurao include_path para incluir/home/mark/projects/cakephp/lib. Um exemplo semelhamte deveria ser como:

    include_path = .:/home/mark/projects/cakephp/lib:/usr/local/php/lib/php

    Depois de reiniciar seu servidor web, voc deve ver as mudanas refletidas em phpinfo().

    Nota: Se voc estiver no windows, separe os caminhos de incluso com ; ao invs de :

    Desenvolvimento 27

  • CakePHP Cookbook Documentation, Verso 2.x

    Finalizando a definio do seu include_path suas aplicaes devem estar prontas para encontrar oCakePHP automaticamente.

    Produo

    A instalao de produo uma forma mais flexvel de configurao do Cake Usando este mtodo permiteum total domnio para agir como uma nica aplicao CakePHP. Este exemplo ir ajud-lo a instalar o Cakeem qualquer lugar do seu sistema de arquivos e torn-lo disponvel em http://www.example.com. Note queesta instalao pode requerer os privilgios para alterao do DocumentRoot do servidor Apache.

    Descompacte o contedo do arquivo do Cake em um diretrio de sua escolha. Para fins deste exemplo, as-sumimos que voc escolheu instalar o Cake em /cake_install. Sua configurao de produo ser semelhantea esta em seu sistema de arquivos:

    /cake_install/app/

    webroot/ (esse diretrio est definido como diretiva ``DocumentRoot``)lib/plugins/vendors/.htaccessindex.phpREADME

    Desenvolvedores usando o Apache devem definir o DocumentRoot do domnio para:

    DocumentRoot /cake_install/app/webroot

    Se o seu servidor web estiver configurado corretamente, voc deve encontrar agora sua aplicao Cakeacessvel em http://www.example.com.

    Instalao Avanada e Configurao Especfica por Servidor

    Instalao Avanada

    Pode haver algumas situaes onde voc deseja colocar os diretrios do CakePHP em diferentes locais nosistema de arquivos. Isto pode ser devido a uma restrio do servidor compartilhado, ou talvez voc queiraapenas que algumas aplicaes compartilhem as bibliotecas do Cake. Esta seo descreve como espalharseus diretrios do CakePHP em um sistema de arquivos.

    Em primeiro lugar, note que h trs partes principais de uma aplicao CakePHP.

    1. As bibliotecas do ncleo do CakePHP, em /cake.

    2. O cdigo da sua aplicao, em /app.

    3. Os arquivos pblicos da sua aplicao, normalmente em /app/webroot.

    28 Captulo 2. Instalao

  • CakePHP Cookbook Documentation, Verso 2.x

    Cada um desses diretrios podem ser localizados em qualquer em seu sistema de arquivos, com exceo dowebroot, que precisa ser acessvel pelo seu servidor web. Voc pode at mesmo mover a pasta webroot parafora da pasta app, desde que voc diga ao Cake onde voc colocou.

    Para configurar sua instalao do Cake, voc precisa fazer algumas modificaes nos seguintes arquivos.

    /app/webroot/index.php

    /app/webroot/test.php (se voc utilizar o recurso de Testes.)

    H trs constantes que voc precisa editar: ROOT, APP_DIR, e CAKE_CORE_INCLUDE_PATH.

    ROOT deve ser configurada para o diretrio que contm sua pasta app.

    APP_DIR deve ser definida como o nome de sua pasta app.

    CAKE_CORE_INCLUDE_PATH deve ser definida como o caminho da sua pasta de bibliotecas doCakePHP.

    Vamos fazer um exemplo para que voc possa ver como funciona uma instalao avanada na prtica.Imagine que eu quero que a aplicao funcione como segue:

    O ncleo do CakePHP ser colocado em /usr/lib/cake.

    O diretrio webroot da minha aplicao ser /var/www/mysite/.

    O diretrio app da minha aplicao ser /home/me/myapp.

    Dado este tipo de configurao, eu preciso editar meu arquivo webroot/index.php (que vai acabar em/var/www/mysite/index.php, neste exemplo) para algo como o seguinte:

    // /app/webroot/index.php (parcial, comentrios removidos)

    if (!defined('ROOT')) {define('ROOT', DS . 'home' . DS . 'me');

    }

    if (!defined('APP_DIR')) {define ('APP_DIR', 'myapp');

    }

    if (!defined('CAKE_CORE_INCLUDE_PATH')) {define('CAKE_CORE_INCLUDE_PATH', DS . 'usr' . DS . 'lib');

    }

    Recomenda-se a utilizao da constante DS ao invs das barras para delimitar os caminhos de arquivos. Issoprevine qualquer erros sobre falta de arquivos que voc pode obter, por ter usado o delimitador errado, e issotorna o seu cdigo mais portvel.

    Apache e mod_rewrite (e .htaccess)

    O CakePHP desenvolvido para trabalhar com o mod_rewrite, mas percebemos que alguns usurios apan-haram para fazer isto funcionar nos seus sistemas, ento ns lhe daremos algumas dicas que voc pode tentarfazer para rodar corretamente.

    Instalao Avanada e Configurao Especfica por Servidor 29

  • CakePHP Cookbook Documentation, Verso 2.x

    Aqui esto algumas coisas que voc pode tentar fazer para rodar corretamente. Primeiro veja o seu httpd.conf(tenha certeza de estar editando o httpd.conf do sistema e no o de um usurio ou de um site especfico).

    1. Tenha certeza que a sobreposio do .htaccess est sendo permitida, ou seja, que o AllowOverrideest configurado como All para o DocumentRoot. Voc deve ver algo similar a isso:

    # Cada diretrio com o Apache tenha acesso pode ser configurado com# relao aos quais servios e recursos so permitidos e/ou# desabilitados neste diretrio (e seus subdiretrios).## Primeiro, configuramos o o "padro" para ter um conjunto muito# restrito de recursos.#

    Options FollowSymLinksAllowOverride All

    # Order deny,allow# Deny from all

    2. Tenha certeza de estar carregando o mod_rewrite corretamente. Voc deve ver algo como:

    LoadModule rewrite_module libexec/apache2/mod_rewrite.so

    Em muitos sistemas isso vem comentado por padro (comeando com um #), ento voc apenasprecisa remover esses smbolos.

    Depois de fazer as alteraes, reinicie o Apache para ter certeza que as configuraes esto aivas.

    Verifique se os seus arquivos .htaccess esto nos diretrios corretos.

    Isso pode acontecer durante a cpia, pois alguns sistemas operacionais tratam arquivos que comeamcom . como oculto e, portanto, voc no poder v-los copiar.

    3. Tenha certeza que sua cpia do CakePHP veio da seo de downloads do nosso site ou do nossorepositrio GIT, e foi descompactada corretamente verificando os seus arquivos .htaccess.

    No diretrio raiz do Cake (precisa ser copiado para o seu DocumentRoot, este redireciona tudo para asua aplicao):

    RewriteEngine onRewriteRule ^$ app/webroot/ [L]

    RewriteRule (.*) app/webroot/$1 [L]

    O diretrio app do seu Cake (ser copiado para o diretrio principal da sua aplicao pelo bake):

    RewriteEngine onRewriteRule ^$ webroot/ [L]

    RewriteRule (.*) webroot/$1 [L]

    Diretrio webroot do Cake (ser copiado para a raiz da sua aplicao web pelo bake):

    30 Captulo 2. Instalao

  • CakePHP Cookbook Documentation, Verso 2.x

    RewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php [QSA,L]

    Para muitos servios de hospedagem (GoDaddy, 1and1), seu servidor web sendo servido a partir deum diretrio de usurio que j utiliza o mod_rewrite. Se voc est instalando o CakePHP dentrodo diretrio de um usurio (http://example.com/~username/cakephp/), ou qualquer outra estrutura deURL que j utiliza o mod_rewrite, voc ir precisar adicionar instrues RewriteBase para os arquivos.htaccess do CakePHP (/.htaccess, /app/.htaccess, /app/webroot/.htaccess).

    Isto pode ser adicionado mesma seo da diretiva RewriteEngine, por exemplo, o arquivo .htaccessdo seu webroot seria algo como:

    RewriteEngine OnRewriteBase /path/to/cake/appRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php [QSA,L]

    Os detalhes dessa mudana vai depender de sua configurao, e pode incluir algumas coisas adicionaisque no esto relacionadas ao Cake. Por favor, consulte a documentao online do Apache para maisinformaes.

    URLs amigveis e Lighttpd

    Embora o Lighttpd apresenta um mdulo de reescrita, ele no equivalente ao mod_rewrite do Apache.Para obter URLs amigveis ao usar Lighty voc tem duas opes. Uma usar o mod_rewrite a outra usar um script LUA com o mod_magnet.

    Usando o mod_rewrite O modo mais fcil para se obter URLs amigveis adicionando este script naconfigurao do seu lighty. Basta editar a URL, e tudo deve funcionar. Por favor, note que isto no funcionaem instalaes do Cake em subdiretrios.

    $HTTP["host"] =~ "^(www\.)?example.com$" {url.rewrite-once = (

    # if the request is for css|files etc, do not pass on to Cake"^/(css|files|img|js)/(.*)" => "/$1/$2","^([^\?]*)(\?(.+))?$" => "/index.php?url=$1&$3",

    )evhost.path-pattern = "/home/%2-%1/www/www/%4/app/webroot/"

    }

    Usando o mod_magnet Para utiizar URLs amigveis com o CakePHP e o Lighttpd, coloque este scriptLUA em /etc/lighttpd/cake.

    Instalao Avanada e Configurao Especfica por Servidor 31

  • CakePHP Cookbook Documentation, Verso 2.x

    -- little helper functionfunction file_exists(path)

    local attr = lighty.stat(path)if (attr) then

    return trueelse

    return falseend

    endfunction removePrefix(str, prefix)

    return str:sub(1,#prefix+1) == prefix.."/" and str:sub(#prefix+2)end

    -- prefix without the trailing slashlocal prefix = ''

    -- the magic ;)if (not file_exists(lighty.env["physical.path"])) then

    -- file still missing. pass it to the fastcgi backendrequest_uri = removePrefix(lighty.env["uri.path"], prefix)if request_uri then

    lighty.env["uri.path"] = prefix .. "/index.php"local uriquery = lighty.env["uri.query"] or ""lighty.env["uri.query"] = uriquery .. (uriquery ~= "" and "&" or "") .. "url=" .. request_urilighty.env["physical.rel-path"] = lighty.env["uri.path"]lighty.env["request.orig-uri"] = lighty.env["request.uri"]lighty.env["physical.path"] = lighty.env["physical.doc-root"] .. lighty.env["physical.rel-path"]

    endend-- fallthrough will put it back into the lighty request loop-- that means we get the 304 handling for free. ;)

    Nota: Se voc estiver rodando sua instalao do CakePHP a partir de um subdiretrio, voc precisa definiro prefix = subdiretorio no script acima

    Ento, informe ao Lighttpd sobre o seu vhost:

    $HTTP["host"] =~ "example.com" {server.error-handler-404 = "/index.php"

    magnet.attract-physical-path-to = ( "/etc/lighttpd/cake.lua" )

    server.document-root = "/var/www/cake-1.2/app/webroot/"

    # Think about getting vim tmp files out of the way toourl.access-deny = (

    "~", ".inc", ".sh", "sql", ".sql", ".tpl.php",".xtmpl", "Entries", "Repository", "Root",".ctp", "empty"

    )}

    32 Captulo 2. Instalao

  • CakePHP Cookbook Documentation, Verso 2.x

    URLs amigveis no nginx

    nginx um servidor popular que, como Lighttpd, usa menos recursos do sistema. O inconveniente que nofaz uso de arquivos .htaccess como o Apache e o Lighttpd, por isso necessrio criar as URLs reescritas naconfigurao site-available. Dependendo de sua instalao, voc ter que modificar isso, mas no mnimo,voc ir precisar do PHP sendo executado como FastCGI.

    server {listen 80;server_name www.example.com;rewrite ^(.*) http://example.com$1 permanent;

    }

    server {listen 80;server_name example.com;

    # root directive should be globalroot /var/www/example.com/public/app/webroot/;index index.php;

    access_log /var/www/example.com/log/access.log;error_log /var/www/example.com/log/error.log;

    location / {try_files $uri $uri/ /index.php?$uri&$args;

    }

    location ~ \.php$ {include /etc/nginx/fastcgi_params;try_files $uri =404;fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

    }}

    URL Rewrites no IIS7 (Windows hosts)

    O IIS7 no suporta nativamente os arquivos .htaccess. Embora haja add-ons que podem adicionar essesuporte, voc tambm pode importar regras htaccess no IIS para usar as regras de reescritas nativas doCakePHP. Para fazer isso, siga estes passos:

    1. Use o Microsift Web Plataform Installer para instalar o URL Rewrite Module 2.0.

    2. Crie um novo arquivo dentro de sua pasta do CakePHP, chamado web.config.

    3. Usando o Notepad ou algum outro editor de XML, copie o seguinte cdigo no seu novo arquivoweb.config...

    Instalao Avanada e Configurao Especfica por Servidor 33

  • CakePHP Cookbook Documentation, Verso 2.x

    Tambm possvel usar a funcionalidade de importao no modulo de reescrita de URL do IIS para importarregras diretamente dos arquivos .htaccess do CakePHP nas pastas /app/, e /app/webroot/ - embora algumasedies no IIS podem ser necessrias para faz-los funcionar. Importando as regras desta maneira, o IIS irautomaticamente criar o arquivo web.config para voc.

    Uma vez que o arquivo web.config criado com o conjunto de regras de reescrita do IIS, links do CakePHP,css, js, e o redirecionamento devem funcionar corretamente.

    Comece agora!

    Tudo bem, vamos ver o CakePHP em ao. Dependendo de qual configurao voc adotou, voc deveapontar seu navegador para http://example.com/ ou http://example.com/cake_install/. Neste ponto, vocver a pgina padro do CakePHP e a mensagem do estado da configurao do seu banco de dados.

    Parabns! Voc j est pronto para criar sua primeira aplicao CakePHP.

    34 Captulo 2. Instalao

  • CakePHP Cookbook Documentation, Verso 2.x

    No est funcionando? Se voc estiver recebendo erros do PHP relacionados ao fuso horrio, descomenteuma linha no app/Config/core.php:

    /*** Uncomment this line and correct your server timezone to fix

    * any date & time related errors.

    */date_default_timezone_set('UTC');

    Comece agora! 35

  • CakePHP Cookbook Documentation, Verso 2.x

    36 Captulo 2. Instalao

  • CAPTULO 3

    Viso Geral do CakePHP

    Bem vindo ao Cookbook, o manual para o framework de aplicaes web CakePHP que torna o desenvolvi-mento um pedao de bolo!

    Este manual assume que voc tenha um entendimento geral sobre PHP e conhecimentos bsicos em progra-mao orientada a objetos. Diferentes funcionalidades dentro do framework utilizam diversas tecnologias como SQL, Javascript e XML e este manual no tenta explicar estas tecnologias, somente como sousadas neste no contexto.

    O que o CakePHP? Porque us-lo?

    O CakePHP1 um framework2 de desenvolvimento rpido3 para PHP4, livre5 e de Cdigo aberto6. Nossoprincipal objetivo permitir que voc trabalhe de forma estruturada e rpida sem perder a flexibilidade.

    O CakePHP tira a monotonia do desenvolvimento web. Ns fornecemos todas as ferramentas que vocprecisa para comear programando o que realmente deseja: a lgica especfica da sua aplicao. Em vez dereinventar a roda a cada vez que se constri um novo projeto, pegue uma cpia do CakePHP e comece como interior de sua aplicao.

    O CakePHP possui uma equipe de desenvolvedores7 ativa e uma grande comunidade, trazendo grande valorao projeto. Alm de manter voc fora da reinveno da roda, usando o CakePHP significa que o ncleo dasua aplicao bem testado e est em constante aperfeioamento.

    Abaixo segue uma pequena lista dos recursos que voc poder desfrutar no CakePHP:

    Comunidade8 ativa e amigvel1http://www.cakephp.org/2http://pt.wikipedia.org/wiki/Framework3http://pt.wikipedia.org/wiki/Rapid_Application_Development4http://www.php.net/5http://pt.wikipedia.org/wiki/Licena_MIT6http://pt.wikipedia.org/wiki/Cdigo_aberto7http://github.com/cakephp/cakephp/contributors8http://cakephp.org/feeds

    37

  • CakePHP Cookbook Documentation, Verso 2.x

    Licena9 flexvel

    Compatvel com o PHP 5.2.6 e superior

    CRUD10 integrado para interao com o banco de dados

    Scaffolding11 para criar prottipos

    Gerao de cdigo

    Arquitetura MVC12

    Requisies feitas com clareza, URLs e rotas customizveis

    Validaes13 embutidas

    Templates14 rpidos e flexveis (Sintaxe PHP, com helpers)

    Helpers para AJAX, JavaScript, formulrios HTML e outros

    Componentes de Email, Cookie, Segurana, Sesso, e Tratamento de Requisies

    Controle de Acessos15 flexvel

    Limpeza dos dados

    Sistema de Cache16 flexvel

    Localizao

    Funciona a partir de qualquer diretrio do website, com pouca ou nenhuma configurao do Apache

    Entendendo o Model-View-Controller

    O CakePHP segue o padro de projeto MVC17. Programar usando o MVC separa sua aplicao em trspartes principais:

    Nota: Optamos por no traduzir as palavras Model, View e Controller. Gostariamos que voc se acos-tumasse com elas pois so muito utilizadas no dia a dia de um desenvolvedor CakePHP. Assim como oPortugus incorporou diversas palavras estrangeiras, o que voc acha de incorporar estas palavras no seuvocabulrio?

    9http://pt.wikipedia.org/wiki/Licena_MIT10http://pt.wikipedia.org/wiki/CRUD11http://en.wikipedia.org/wiki/Scaffold_(programming)12http://pt.wikipedia.org/wiki/MVC13http://en.wikipedia.org/wiki/Data_validation14http://en.wikipedia.org/wiki/Web_template_system15http://pt.wikipedia.org/wiki/Access_Control_List16http://en.wikipedia.org/wiki/Web_cache17http://pt.wikipedia.org/wiki/MVC

    38 Captulo 3. Viso Geral do CakePHP

  • CakePHP Cookbook Documentation, Verso 2.x

    A camada Model

    A camada Model (modelo) representa a parte de sua aplicao que implementa a lgica do negcio. Istosignifica que ela responsvel por obter os dados convertendo-os em conceitos significativos para sua apli-cao, assim como, processar, validar, associar e qualquer outra tarefa relativa ao tratamento dos dados.

    primeira vista, os objetos do tipo Model podem ser vistos como a primeira camada de interao comqualquer banco de dados que voc possa estar usando na sua aplicao. Mas em geral eles representam osprincipais conceitos em torno do qual voc implementa sua aplicao.

    No caso de uma rede social, a camada Model cuida de tarefas como as de salvar os dados dos usurios eo relacionamento entre amigos, armazenar e recuperar as fotos dos usurios, encontrar novos amigos parasugestes e etc. Neste exemplo os Models podem ser vistos como Amigo, Usuario, ComentarioeFoto.

    A camada View

    Uma View exibe uma representao dos dados modelados. Sendo separadas do objeto Model, responsvelpor usar as informaes disponibilizadas para produzir qualquer interface de apresentao que sua aplicaopossa necessitar.

    Por exemplo, como a camada Model retorna um conjunto de dados, a view pode us-los para exibir umapgina HTML ou retornar o resultado em um formato XML para que outros o consuma.

    A camada View no est limitada representaes dos dados no formato HTML ou texto, podendo serusada para entregar uma variedade de formatos diferentes, dependendo do que voc precisar, como vdeos,msicas, documentos e qualquer outro formato que voc puder pensar.

    A camada Controller

    A camada Controller (controlador) lida com as requisies dos usurios. responsvel por retornar umaresposta com a ajuda das camadas Model e View.

    Os Controllers podem ser vistos como gerentes tomando os devidos cuidados para que todos os recursosnecessrios para completar uma tarefa sejam delegados para os trabalhadores corretos. Ele aguarda ospedidos dos clientes, verifica a validade de acordo com as regras de autenticao e autorizao, delegadados para serem obtidos ou processados pelos Models e seleciona o tipo correto de apresentao dos dadospara o qual o cliente est aceitando para finalmente delegar o trabalho de renderizao para a camada devisualizao.

    Entendendo o Model-View-Controller 39

  • CakePHP Cookbook Documentation, Verso 2.x

    Ciclo de Requisio no CakePHP

    Figura: 1: Uma requisio bsica no MVC

    Figura 1: Mostra o tratamento de uma simples requisio de um cliente pelo CakePHP.

    Um ciclo de requisio tpico do CakePHP comea com o usurio solicitando uma pgina ou recurso em suaaplicao. Esta solicitao primeiramente processada por um dispatcher (expedidor) que ir selecionar oobjeto Controller correto para lidar com a solicitao feita.

    Assim que a solicitao do cliente chega ao Controller, este ir se comunicar como a camada Model paraprocessar qualquer operao de busca ou armazenamento de dados que for necessrio. Aps esta comuni-cao terminar, o Controller continuar delegando, agora para o objeto View correto a tarefa de gerar umasada resultante dos dados fornecidos pelo Model.

    Finalmente quando a sada gerada, ela imediatamente enviada para o usurio.

    Praticamente todas as requisies feitas para a sua aplicao iro seguir este padro.

    Depois ns iremos adicionar mais alguns detalhes especficos do CakePHP, portanto, tenha isto em menteenquanto prosseguimos.

    Benefcios

    Por que usar MVC? Porque um verdadeiro e testado padro de projeto de software que transforma umaaplicao em pacotes de desenvolvimento rpido, de fcil manuteno e modular. Elaborar tarefas divi-didas entre models, views e controllers faz com que sua aplicao fique leve. Novas funcionalidades sofacilmente adicionadas e pode-se dar nova cara nas caractersticas antigas num piscar de olhos. O designmodular e separado tambm permite aos desenvolvedores e designers trabalharem simultaneamente, in-cluindo a capacidade de se construir um prottipo18 muito rapidamente. A separao tambm permite queos desenvolvedores alterem uma parte da aplicao sem afetar outras.

    18http://en.wikipedia.org/wiki/Software_prototyping

    40 Captulo 3. Viso Geral do CakePHP

  • CakePHP Cookbook Documentation, Verso 2.x

    Se voc nunca construiu uma aplicao desta forma, leva algum tempo para se acostumar, mas estamosconfiantes que uma vez que voc tenha construdo sua primeira aplicao usando CakePHP, voc no vaiquerer fazer de outra maneira.

    Para comear a sua primeira aplicao CakePHP, tente seguir o tutorial para a construo de um blog

    Onde obter ajuda

    Site oficial do CakePHP

    http://www.cakephp.org

    O site oficial do CakePHP sempre o melhor lugar para visitar. Possui links para ferramentas frequente-mente utilizadas para desenvolvedores, screencasts, oportunidades de doaes e downloads.

    O Cookbook

    http://book.cakephp.org

    Este manual dever ser provavelmente o primeiro lugar que voc v para obter respostas. Como acontececom muitos outros projetos de cdigo aberto, temos novas pessoas regularmente. Tente primeiro dar oseu melhor para responder s suas prprias perguntas. As respostas podem vir mais lentas, porem, seroduradouras e tambm aliviar nossa demanda de suporte. Tanto o manual como a API podem ser consultadasonline.

    O Bakery

    http://bakery.cakephp.org

    O CakePHP Bakery um centro de intercmbio para todas as coisas sobre o CakePHP. Locais para tutoriais,estudos de casos, exemplos de cdigos. Uma vez que voc estiver familiarizado com o CakePHP, faa logone compartilhe seus conhecimentos com a comunidade e ganhe fama e fortuna.

    A API

    http://api20.cakephp.org/

    Direto ao ponto e diretamente dos desenvolvedores do ncleo, a API (Application Programming Interface)do CakePHP a mais completa documentao acerca dos mnimos detalhes do funcionamento interno doframework.

    Casos de Testes

    Se voc sentiu que a informao fornecida na API no suficiente, verifique o cdigo dos casos de testesfornecido com o CakePHP. Eles podem servir como exemplos prticos de utilizao das funcionalidades deuma classe:

    Onde obter ajuda 41

  • CakePHP Cookbook Documentation, Verso 2.x

    lib/Cake/Test/Case

    O canal IRC

    Canais IRC na rede irc.freenode.net:

    #cakephp Discusses gerais

    #cakephp-docs Documentao

    #cakephp-bakery Bakery

    #cakephp-pt Discusses gerais em Portugus

    Se voc est confuso, d um grito no canal do CakePHP no IRC. Algum da equipe de desenvolvimentoest geralmente l, especialmente durante o dia para os usurios da Amrica do Norte e Sul. Adoraramosouvir de voc, se precisar de alguma ajuda, se quiser encontrar usurios por perto ou quiser doar seu novocarro esportivo.

    O Google Group

    http://groups.google.com/group/cake-php

    http://groups.google.com/group/cakephp-pt

    CakePHP tambm tem um grupo muito ativo no Google. Pode ser um excelente recurso para encontrarrespostas arquivadas, perguntas frequentes, e obter respostas para problemas imediatos.

    Where to get Help in your Language

    French

    French CakePHP Community19

    19http://cakephp-fr.org

    42 Captulo 3. Viso Geral do CakePHP

  • CAPTULO 4

    Controllers

    Os controllers correspondem ao C no padro MVC. Aps o roteamento ter sido aplicado e o controllercorreto encontrado, a ao do controller chamada. Seu controller deve lidar com a interpretao dos dadosde uma requisio, certificando-se que os models corretos so chamados e a resposta ou view esperada sejaexibida. Os controllers podem ser vistos como intermedirios entre a camada Model e View. Voc vai querermanter seus controllers magros e seus Models gordos. Isso lhe ajudar a reutilizar seu cdigo e test-losmais facilmente.

    Mais comumente, controllers so usados para gerenciar a lgica de um nico model. Por exemplo, sevoc est construindo um site para uma padaria online, voc pode ter um RecipesController e umIngredientsController gerenciando suas receitas e seus ingredientes. No CakePHP, controllers sonomeados de acordo com o model que manipulam. tambm absolutamente possvel ter controllers queusam mais de um model.

    Os controllers da sua aplicao so classes que estendem a classe CakePHP AppController, a qualpor sua vez estende a classe Controller do CakePHP. A classe AppController pode ser definidaem /app/Controller/AppController.php e deve conter mtodos que so compartilhados entretodos os seus controllers.

    Os controllers fornecem uma srie de mtodos que so chamados de aes. Aes so mtodos em umcontroller que manipulam requisies. Por padro, todos os mtodos pblicos em um controller so aes eacessveis por urls.

    A Classe AppController

    Como mencionado anteriormente, a classe AppController a me de todos os outros con-trollers da sua aplicao. O prprio AppController estendida da classe Controllerque faz parte da biblioteca do CakePHP. Assim sendo, AppController definido em/app/Controller/AppController.php como:

    class AppController extends Controller {}

    43

  • CakePHP Cookbook Documentation, Verso 2.x

    Os atributos e mtodos criados em AppController vo estar disponveis para todos os controllers da suaaplicao. Este o lugar ideal para criar cdigos que so comuns para todos os seus controllers. Compo-nentes (que voc vai aprender mais tarde) so a melhor alternativa para cdigos que so usados por muitos(mas no obrigatoriamente em todos) controllers.

    Enquanto regras normais de herana de classes orientadas objetos so aplicadas, o CakePHP tambmfaz um pequeno trabalho extra quando se trata de atributos especiais do controller. A lista de componentes(components) e helpers usados no controller so tratados diferentemente. Nestes casos, as cadeias de valoresdo AppController so mescladas com os valores de seus controllers filhos. Os valores dos controllersfilhos sempre sobrescreveram os do AppController.

    Nota: O CakePHP mescla as seguintes variveis do AppController em controllers da sua aplicao:

    $components

    $helpers

    $uses

    Lembre-se de adicionar os helpers Html e Form padres se voc incluiu o atributo $helpers em seuAppController.

    Tambm lembre de fazer as chamadas de callbacks do AppController nos controllers filhos para obtermelhores resultados:

    function beforeFilter() {parent::beforeFilter();

    }

    Parmetros de Requisio

    Quando uma requisio feita para uma aplicao CakePHP, a classe Router e a classe Dispatcherdo Cake usa a routes-configuration para encontrar e criar o controller correto. Os dados da requisio soencapsulados em um objeto de requisio. O CakePHP coloca todas as informaes importantes de umarequisio na propriedade $this->request. Veja a seo Objetos de Requisio e Resposta para maisinformaes sobre o objeto de requisio do CakePHP.

    Aes de Controllers

    Retornando ao nosso exemplo da padaria online, nosso controller RecipesControllerpoderia conter as aes view(), share() e search() e poderia ser encontrado em/app/Controller/RecipesController.php contendo o cdigo a seguir:

    # /app/Controller/RecipesController.php

    class RecipesController extends AppController {function view($id) {

    // a lgica da ao vai aqui}

    44 Captulo 4. Controllers

  • CakePHP Cookbook Documentation, Verso 2.x

    function share($customer_id, $recipe_id) {// a lgica da ao vai aqui

    }

    function search($query) {// a lgica da ao vai aqui

    }}

    Para que voc use de forma eficaz os controllers em sua aplicao, ns iremos cobrir alguns dos atributos emtodos inclusos no controller fornecido pelo CakePHP.

    Ciclo de Vida dos Callbacks em uma Requisio

    class Controller

    Os controllers do CakePHP vm equipados com callbacks que voc pode usar para inserir lgicas em tornodo ciclo de vida de uma requisio:

    Controller::beforeFilter()Este mtodo executado antes de cada ao dos controllers. um timo lugar para verificar se huma sesso ativa ou inspecionar as permisses de um usurio.

    Nota: O mtodo beforeFilter() ser chamado para aes no encontradas e aes criadas pelo scaffolddo Cake.

    Controller::beforeRender()Chamada aps a lgica da ao de um controller, mas antes da view ser renderizada. Este callbackno usado com frequncia mas pode ser preciso se voc chamar o mtodo render() manualmenteantes do trmino de uma ao.

    Controller::afterFilter()Chamada aps cada ao dos controllers, e aps a completa renderizao da view. Este o ltimomtodo executado do controller.

    Em adio aos callbacks dos controllers, os Componentes tambm fornecem um conjunto de callbackssimilares.

    Mtodos dos Controllers

    Para u