Escolar Documentos
Profissional Documentos
Cultura Documentos
Verso 2.x
19 April, 2015
Contedo
Primeiros Passos
Blog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Blog - Continuao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Instalao
Requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . .
Licena . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Baixando o CakePHP . . . . . . . . . . . . . . . . . . . . .
Permisses . . . . . . . . . . . . . . . . . . . . . . . . . .
Configurao . . . . . . . . . . . . . . . . . . . . . . . . .
Desenvolvimento . . . . . . . . . . . . . . . . . . . . . . .
Produo . . . . . . . . . . . . . . . . . . . . . . . . . . .
Instalao Avanada e Configurao Especfica por Servidor
Comece agora! . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
5
25
25
25
26
26
26
27
28
28
34
Controllers
A Classe AppController . . . . . . . . . . . . . .
Parmetros de Requisio . . . . . . . . . . . . .
Aes de Controllers . . . . . . . . . . . . . . .
Ciclo de Vida dos Callbacks em uma Requisio .
Mtodos dos Controllers . . . . . . . . . . . . .
Atributos do Controller . . . . . . . . . . . . . .
Mais sobre Controllers . . . . . . . . . . . . . .
Views
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
43
43
44
44
45
45
52
54
71
i
View Templates . . . . . . . . . .
Usando Blocos de Views (Vises)
Layouts . . . . . . . . . . . . . .
Elements . . . . . . . . . . . . . .
View API . . . . . . . . . . . . .
6
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
71
73
75
77
80
Plugins
Instalando um Plugin . . . . . . . .
Usando um Plugin . . . . . . . . . .
Criando Seus Prprios Plugins . . .
Plugin Controllers . . . . . . . . . .
Plugin Models . . . . . . . . . . . .
Plugin Views . . . . . . . . . . . .
Imagens de Plugin, CSS e Javascript
Components, Helpers e Behaviors .
Expanda seu Plugin . . . . . . . . .
Plugin Dicas . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
83
83
84
85
86
86
87
88
88
89
89
Desenvolvimento
Configuration . .
Routing . . . . .
Sessions . . . . .
Exceptions . . . .
Error Handling .
Debugging . . . .
Testing . . . . . .
REST . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
91
91
91
91
92
92
92
93
93
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
Implementao
95
Definindo a Raiz . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Atualizar o core.php . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
Multiplas aplicaes usando o mesmo core do CakePHP . . . . . . . . . . . . . . . . . . . . . . 96
10 Apndices
Guia de Migrao para a Verso 2.0
Guia de Migrao para a Verso 2.1
Migrando da Verso 1.2 para 1.3 . .
Informaes Gerais . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
97
97
101
112
118
119
.
.
.
.
121
121
122
129
130
131
ndice
133
ii
CAPTULO 1
Primeiros Passos
O framework CakePHP fornece uma base robusta e slida para suas aplicaes. Podendo tratar todos os aspectos, da requisio inicial do usurio at a renderizao de uma pgina web. Visto que o framework segue
o 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 do
banco 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 construir
alguma coisa. Para comear vamos construir um blog simples.
Blog
Bem vindo ao CakePHP. Voc provavelmente est lendo este tutorial porque quer aprender mais sobre como
o CakePHP funciona. Nosso objetivo aumentar a produtividade e fazer a programao uma tarefa mais
divertida: 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, criar
e configurar o banco de dados e criar a lgica da aplicao suficiente para listar, adicionar, editar e deletar
posts 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 instrues para usar outros servidores sejam bem semelhantes. Talvez tenhamos que brincar um pouco
com as configuraes do servidor mas a maioria das pessoas sero capazes de ter o Cake rodando sem
precisar configurar nada.
2. Um servidor de banco de dados. Ns iremos usar o MySQL Server neste tutorial. Voc precisa saber
o 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.
4. E por ltimo, voc vai precisar de um conhecimento bsico do padro de projetos MVC. Uma rpida
viso geral pode ser encontrada em Entendendo o Model-View-Controller. No se preocupe, deve ter
meia 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
git://github.com/cakephp/cakephp.git.
usando
git1 .
git clone
Idependente da maneira de como voc baixou o Cake, coloque o cdigo obtido dentro do seu diretrio web
pblico. A estrutura dos diretrios deve ficar parecido com o seguinte:
/caminho_para_diretorio_web_publico
/app
/lib
/plugins
/vendors
.htaccess
index.php
README
Agora pode ser um bom momento para aprender um pouco sobre como funciona a estrutura de diretrios do
CakePHP: Veja a seo Estrutura de Diretrios no CakePHP.
http://git-scm.com/
Aps salvar seu novo arquivo database.php, voc estar apto para abrir seu navegador e ver a pgina de boas
vindas do Cake. A pgina de boas vindas dever lhe mostrar uma mensagem dizendo que seu arquivo de
conexo 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 estes
itens, mas eles no so obrigatrios para este tutorial. Uma das configuraes customizar uma string (ou
salt) para ser utilizada nos hashes de segurana. O segundo definir um nmero (ou seed) para uso em
criptografia. E o terceiro dar permisso de escrita para o CakePHP na pasta tmp.
Blog
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 no
seja 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 valor
seja, 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 (<?php echo whoami; ?>) e alterar o
dono da pasta app/tmp para este usurio. Voc pode executar (em *nix) o comando a seguir para alterar o
usurio 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 mensagem
enquanto estiver em modo de desenvolvimento.
4. Certifique-se de que o Apache esteja carregando o mod_rewrite corretamente! Voc deve ver algo
como:
LoadModule rewrite_module
libexec/httpd/mod_rewrite.so
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'));
Blog - Continuao
Crie um Model Post
A classe Model o po com manteiga das aplicaes CakePHP. Ao criar um model do CakePHP que
ir interagir com nossa base de dados, teremos os alicerces necessrios para posteriormente fazer nossas
operaes 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 ser
salvo 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 nosso
model 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
um arquivo correspondente na pasta /app/Model. Isto tambm significa que, se voc acidentalmente der um
nome errado ao seu arquivo (p.ex. post.php ou posts.php) o CakePHP no ser capaz de reconhecer nenhuma
de suas configuraes adicionais e ao invs disso, passar a usar seus padres definidos internamente na
classe Model.
Para saber mais sobre models, como prefixos de nomes de tabelas, callbacks e validaes, confira o captulo
sobre /models deste manual.
Agora, vamos adicionar uma action ao nosso controller. Actions quase sempre representam uma
nica funo ou interface numa aplicao. Por exemplo, quando os usurios acessarem o endereo
www.exemplo.com/posts/index (que, neste caso o mesmo que www.exemplo.com/posts/), eles esperam
ver 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'));
}
}
Blog - Continuao
)
)
Os arquivos de view do Cake so armazenados na pasta /app/View dentro de uma pasta com o mesmo
nome do controller a que correspondem (em nosso caso, vamos criar uma pasta chamada Posts). Para
apresentar os dados do post num formato adequado de tabela, o cdigo de nossa view deve ser algo como:
<!-- File: /app/View/Posts/index.ctp -->
<h1>Posts do Blog</h1>
<table>
<tr>
<th>Id</th>
<th>Ttulo</th>
<th>Data de Criao</th>
</tr>
<!-- Aqui onde ns percorremos nossa matriz $posts, imprimindo
as informaes dos posts -->
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo $post['Post']['id']; ?></td>
<td>
<?php echo $this->Html->link($post['Post']['title'],
array('controller' => 'posts', 'action' => 'view', $post['Post']['id'])); ?>
</td>
<td><?php echo $post['Post']['created']; ?></td>
</tr>
<?php endforeach; ?>
</table>
no foi definida. Se voc no tiver visto um aviso assim, ento ou alguma coisa deu errado ou ento voc j
tinha definido uma action anteriormente, e neste caso, voc muito afoito. Se no, vamos cri-la em nosso
PostsController 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() ao
invs 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 o
valor 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:
<!-- File: /app/View/Posts/view.ctp -->
<h1><?php echo $post['Post']['title']?></h1>
<p><small>Created: <?php echo $post['Post']['created']?></small></p>
<p><?php echo $post['Post']['body']?></p>
Adicionando Posts
Ler a partir da base de dados e exibir os posts foi um grande comeo, mas precisamos permitir tambm que
os 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
Nota: Voc precisa incluir o componente SessionComponent e o helper SessionHelper em qualquer controller que voc manipula variveis de sesso. Neste caso, inclumos apenas o componente porque ele
carrega o helper automaticamente. Se voc sempre utiliza sesses, inclua o componente no seu arquivo
AppController.
Aqui est o que a action add() faz: se o mtodo da requisio feita pelo cliente for do tipo post, ou seja, se
ele enviou dados pelo formulrio, tenta salvar os dados usando o model Post. Se, por alguma razo ele no
salvar, apenas renderize a view. Isto nos d uma oportunidade de mostrar erros de validao e outros avisos
ao usurio.
Quando um usurio utiliza um formulrio para submeter (POSTar) dados para sua aplicao, esta informao
fica disponvel em $this->request->data.Voc pode usar as funes pr() ou debug() para exibir
os dados se voc quiser conferir como eles se parecem.
Ns usamos o mtodo SessionComponent::setFlash() do componente SessionComponent para
definir uma varivel de sesso com uma mensagem a ser exibida na pgina depois de ser redirecionada. No
layout, ns temos SessionHelper::flash que exibe a mensagem e limpa a varivel de sesso correspondente. O mtodo Controller::redirect do controller redireciona para outra URL. O parmetro
array(action => index) convertido para a URL /posts, em outras palavras, a action index
do controller posts. Voc pode conferir a funo Router::url() na API para ver os formatos que voc
pode 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 tudo
isso mais fcil e mais rpido.
Para usufruir das vantagens dos recursos de validao, voc vai precisar usar o FormHelper do Cake em suas
views. O FormHelper est disponvel por padro em todas as suas views na varivel $this->Form.
10
Aqui, usamos o FormHelper para gerar a tag de abertura para um formulrio. Aqui est o HTML gerado
pelo $this->Form->create():
<form id="PostAddForm" method="post" action="/posts/add">
Se o mtodo create() for chamado sem quaisquer parmetros, o CakePHP assume que voc est criando
um formulrio que submete para a action add() do controller atual (ou para a action edit() se um campo
id for includo nos dados do formulrio), via POST.
O mtodo $this->Form->input() usado para criar elementos de formulrio de mesmo nome. O
primeiro parmetro informa ao CakePHP qual o campo correspondente e o segundo parmetro permite que
voc especifique um extenso array de opes. Neste caso, o nmero de linhas para o textarea. H alguma
introspeco automgica envolvida aqui: o input() ir exibir diferentes elementos de formulrio com
base no campo do model em questo.
A chamada $this->Form->end() gera um boto de submisso e encerra o formulrio. Se uma
string for informada como primeiro parmetro para o end(), o FormHelper exibe um boto de submit
apropriadamente rotulado junto com a tag de fechamento do formulrio. Novamente, confira o captulo
sobre os /views/helpers disponveis no CakePHP para mais informaes sobre os helpers.
Agora vamos voltar e atualizar nossa view /app/View/Post/index.ctp para incluir um novo link
para Adicionar Post. Antes de <table>, adicione a seguinte linha:
echo $this->Html->link('Add Post', array('controller' => 'posts', 'action' => 'add'));
Voc pode estar imaginando: como eu informo ao CakePHP sobre os requisitos de validao de meus dados?
Regras de validao so definidas no model. Vamos olhar de volta nosso model Post e fazer alguns pequenos
ajustes:
class Post extends AppModel {
public $name = 'Post';
public $validate = array(
'title' => array(
'rule' => 'notEmpty'
),
'body' => array(
'rule' => 'notEmpty'
)
);
}
O array $validate diz ao CakePHP sobre como validar seus dados quando o mtodo save() for
Blog - Continuao
11
chamado. Aqui, eu especifiquei que tanto os campos body e title no podem ser vazios. O mecanismo
de validao do CakePHP robusto, com diversas regras predefinidas (nmeros de carto de crdito, endereos 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 corpo
vazio para ver como funciona. Uma vez que usamos o mtodo FormHelper::input() do FormHelper
para criar nossos elementos de formulrio, nossas mensagens de erros de validao sero mostradas automaticamente.
Editando Posts
Edio de Posts: Aqui vamos ns. A partir de agora voc j um profissional do CakePHP, ento voc deve
ter 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 a
view. Se a requisio no for do tipo GET, provavelmente esta contm dados de um formulrio POST. Ns
usaremos estes dados para atualizar o registro do nosso Post ou exibir novamente a view mostrando para o
usurio os erros de validao.
A view edit pode ser algo parecido com isto:
<!-- File: /app/View/Posts/edit.ctp -->
<h1>Edit
<?php
echo
echo
echo
echo
echo
Post</h1>
$this->Form->create('Post', array('action' => 'edit'));
$this->Form->input('title');
$this->Form->input('body', array('rows' => '3'));
$this->Form->input('id', array('type' => 'hidden'));
$this->Form->end('Save Post');
Esta view exibe o formulrio de edio (com os valores populados), juntamente com quaisquer mensagens
de erro de validao.
Uma coisa a atentar aqui: o CakePHP vai assumir que voc est editando um model se o campo id estiver
presente no array de dados. Se nenhum id estiver presente (como a view add de insero), o Cake ir
assumir que voc est inserindo um novo model quando o mtodo save() for chamado.
12
Voc agora pode atualizar sua view index com os links para editar os posts especficos:
<!-- File: /app/View/Posts/index.ctp
<h1>Blog posts</h1>
<p><?php echo $this->Html->link("Add Post", array('action' => 'add')); ?></p>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Action</th>
<th>Created</th>
</tr>
<!-- Aqui onde ns percorremos nossa matriz $posts, imprimindo
as informaes dos posts -->
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
Nota: O cdigo desta view tambm utiliza o HtmlHelper para solicitar uma confirmao do usurio com
um dilogo em Javascript antes de tentar excluir o post.
14
Rotas
Para alguns, o roteamento padro do CakePHP funcionar muito bem. Os desenvolvedores que estiverem
mais afeitos a criar produtos ainda mais amigveis aos usurios e aos mecanismos de busca iro gostar da
maneira que as URLs do CakePHP so mapeadas para actions especficas. Ento vamos fazer uma pequena
alterao 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) usando
seu PagesController e renderizando uma view chamada de home. Ao invs disso, vamos substituir isto
por nosso PostsController criando uma regra de roteamento.
As rotas do Cake so encontrada no arquivo /app/Config/routes.php. Voc vai querer comentar ou
remover 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 prprio
controller, 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 passar
array(controller => posts, action => index) a um mtodo que espere um
array, a URL resultante ser /. sempre uma boa ideia usar arrays para URLs, j que a partir disto que
suas rotas definem para onde suas URLs apontam, alm de garantir que os links sempre apontem para o
mesmo lugar.
Concluso
Criar aplicaes desta maneira ir lhe trazer paz, honra, amor e dinheiro alm de satisfazer s suas mais
ousadas fantasias. Simples, no? Tenha em mente que este tutorial foi muito bsico. O CakePHP possui
muito mais recursos a oferecer e flexvel de tantas maneiras que no conseguimos mostrar aqui por questes
de 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 seu
prprio 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 website
2
http://api20.cakephp.org
Blog - Continuao
15
Leitura Adicional
Uma Requisio Tpica do CakePHP
Ns j abordamos os ingredientes bsicos do CakePHP, ento agora vamos dar uma olhada em como os
objetos trabalham juntos para completar uma requisio bsica. Continuando com o exemplo da requisio
original, vamos imaginar que nosso amigo Ricardo apenas clicou no link Compre um bolo personalizado
agora! em uma landing page3 de uma aplicao CakePHP.
16
http://pt.wikipedia.org/wiki/Landing_page
1. Ricardo clica no link apontando para http://www.example.com/cakes/buy, e o navegador dele faz uma
requisio para seu servidor web.
2. O roteador analisa a URL para extrair os parmetros desta requisio: o controller, a ao, e qualquer
outro 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 em
uma 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. As
linhas tracejadas em azul mostram isso no diagrama.
4. O controller pode usar models para obter acesso aos dados do aplicativo. Neste exemplo o controller usa o model para pegar no banco de dados as ltimas compras do Ricardo. Qualquer callback
do model, behaviors ou DataSources que for aplicvel neste momento, ser chamado. Enquanto a
utilizao de Models no seja obrigatria, todas os controllers inicialmente requerem ao menos um
model.
5. Aps o model buscar os dados, estes so retornados para o controller. Callbacks de um Model podem
ser aplicados.
6. O controller poder utilizar componentes para refinar os dados ou executar outras operaes (manipular 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 controller
podem ser chamados antes que os dados sejam passados. A view executada, podendo incluir o uso
de 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 renderizada
e completa enviada para o navegador do Ricardo.
Convenes no CakePHP
Ns somos grandes fns de convenes sobre configurao4 . Enquanto pode levar um tempo para aprender
as convenes do CakePHP, voc ganhar muito tempo a longo prazo: seguindo as convenes voc ganhar
funcionalidades e ficar livre dos pesadelos de manter arquivos de configurao. As convenes tambm
contribuem para o desenvolvimento de sistemas mais uniformes, permitindo que outros desenvolvedores
entrem no projeto e comecem a trabalhar muito mais rapidamente.
As convenes do CakePHP foram destiladas ao longo de anos de experincia no desenvolvimento de aplicaes web e boas prticas. Da mesma forma que sugerimos que voc use essas convenes enquanto
desenvolve 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 a
palavra Controller. PeopleController e LatestArticlesController so dois exemplos
4
5
http://pt.wikipedia.org/wiki/Conven%C3%A7%C3%A3o_sobre_configura%C3%A7%C3%A3o
http://pt.wikipedia.org/wiki/CamelCase
Blog - Continuao
17
18
Geralmente, nomes de arquivos correspondem com o nome de suas classes, que so em CamelCase6 . Ento
se 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 em
aplicaes CakePHP:
O controller KissesAndHugsController seria encontrado em um arquivo chamado KissesAndHugsController.php
O componente MyHandyComponent seria encontrado em um arquivo chamado MyHandyComponent.php
O model OptionValue seria encontrado em um arquivo chamado OptionValue.php
O behavior EspeciallyFunkableBehavior seria encontrado em um arquivo chamado EspeciallyFunkableBehavior.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 ReallyBigCar
so 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 e
really_big_cars.
Voc pode usar a biblioteca utilitria Inflector para verificar a forma singular/plural das palavras. Veja
a classe /core-utility-libraries/inflector para mais informaes.
Nomes de colunas formadas por mais de uma palavra devem ser separadas usando underscore como em
first_name.
Chaves estrangeiras em associaes do tipo hasMany, belongsTo ou hasOne so reconhecidas por padro
como o nome (no singular) das tabelas relacionadas seguidas por _id. Ento, se Baker hasMany (possui
muitos) Cake, a tabela cakes ir fazer referncia a tabela bakers via chave estrangeira baker_id. Para tabelas
formadas 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 models
devem 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 uma
chave primria para identificar unicamente cada registro. Se voc quiser modelar uma tabela que no possua
6
7
http://pt.wikipedia.org/wiki/CamelCase
http://pt.wikipedia.org/wiki/CamelCase
Blog - Continuao
19
uma chave primria nica, a conveno do CakePHP diz que voc deve adicionar uma se quiser utiliz-la
com um model.
O CakePHP no suporta chaves primrias compostas. Se voc quiser manipular os dados das tabelas de
junes diretamente, use chamadas de query diretas ou adicione uma chave primaria para us-las como um
model normal. Ex.:
CREATE TABLE posts_tags
id
INT(10) NOT
post_id INT(10) NOT
tag_id INT(10) NOT
PRIMARY KEY(id)
);
(
NULL AUTO_INCREMENT,
NULL,
NULL,
Ao invs de usar chaves auto incrementadas, voc tambm pode usar o tipo char(36). Desta forma o Cake
ir usar um identificador nico (uuid) de 36 caracteres criado por String::uuid sempre que voc salvar um
novo 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 exibem
no formato underscore. O mtodo getReady() da classe PeopleController ir utilizar uma view localizada
em /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 sem
os incmodos e problemticos arquivos de configurao. Segue agora um exemplo final que mostra as
convenes 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 automaticamente disponibilizado (e automaticamente amarrado com a tabela cars no banco de dados) e renderiza
o arquivo /app/View/Cars/index.ctp. Nenhum destes relacionamentos precisou ser configurado, a no ser a
criao 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 como
todas 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
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 sua
aplicao.
No diretrio lib onde fazemos nossa mgica. comprometa-se em no editar nenhum arquivo deste
diretrio. 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 precisar
usar 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 dar
uma olhada mais de perto nas pastas que esto dentro de app.
Config Armazena os (poucos) arquivos de configurao que o CakePHP utiliza. Parmetros de conexo
com o banco de dados, inicializao do sistema (Bootstrapping8 ), arquivos de configurao do ncleo
do 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 bibliotecas 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 de
como voc configurou o CakePHP mas geralmente usada para armazenar o cache das descries dos
models, 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 ser
prejudicado severamente.
Vendor Qualquer classe ou biblioteca de terceiros devem ficar aqui. Fazendo isto, torna fcil acess-las usando 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
8
http://pt.wikipedia.org/wiki/Bootstrapping
Blog - Continuao
21
detalhes, explicando a diferena dos dois diretrios quando estivermos discutindo sobre como gerir
mltiplas aplicaes e configuraes de sistemas mais complexos.
View Arquivos de apresentao so colocados aqui: elementos, pginas de erros, helpers, layouts e arquivos
de views.
webroot Quando voc configurar sua aplicao para rodar em produo, este diretrio deve ser a raiz do seu
diretrio web pblico. Pastas aqui dentro tambm servem para colocar seus arquivos CSS, imagens e
Javascripts.
Estrutura do CakePHP
O CakePHP possui as classes essenciais Controller, Model e View, mas tambm apresenta algumas outras
classes 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 adicionar
funcionalidades base das classes do MVC em sua aplicao. Por enquanto, vamos fazer uma explicao
superficial destas ferramentas e detalh-las mais tarde.
Extenses de Aplicao
Cada controller, helper e model possui uma classe me que voc pode usar para
incluir mudanas vlidas por toda a aplicao.
As classes AppController (localizada
em
/app/Controller/AppController.php),
AppHelper
(localizada
em
/app/View/Helper/AppHelper.php)
e
AppModel
(localizada
em
/app/Model/AppModel.php) so excelentes lugares para colocar mtodos que voc quer compartilhar 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 comportamento
padro assume que a URL /controller/action/var1/var2 deve ser mapeada para o mtodo Controller::action($var1, $var2), mas voc pode usar as rotas para customizar as URLs e como elas so interpretadas 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 plugins
do CakePHP.
Extenses de Controllers (Componentes)
Um Component uma classe que d suporte s lgicas nos controllers. Se voc possui uma lgica que
queira compartilhar entre controllers, um componente geralmente uma boa escolha para coloc-la. Como
um 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 a
lgica para que seja possvel compartilh-la.
22
Os controllers tambm esto equipados com callbacks. Estes callbacks esto disponveis para que voc
possa utiliz-los, bem nos casos em que voc precisa inserir alguma lgica entre as operaes do ncleo do
CakePHP. 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. Pode
no haver diferenas entre o afterRender() e o afterFilter() ao menos que voc tenha
chamado o mtodo render() na ao de um controller e tenha includo alguma lgica depois desta
chamada.
Extenses de Models (Behaviors)
Similarmente, Behaviors trabalham para adicionar funcionalidades comuns entre models. Por exemplo, se
voc armazena os dados dos usurios em uma estrutura de dados do tipo rvore, voc pode especificar que
seu model Usuario se comporta tal como uma rvore e assim, ganha funcionalidades para remover, adicionar
e substituir ns na estrutura que existe por baixo do model.
Models tambm recebem o suporte de outra classe chamada DataSource. DataSources so uma abstrao
que permite os models manipularem consistentemente diferentes tipos de dados. Embora a fonte principal de
dados em uma aplicao usando o CakePHP seja banco de dados, voc pode escrever DataSources adicionais
que permitem seus models representarem feeds RSS, arquivos CSV, entradas LDAP ou eventos do iCal. Os
DataSources permitem voc associar registros de diferentes fontes: Diferente de estar limitado pelas junes
do SQL, os DataSources permitem voc dizer para seu Model LDAP que est associado muitos eventos
do 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 encontrar
mais 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 so
usados pelos controllers, os helpers ajudam na lgica de apresentao que podem ser acessadas e compartilhadas entre as views. Um dos Helpers que acompanha o Cake o AjaxHelper que torna requisies em
ajax nas views muito mais fcil.
Blog - Continuao
23
Muitas aplicaes possuem pedaos de cdigo de apresentao que so usados repetidamente. O CakePHP
facilita a reutilizao destes trechos com layouts e elementos. Por padro, cada view renderizada por um
controller colocada dentro de um layout. Elementos so usados quando pequenos trechos de contedo
precisam ser reusados em muitas views.
24
CAPTULO 2
Instalao
O CakePHP rpido e fcil de instalar. Os requisitos mnimos so um servidor web e uma cpia do Cake, s
isso! 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 uma
exigncia.
PHP 5.2.8 ou superior.
Tecnicamente no exigido um banco de dados mas imaginamos que a maioria das aplicaes ir utilizar
um. 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 extenso
correta do PDO instalada.
Licena
O CakePHP licenciado sob uma Licena MIT. Isto significa que voc tem liberdade para modificar, distribuir e republicar o cdigo-fonte com a condio de que os avisos de copyright permaneam intactos. Voc
tambm tem liberdade para incorporar o CakePHP em qualquer aplicao comercial ou de cdigo fechado.
25
Baixando o CakePHP
H duas maneiras de se obter uma cpia atualizada do CakePHP. Voc pode fazer o download de um arquivo
comprimido (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 o
prprio Cake assim como muitos outros plugins para ele. As verses disponveis esto na pgina Github
tags2 .
Alternativamente voc pode obter uma cpia contendo todas as correes de bugs e atualizaes recentes
clonando 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 do
servidor web.
Um problema comum que ambos os diretrios e subdiretrios de app/tmp devem poder ser gravados pelo
servidor 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 uma
vez em seu projeto para assegurar que as permisses sero configuradas apropriadamente:
Configurao
Configurar o CakePHP pode ser to simples como descompact-lo em seu servidor web, ou to complexo
e flexvel se voc desejar. Esta seo ir cobrir trs principais tipos de instalao do CakePHP: desenvolvimento, produo e avanada.
Desenvolvimento: fcil para comear, as URLs da aplicao incluem o nome do diretrio de instalao e menos seguro.
Produo: Requer maior habilidade para configurar o diretrio raiz do servidor web, URLs limpas,
muito seguro.
1
2
26
http://github.com/cakephp/cakephp
https://github.com/cakephp/cakephp/tags
Captulo 2. Instalao
Avanada: Com algumas configuraes, permite que voc coloque os diretrios do CakePHP em
diferentes locais do sistema de arquivos, permitindo compartilhar o ncleo do CakePHP entre diversas
aplicaes.
Desenvolvimento
A instalao de desenvolvimento o mtodo mais rpido de configurao do Cake. Este exemplo ir te
ajudar 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 do
seu servidor web com o nome da verso que voc baixou (por exemplo, cake2.0.0). Renomeie essa pasta
para 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/
.htaccess
index.php
README
Se o seu servidor web est configurado corretamente, agora voc deve encontrar sua aplicao Cake
acessvel em http://www.example.com/cake_2_0/.
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 localizar
e 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
Finalizando a definio do seu include_path suas aplicaes devem estar prontas para encontrar o
CakePHP automaticamente.
Produo
A instalao de produo uma forma mais flexvel de configurao do Cake Usando este mtodo permite
um total domnio para agir como uma nica aplicao CakePHP. Este exemplo ir ajud-lo a instalar o Cake
em qualquer lugar do seu sistema de arquivos e torn-lo disponvel em http://www.example.com. Note que
esta 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, assumimos que voc escolheu instalar o Cake em /cake_install. Sua configurao de produo ser semelhante
a esta em seu sistema de arquivos:
/cake_install/
app/
webroot/ (esse diretrio est definido como diretiva ``DocumentRoot``)
lib/
plugins/
vendors/
.htaccess
index.php
README
Se o seu servidor web estiver configurado corretamente, voc deve encontrar agora sua aplicao Cake
acessvel em http://www.example.com.
28
Captulo 2. Instalao
Cada um desses diretrios podem ser localizados em qualquer em seu sistema de arquivos, com exceo do
webroot, que precisa ser acessvel pelo seu servidor web. Voc pode at mesmo mover a pasta webroot para
fora 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 do
CakePHP.
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. Isso
previne qualquer erros sobre falta de arquivos que voc pode obter, por ter usado o delimitador errado, e isso
torna 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 apanharam para fazer isto funcionar nos seus sistemas, ento ns lhe daremos algumas dicas que voc pode tentar
fazer para rodar corretamente.
29
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 AllowOverride
est 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.
#
<Directory />
Options FollowSymLinks
AllowOverride All
#
Order deny,allow
#
Deny from all
</Directory>
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 apenas
precisa 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 comeam
com . 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 nosso
repositrio 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 a
sua aplicao):
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule
^$ app/webroot/
[L]
RewriteRule
(.*) app/webroot/$1 [L]
</IfModule>
O diretrio app do seu Cake (ser copiado para o diretrio principal da sua aplicao pelo bake):
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule
^$
webroot/
RewriteRule
(.*) webroot/$1
</IfModule>
[L]
[L]
Diretrio webroot do Cake (ser copiado para a raiz da sua aplicao web pelo bake):
30
Captulo 2. Instalao
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
Para muitos servios de hospedagem (GoDaddy, 1and1), seu servidor web sendo servido a partir de
um diretrio de usurio que j utiliza o mod_rewrite. Se voc est instalando o CakePHP dentro
do diretrio de um usurio (http://example.com/~username/cakephp/), ou qualquer outra estrutura de
URL 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 .htaccess
do seu webroot seria algo como:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /path/to/cake/app
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
Os detalhes dessa mudana vai depender de sua configurao, e pode incluir algumas coisas adicionais
que no esto relacionadas ao Cake. Por favor, consulte a documentao online do Apache para mais
informaes.
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 na
configurao do seu lighty. Basta editar a URL, e tudo deve funcionar. Por favor, note que isto no funciona
em 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 script
LUA em /etc/lighttpd/cake.
31
-- the magic ;)
if (not file_exists(lighty.env["physical.path"])) then
-- file still missing. pass it to the fastcgi backend
request_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=" .. req
lighty.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["phys
end
end
-- 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 definir
o 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 too
url.access-deny = (
"~", ".inc", ".sh", "sql", ".sql", ".tpl.php",
".xtmpl", "Entries", "Repository", "Root",
".ctp", "empty"
)
}
32
Captulo 2. Instalao
33
<system.webServer>
<rewrite>
<rules>
<rule name="Imported Rule 1" stopProcessing="true">
<match url="^(.*)$" ignoreCase="false" />
<conditions logicalGrouping="MatchAll">
<add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="tru
<add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
</conditions>
<action type="Rewrite" url="index.php?url={R:1}" appendQueryString="true" />
</rule>
Tambm possvel usar a funcionalidade de importao no modulo de reescrita de URL do IIS para importar
regras diretamente dos arquivos .htaccess do CakePHP nas pastas /app/, e /app/webroot/ - embora algumas
edies no IIS podem ser necessrias para faz-los funcionar. Importando as regras desta maneira, o IIS ir
automaticamente 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 deve
apontar seu navegador para http://example.com/ ou http://example.com/cake_install/. Neste ponto, voc
ver 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
No est funcionando? Se voc estiver recebendo erros do PHP relacionados ao fuso horrio, descomente
uma 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
36
Captulo 2. Instalao
CAPTULO 3
Bem vindo ao Cookbook, o manual para o framework de aplicaes web CakePHP que torna o desenvolvimento um pedao de bolo!
Este manual assume que voc tenha um entendimento geral sobre PHP e conhecimentos bsicos em programao 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 so
usadas neste no contexto.
http://www.cakephp.org/
http://pt.wikipedia.org/wiki/Framework
3
http://pt.wikipedia.org/wiki/Rapid_Application_Development
4
http://www.php.net/
5
http://pt.wikipedia.org/wiki/Licena_MIT
6
http://pt.wikipedia.org/wiki/Cdigo_aberto
7
http://github.com/cakephp/cakephp/contributors
8
http://cakephp.org/feeds
2
37
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 trs
partes principais:
Nota: Optamos por no traduzir as palavras Model, View e Controller. Gostariamos que voc se acostumasse com elas pois so muito utilizadas no dia a dia de um desenvolvedor CakePHP. Assim como o
Portugus incorporou diversas palavras estrangeiras, o que voc acha de incorporar estas palavras no seu
vocabulrio?
9
http://pt.wikipedia.org/wiki/Licena_MIT
http://pt.wikipedia.org/wiki/CRUD
11
http://en.wikipedia.org/wiki/Scaffold_(programming)
12
http://pt.wikipedia.org/wiki/MVC
13
http://en.wikipedia.org/wiki/Data_validation
14
http://en.wikipedia.org/wiki/Web_template_system
15
http://pt.wikipedia.org/wiki/Access_Control_List
16
http://en.wikipedia.org/wiki/Web_cache
17
http://pt.wikipedia.org/wiki/MVC
10
38
A camada Model
A camada Model (modelo) representa a parte de sua aplicao que implementa a lgica do negcio. Isto
significa que ela responsvel por obter os dados convertendo-os em conceitos significativos para sua aplicao, 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 com
qualquer banco de dados que voc possa estar usando na sua aplicao. Mas em geral eles representam os
principais 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 e
o relacionamento entre amigos, armazenar e recuperar as fotos dos usurios, encontrar novos amigos para
sugestes e etc. Neste exemplo os Models podem ser vistos como Amigo, Usuario, Comentarioe
Foto.
A camada View
Uma View exibe uma representao dos dados modelados. Sendo separadas do objeto Model, responsvel
por usar as informaes disponibilizadas para produzir qualquer interface de apresentao que sua aplicao
possa necessitar.
Por exemplo, como a camada Model retorna um conjunto de dados, a view pode us-los para exibir uma
pgina 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 ser
usada 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 uma
resposta com a ajuda das camadas Model e View.
Os Controllers podem ser vistos como gerentes tomando os devidos cuidados para que todos os recursos
necessrios para completar uma tarefa sejam delegados para os trabalhadores corretos. Ele aguarda os
pedidos dos clientes, verifica a validade de acordo com as regras de autenticao e autorizao, delega
dados para serem obtidos ou processados pelos Models e seleciona o tipo correto de apresentao dos dados
para o qual o cliente est aceitando para finalmente delegar o trabalho de renderizao para a camada de
visualizao.
Entendendo o Model-View-Controller
39
Benefcios
Por que usar MVC? Porque um verdadeiro e testado padro de projeto de software que transforma uma
aplicao em pacotes de desenvolvimento rpido, de fcil manuteno e modular. Elaborar tarefas divididas entre models, views e controllers faz com que sua aplicao fique leve. Novas funcionalidades so
facilmente adicionadas e pode-se dar nova cara nas caractersticas antigas num piscar de olhos. O design
modular e separado tambm permite aos desenvolvedores e designers trabalharem simultaneamente, incluindo a capacidade de se construir um prottipo18 muito rapidamente. A separao tambm permite que
os desenvolvedores alterem uma parte da aplicao sem afetar outras.
18
40
http://en.wikipedia.org/wiki/Software_prototyping
Se voc nunca construiu uma aplicao desta forma, leva algum tempo para se acostumar, mas estamos
confiantes que uma vez que voc tenha construdo sua primeira aplicao usando CakePHP, voc no vai
querer fazer de outra maneira.
Para comear a sua primeira aplicao CakePHP, tente seguir o tutorial para a construo de um blog
O Cookbook
http://book.cakephp.org
Este manual dever ser provavelmente o primeiro lugar que voc v para obter respostas. Como acontece
com muitos outros projetos de cdigo aberto, temos novas pessoas regularmente. Tente primeiro dar o
seu melhor para responder s suas prprias perguntas. As respostas podem vir mais lentas, porem, sero
duradouras e tambm aliviar nossa demanda de suporte. Tanto o manual como a API podem ser consultadas
online.
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 logon
e 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 do
framework.
Casos de Testes
Se voc sentiu que a informao fornecida na API no suficiente, verifique o cdigo dos casos de testes
fornecido com o CakePHP. Eles podem servir como exemplos prticos de utilizao das funcionalidades de
uma classe:
Onde obter ajuda
41
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 desenvolvimento
est geralmente l, especialmente durante o dia para os usurios da Amrica do Norte e Sul. Adoraramos
ouvir de voc, se precisar de alguma ajuda, se quiser encontrar usurios por perto ou quiser doar seu novo
carro 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 encontrar
respostas arquivadas, perguntas frequentes, e obter respostas para problemas imediatos.
19
42
http://cakephp-fr.org
CAPTULO 4
Controllers
Os controllers correspondem ao C no padro MVC. Aps o roteamento ter sido aplicado e o controller
correto encontrado, a ao do controller chamada. Seu controller deve lidar com a interpretao dos dados
de uma requisio, certificando-se que os models corretos so chamados e a resposta ou view esperada seja
exibida. Os controllers podem ser vistos como intermedirios entre a camada Model e View. Voc vai querer
manter seus controllers magros e seus Models gordos. Isso lhe ajudar a reutilizar seu cdigo e test-los
mais facilmente.
Mais comumente, controllers so usados para gerenciar a lgica de um nico model. Por exemplo, se
voc est construindo um site para uma padaria online, voc pode ter um RecipesController e um
IngredientsController gerenciando suas receitas e seus ingredientes. No CakePHP, controllers so
nomeados de acordo com o model que manipulam. tambm absolutamente possvel ter controllers que
usam mais de um model.
Os controllers da sua aplicao so classes que estendem a classe CakePHP AppController, a qual
por sua vez estende a classe Controller do CakePHP. A classe AppController pode ser definida
em /app/Controller/AppController.php e deve conter mtodos que so compartilhados entre
todos os seus controllers.
Os controllers fornecem uma srie de mtodos que so chamados de aes. Aes so mtodos em um
controller que manipulam requisies. Por padro, todos os mtodos pblicos em um controller so aes e
acessveis por urls.
A Classe AppController
Como mencionado anteriormente, a classe AppController a me de todos os outros controllers da sua aplicao.
O prprio AppController estendida da classe Controller
que faz parte da biblioteca do CakePHP. Assim sendo, AppController definido em
/app/Controller/AppController.php como:
class AppController extends Controller {
}
43
Os atributos e mtodos criados em AppController vo estar disponveis para todos os controllers da sua
aplicao. Este o lugar ideal para criar cdigos que so comuns para todos os seus controllers. Componentes (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 tambm
faz 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 valores
do AppController so mescladas com os valores de seus controllers filhos. Os valores dos controllers
filhos 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 seu
AppController.
Tambm lembre de fazer as chamadas de callbacks do AppController nos controllers filhos para obter
melhores resultados:
function beforeFilter() {
parent::beforeFilter();
}
Parmetros de Requisio
Quando uma requisio feita para uma aplicao CakePHP, a classe Router e a classe Dispatcher
do Cake usa a routes-configuration para encontrar e criar o controller correto. Os dados da requisio so
encapsulados em um objeto de requisio. O CakePHP coloca todas as informaes importantes de uma
requisio na propriedade $this->request. Veja a seo Objetos de Requisio e Resposta para mais
informaes sobre o objeto de requisio do CakePHP.
Aes de Controllers
Retornando ao nosso exemplo da padaria online, nosso controller RecipesController
poderia 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
Para que voc use de forma eficaz os controllers em sua aplicao, ns iremos cobrir alguns dos atributos e
mtodos inclusos no controller fornecido pelo CakePHP.
45
O mtodo set() tambm aceita um array associativo como primeiro parmetro, podendo oferecer
uma forma rpida para atribuir uma srie de informaes para a view.
Alterado na verso 1.3: Chaves de arrays no sero mais flexionados antes de serem atribudas view
(underscored_key no se torna underscoredKey, etc.):
$data = array(
'color' => 'pink',
'type' => 'sugar',
'base_price' => 23.95
);
// Torna $color, $type e $base_price
// disponvel na view:
$this->set($data);
O atributo $pageTitle no existe mais, use o mtodo set() para definir o ttulo na view:
$this->set('title_for_layout', 'This is the page title');
?>
46
Captulo 4. Controllers
Embora o CakePHP ir chamar o mtodo render automaticamente (ao menos que voc altere o
atributo $this->autoRender para false) aps cada ao, voc pode us-lo para especificar um
arquivo view alternativo alterando o nome de ao no controller usando o parmetro $action.
Se o parmetro $action comear com / assumido que o arquivo view ou elemento que voc
queira usar relativo ao diretrio /app/View. Isto permite a renderizao direta de elementos,
muito til em chamadas Ajax.
// Renderiza o elemento presente em /View/Elements/ajaxreturn.ctp
$this->render('/Elements/ajaxreturn');
Voc tambm pode especificar uma arquivo view ou elemento usando o terceiro parmetro chamado
$file. O parmetro $layout permite voc especificar o layout em que a view ser inserido.
Renderizando Uma View Especfica
Em seu controller voc pode querer renderizar uma view diferente do que a conveno proporciona automaticamente. Voc pode fazer isso chamando o mtodo render() diretamente. Aps ter chamado o
mtodo render(), o CakePHP no ir tentar renderizar novamente a view:
class PostsController extends AppController {
function my_action() {
$this->render('custom_file');
}
}
ao
invs
de
Controle de Fluxo
Controller::redirect(mixed $url, integer $status, boolean $exit)
O mtodo de controle de fluxo que voc vai usar na maioria das vezes o redirect(). Este
mtodo recebe seu primeiro parmetro na forma de uma URL relativa do CakePHP. Quando um
usurio executou um pedido que altera dados no servidor, voc pode querer redirecion-lo para uma
outra tela de recepo.:
function place_order() {
// Logic for finalizing order goes here
if ($success) {
$this->redirect(array('controller' => 'orders', 'action' => 'thanks'));
} else {
$this->redirect(array('controller' => 'orders', 'action' => 'confirm'));
}
}
Nota: Voc pode aprender mais sobre a importncia de redirecionar o usurio aps um formulrio
do tipo POST no artigo Post/Redirect/Get (en)1 .
1
http://en.wikipedia.org/wiki/Post/Redirect/Get
47
Voc tambm pode usar uma URL relativa ou absoluta como argumento:
$this->redirect('/orders/thanks'));
$this->redirect('http://www.example.com');
O segundo parmetro passado no redirect() permite voc definir um cdigo de status HTTP para
acompanhar o redirecionamento. Voc pode querer usar o cdigo 301 (movido permanentemente) ou
303 (siga outro), dependendo da natureza do redirecionamento.
O mtodo vai assumir um exit() aps o redirecionamento ao menos que voc passe o terceiro
parmetro como false.
Se voc precisa redirecionar o usurio de volta para a pgina que fez a requisio, voc pode usar:
$this->redirect($this->referer());
Callbacks
Em adio ao Ciclo de Vida dos Callbacks em uma Requisio. O CakePHP tambm suporta callbacks
relacionados a scaffolding.
Controller::beforeScaffold($method)
$method o nome do mtodo chamado, por exemplo: index, edit, etc.
Controller::scaffoldError($method)
$method o nome do mtodo chamado, por exemplo: index, edit, etc.
Controller::afterScaffoldSave($method)
$method o nome do mtodo chamado, podendo ser: edit ou update.
Controller::afterScaffoldSaveError($method)
$method o nome do mtodo chamado, podendo ser: edit ou update.
48
Captulo 4. Controllers
49
atalho rpido no momento de construir operaes de busca. Por exemplo, um usurio administrativo pode querer pesquisar pedidos para saber quais itens precisaro ser enviados. Voc pode usar
o FormHelper do CakePHP para criar um formulrio de busca para o model Order. Assim, uma
ao de um controller pode usar os dados enviados deste formulrio e criar as condies de busca
necessrias para completar a tarefa:
function index() {
$conditions = $this->postConditions($this->request->data);
$orders = $this->Order->find('all', compact('conditions'));
$this->set('orders', $orders);
}
Se $this->request->data[Order][destination] for igual a Old Towne Bakery, o mtodo postConditions() converte esta condio em um array compatvel para o uso em
um mtodo Model->find(). Neste caso, array(Order.destination => Old Towne
Bakery).
Se voc quiser usar um operador diferente entre os termos, informe-os usando o segundo parmetro:
/*
Contedo do atributo $this->request->data
array(
'Order' => array(
'num_items' => '4',
'referrer' => 'Ye Olde'
)
)
*/
// Vamos pegar os pedidos que possuem no mnimo 4 itens e que contm 'Ye Olde'
$conditions = $this->postConditions(
$this->request->data,
array(
'num_items' => '>=',
'referrer' => 'LIKE'
)
);
$orders = $this->Order->find('all', compact('conditions'));
O terceiro parmetro permite voc dizer ao CakePHP qual operador SQL booleano usar entre as
condies de busca. Strings como AND, OR e XOR so todos valores vlidos.
Finalmente, se o ltimo parmetro for passado como true, e a varivel $op for um array, os campos
no inclusos em $op no sero retornados entre as condies.
Controller::paginate()
Este mtodo usado para fazer a paginao dos resultados retornados por seus models. Voc pode
especificar o tamanho da pgina (quantos resultados sero retornados), as condies de busca e outros
parmetros. Veja a seo pagination para mais detalhes sobre como usar o mtodo paginate()
Controller::requestAction(string $url, array $options)
Este mtodo chama uma ao de um controller de qualquer lugar e retorna os dados da ao requisitada. A $url passada uma URL relativa do Cake (/controller_name/action_name/params). Para
50
Captulo 4. Controllers
passar dados extras para serem recebidos pela ao do controller, adicione-os no parmetro options
em um formato de array.
Nota: Voc pode usar o requestAction() para recuperar uma view totalmente renderizada
passando return no array de opes: requestAction($url, array(return));.
importante notar que fazendo uma requisio usando return em um controller podem fazer com que
tags javascripts e css no funcionem corretamente.
Aviso: Se o mtodo requestAction() for usado sem fazer cache apropriado do resultado
obtido, a performance da ao pode ser bem ruim. raro o uso apropriado deste mtodo em um
controller ou model.
O uso do requestAction melhor usado em conjunto com elementos (cacheados) como uma
maneira de recuperar dados para um elemento antes de renderiz-los. Vamos usar o exemplo de por
o elemento ltimos comentrios no layout. Primeiro ns precisamos criar um mtodo no controller
que ir retornar os dados:
// Controller/CommentsController.php
class CommentsController extends AppController {
function latest() {
return $this->Comment->find('all', array('order' => 'Comment.created DESC', 'l
}
}
Ns podemos por este elemento em qualquer lugar para ter a sada usando:
echo $this->element('latest_comments');
Fazendo desta maneira, sempre que o elemento for renderizado, uma requisio ser feita para nosso
controller para pegar os dados, process-los e retorn-los. Porm, de acordo com o aviso acima,
melhor fazer uso de caching do elemento para evitar um processamento desnecessrio. Modificando
a chamada do elemento para se parecer com isto:
echo $this->element('latest_comments', array('cache' => '+1 hour'));
A chamada para o requestAction no ser feita enquanto o arquivo de cache do elemento existir
e for vlido.
Alm disso, o requestAction pode receber uma URL no formato de array do Cake:
echo $this->requestAction(
array('controller' => 'articles', 'action' => 'featured'),
51
array('return')
);
Nota: Diferente de outros lugares onde URLs no formato de arrays so anlogas as URLs no formato
de string, o requestAction tratam elas diferentemente.
Quando for usar URLs no formato de arrays em conjunto com o requestAction() voc deve especificar todos os parmetros que voc vai precisar na requisio da ao. Isto inclui parmetros como
$this->request->data. Alm disso, todos os parmetros requeridos, parmetros nomeados e
passados devem ser feitos no segundo array como visto acima.
Controller::loadModel(string $modelClass, mixed $id)
O mtodo loadModel vem a calhar quando voc precisa usar um model que no padro do controller ou o seu model no est associado com este.
$this->loadModel('Article');
$recentArticles = $this->Article->find('all', array('limit' => 5, 'order' => 'Article.
$this->loadModel('User', 2);
$user = $this->User->read();
Atributos do Controller
Para uma completa lista dos atributos dos controllers e suas descries, visite a API do CakePHP. Siga para
http://api20.cakephp.org/class/controller.
52
Captulo 4. Controllers
property Controller::$name
O atributo $name deve ser definido com o nome do controller. Normalmente apenas a forma plural
do nome do model principal que o controller usa. Esta propriedade no requerida mas salva o
CakePHP de ter que flexionar o nome do model para chegar no valor correto:
# Exemplo de uso do atributo $name do controller
class RecipesController extends AppController {
public $name = 'Recipes';
}
Cada uma destas variveis so mescladas com seus valores herdados, portanto, no necessrio (por
exemplo) redeclarar o FormHelper ou qualquer uma das classes que j foram declaradas no seu
Atributos do Controller
53
AppController.
property Controller::$components
O array de componentes permite que voc diga ao CakePHP quais Componentes um controller
ir usar. Como o $helpers e o $uses, $components so mesclados com os definidos no
AppController. E assim como nos $helpers, voc pode passar configuraes para os componentes. Veja Configurando Componentes para mais informaes.
Outros Atributos
Enquanto voc pode conferir todos os detalhes de todos os atributos dos controllers na API, existem outros
atributos dos controllers que merecem suas prprias sees neste manual.
property Controller::$cacheAction
O atributo $cacheAction usado para definir a durao e outras informaes sobre o cache completo de pginas. Voc pode ler mais sobre o caching completo de pginas na documentao do
CacheHelper.
property Controller::$paginate
O atributo $paginate uma propriedade de compatibilidade obsoleta. Usando este atributo, o
componente PaginatorComponent ser carregado e configurado, no entanto, recomendado atualizar seu cdigo para usar as configuraes normais de componentes:
class ArticlesController extends AppController {
public $components = array(
'Paginator' => array(
'Article' => array(
'conditions' => array('published' => 1)
)
)
);
}
CakeRequest
A classe CakeRequest o objeto padro para requisies usadas no CakePHP. Ela centraliza inmeras
funcionalidades para interagir com os dados das requisies.
54
Captulo 4. Controllers
A cada requisio feita, um CakeRequest criado e passado por referncia para as vrias camadas
de uma aplicao que usam os dados de uma requisio. Por padro, CakeRequest atribudo em
$this->request e disponibilizado nos controller, views e helpers. Voc pode tambm acess-la em
componentes usando a referncia do controller. Algumas das tarefas que o CakeRequest executa inclui:
Processar os arrays GET, POST e FILES na estrutura de dados que voc est familiarizado.
Fornecer a introspeco do ambiente pertencente a requisio. Coisas como cabealhos enviados,
endereo IP dos clientes e informaes de domnio/subdomnio sobre o servidor que a aplicao est
rodando.
Prover acesso aos parmetros da requisio pelo uso de arrays ou propriedades do objeto.
Acessando parmetros de uma Requisio
O CakeRequest expe vrias maneiras de acessar os parmetros de uma requisio. A primeira o acesso
por ndices de array, a segunda maneira pelo $this->request->params e a terceira por propriedades
do objeto:
$this->request['controller'];
$this->request->controller;
$this->request->params['controller']
Todas as alternativas acima iro acessar o mesmo valor. Foram criadas vrias maneiras de acessar os
parmetros para facilitar a migrao de aplicaes existentes que utilizam verses antigas do Cake. Todos os route-elements podem ser acessados por esta interface.
alm dos route-elements, muitas vezes voc precisar ter acesso aos passed-arguments e os namedparameters. Ambos estaro disponveis no objeto da classe CakeRequest:
// Argumentos passados
$this->request['pass'];
$this->request->pass;
$this->request->params['pass'];
// Parmetros nomeados
$this->request['named'];
$this->request->named;
$this->request->params['named'];
Todos iro lhe proporcionar o acesso aos argumentos passados e os parmetros nomeados. Existem diversos
parmetros que so importantes/teis que o CakePHP utiliza internamente e podem tambm ser encontrados
nos parmetros da requisio:
plugin O nome do plugin que trata a requisio. ser null quando no for nenhum plugin.
controller O nome do controller que trata a requisio corrente.
action A ao responsvel por manipular a requisio corrente.
prefix O prefixo da ao corrente. Veja prefix-routing para mais informaes.
bare Presente quando uma requisio chega por meio do mtodo requestAction() e inclui a
opo bare. Requisies despidas (bare) no possuem layouts.
Mais sobre Controllers
55
requested Presente e definida como true quando vindas de um uma chamada do mtodo
requestAction().
Acessando parmetros do tipo querystring
Parmetros do tipo query string presentes tipicamente em requisies do tipo GET podem ser lidos usando
CakeRequest::$query:
// Sendo a url /posts/index?page=1&sort=title
$this->request->query['page'];
// Voc tambm pode acessar o valor via array
$this->request['url']['page'];
voc pode acessar a propriedade data como tambm pode usar o mtodo CakeRequest::data() para
ler os dados do array de forma a evitar erros. Qualquer chave que no exista ir retornar o valor null.
Desta maneira no preciso verificar se a chave existe antes de us-la:
$foo = $this->request->data('Valor.que.nao.existe');
// $foo == null
Como alguns mtodos de desserializao requerem parmetros adicionais ao serem chamados, como a opo
as array da funo json_decode ou se voc quiser um XML convertido em um objeto DOMDocument,
o mtodo CakeRequest::input() tambm suporta a passagem de parmetros adicionais:
// Obtm dados codificados em XML submetidos por um mtodo PUT/POST
$data = $this->request->input('Xml::build', array('return' => 'domdocument'));
56
Captulo 4. Controllers
57
O
CakeRequest
tambm
inclui
mtodos
como
CakeRequest::domain(),
CakeRequest::subdomains() e CakeRequest::host() para ajudar em aplicaes que
utilizam subdomnios, tornando a vida um pouco mais fcil.
Existem vrios detectores inclusos no Cake que voc j pode usar:
is(get) Verifica se a requisio corrente do tipo GET.
is(put) Verifica se a requisio corrente do tipo PUT.
is(post) Verifica se a requisio corrente do tipo POST.
is(delete) Verifica se a requisio corrente do tipo DELETE.
is(head) Verifica se a requisio corrente do tipo HEAD.
is(options) Verifica se a requisio corrente do tipo OPTIONS.
is(ajax) Verifica se a requisio corrente acompanha o cabealho X-Requested-With = XMLHttpRequest.
is(ssl) Verifica se a requisio corrente via SSL.
is(flash) Verifica se a requisio foi feita por um objeto do Flash.
is(mobile) Verifica se a requisio veio de uma lista comum de dispositivos mveis.
CakeRequest e o RequestHandlerComponent
Como muitas das caracteristicas que o CakeRequest oferece eram de domnio do componente
RequestHandlerComponent, foi preciso repensar como esta se encaixa no quadro atual. Para o
CakePHP 2.0, a classe RequestHandlerComponent age como uma cereja em cima do bolo. Provendo
uma camada adicional de funcionalidades sobre o CakeRequest, como a mudana do layout baseado
no tipo de contedo ou chamadas em ajax. A separao destas duas classes permitem voc escolher mais
facilmente o que voc quer e precisa.
Interagindo com outros aspectos da requisio
Voc pode usar o CakeRequest para introspectar uma variedade de coisas sobre a requisio. Alm dos
detectores, voc tambm pode encontrar outras informaes vindas de vrias propriedades e mtodos.
$this->request->webroot contm o diretrio webroot (a raiz do diretrio web).
$this->request->base contm o caminho base.
$this->request->here contm a uri solicitada da requisio corrente.
$this->request->query contm os parmetros enviados por query strings.
API do CakeRequest
class CakeRequest
A classe CakeRequest encapsula o tratamento e introspeco dos parmetros das requisies.
58
Captulo 4. Controllers
CakeRequest::domain()
Retorna o nome do domnio onde sua aplicao esta sendo executada.
CakeRequest::subdomains()
Retorna os subdomnios de onde sua aplicao est sendo executada em um formato de array.
CakeRequest::host()
Retorna o host em que sua aplicao esta sendo executada.
CakeRequest::method()
Retorna o mtodo HTTP em que a requisio foi feita.
CakeRequest::referer()
Retorna o endereo que referenciou a requisio.
CakeRequest::clientIp()
Retorna o endereo IP do visitante corrente.
CakeRequest::header()
Permite voc acessar qualquer cabealho HTTP_* que tenha sido usado na requisio:
$this->request->header('User-Agent');
CakeRequest::is($check)
Verifica se uma requisio corresponde a um certo critrio. Utiliza os detectores inclusos por padro
alm das regras adicionadas com o mtodo CakeRequest::addDetector().
CakeRequest::addDetector($name, $callback)
Adiciona um detector para ser usado com o mtodo is(). Veja Inspecionando a Requisio para
mais informaes.
CakeRequest::accepts($type)
Descobre quais os tipos de contedo que o cliente aceita ou verifica se ele aceita um determinado tipo
de contedo.
Obtm todos os tipos:
Mais sobre Controllers
59
<?php
$this->request->accepts();
static CakeRequest::acceptLanguage($language)
Obter todas os idiomas aceitos pelo cliente ou verifica se um determinado idioma aceito.
Obtm uma lista dos idiomas aceitos:
CakeRequest::acceptLanguage();
property CakeRequest::$data
Um array de dados enviados pelo mtodo POST. Voc pode usar o mtodo
CakeRequest::data() para ler o contedo desta propriedade de uma forma a suprimir
avisos quando a chave informada no existir.
property CakeRequest::$query
Um array de parmetros passados por query strings.
property CakeRequest::$params
Um array contendo os elementos da rota e os parmetros da requisio.
property CakeRequest::$here
Contm a uri solicitada no momento da requisio.
property CakeRequest::$base
O caminho de base para a aplicao, geralmente equivale a /, ao menos que sua aplicao esteja em
um subdiretrio.
property CakeRequest::$webroot
O diretrio web de sua aplicao.
CakeResponse
O CakeResponse a classe padro para respostas no CakePHP. Ela encapsula inmeras caractersticas e funcionalidades para gerar respostas HTTP em sua aplicao. Ela tambm auxilia nos testes
da aplicao e pode ser forjada, permitindo inspecionar os cabealhos que sero enviados. Como
na classe CakeRequest, o CakeResponse consolida vrios mtodos encontrados previamente no
Controller, RequestHandlerComponent e Dispatcher. Os mtodos antigos foram depreciados, favorecendo o uso do CakeResponse.
CakeResponse fornece uma interface para envolver as tarefas comuns relacionadas ao envio de respostas
para o cliente como:
Enviar cabealhos de redirecionamento.
60
Captulo 4. Controllers
Normalmente voc vai querer mapear os tipos de contedo adicionais no callback beforeFilter do
seu controller, assim, se voc estiver usando o RequestHandlerComponent, poder tirar proveito da
funcionalidade de troca de views baseado no tipo do contedo.
Enviando Anexos
Poder existir momentos em que voc queira enviar respostas dos controllers como sendo arquivos para
downloads. Voc pode conseguir este resultado usando /views/media-view ou usando as funcionalidades do CakeResponse. O mtodo CakeResponse::download() permite voc enviar respostas
como arquivos para download:
function sendFile($id) {
$this->autoRender = false;
$file = $this->Attachment->getFile($id);
$this->response->type($file['type']);
$this->response->download($file['name']);
$this->response->body($file['content']);
$this->response->send();
}
61
O exemplo acima demonstra como voc pode utilizar o CakeResponse para gerar um arquivo para download sem precisar usar a classe MediaView. Em geral, voc vai preferir utilizar a classe MediaView por
possuir maiores funcionalidades que o CakeResponse.
Interagindo com o cache do navegador
Algumas vezes voc precisar forar o browser do cliente a no fazer cache dos resultados de uma ao de
um controller. CakeResponse::disableCache() destinado para estes casos.:
function index() {
// faz alguma coisa.
$this->response->disableCache();
}
Aviso: Usar o disableCache() para downloads em domnios SSL enquanto tenta enviar arquivos
para o Internet Explorer poder resultar em erros.
Voc tambm poder dizer ao cliente para fazer cache da resposta. Usando CakeResponse::cache():
function index() {
// faz alguma coisa.
$this->response->cache(time(), '+5 days');
}
O cdigo acima diz aos clientes para armazenar em cache a resposta resultante por cinco dias, podendo
acelerar a experincia dos seus visitantes.
Definindo Cabealhos
possvel definir cabealhos para a resposta utilizando o mtodo CakeResponse::header(). Podendo ser chamada de algumas formas diferentes:
// Define um nico cabealho
$this->response->header('Location', 'http://example.com');
Definir o mesmo cabealho mltiplas vezes ir causar a sobrescrita do valor anterior, como numa
chamada comum ao mtodo header() do PHP. Os cabealhos no sero enviados quando o mtodo
CakeResponse::header() for chamado. Os cabealhos so armazenados em buffer at que a resposta
seja efetivamente enviada.
CakeResponse e Testes
Provavelmente uma das grandes vitrias da classe CakeResponse vem de como ela torna mais fcil os
testes de controllers e componentes. Ao invs de mtodos espalhados em diversos objetos, voc precisa de
62
Captulo 4. Controllers
apenas um simples objeto para forjar e utilizar nos controllers e componentes. Isto lhe ajuda a criar seus
testes unitrios mais rapidamente:
function testSomething() {
$this->controller->response = $this->getMock('CakeResponse');
$this->controller->response->expects($this->once())->method('header');
...
}
Adicionalmente, voc consegue testar sua aplicao pela linha de comando mais facilmente pois consegue
forjar os cabealhos que quiser sem precisar ficar tentando definir os cabealhos diretos na interface de
linha de comandos.
API do CakeResponse
class CakeResponse
A classe CakeResponse fornece vrios mtodos teis para interagir com as respostas que voc
envia para um cliente.
CakeResponse::header()
Permite voc definir diretamente um ou muitos cabealhos para serem enviados com a resposta.
CakeResponse::charset()
Define o mapa de caracteres (charset) que ser usado na resposta.
CakeResponse::type($type)
Define o tipo de contedo para a resposta. Voc pode usar um apelido de um tipo conhecido de
contedo ou usar um nome completo para o tipo do contedo.
CakeResponse::cache()
Permite voc definir os cabealhos de cache em sua resposta.
CakeResponse::disableCache()
Define os cabealhos apropriados para desabilitar o cache da resposta pelo cliente.
CakeResponse::compress()
Habilita a compresso gzip para o envio da resposta.
CakeResponse::download()
Permite voc enviar a resposta como um anexo e definir o nome do arquivo.
CakeResponse::statusCode()
Permite voc alterar o cdigo do status da resposta.
CakeResponse::body()
Define o contedo do corpo da resposta que ser enviada.
CakeResponse::send()
Aps ter criado a resposta, chamar o mtodo send() ir enviar os todos cabealhos definidos
assim como o corpo da resposta. Isto feito automaticamente no final de cada requisio pelo
Dispatcher.
63
Scaffolding (arcabouos)
O recurso de scaffold de aplicaes uma tcnica que permite ao desenvolvedor definir e criar uma aplicao
bsica que possa inserir, selecionar, atualizar e excluir objetos. scaffold no CakePHP tambm possibilita que
os desenvolvedores definam como os objetos esto relacionados entre si alm de como criar e destruir estas
relaes.
Tudo o que necessrio para criar um scaffold um model e seu controller correspondente. Uma vez que
voc tiver definido o atributo $scaffold em seu controller, este estar pronto para funcionar. O scaffold
do CakePHP muito legal. Ele permite que voc tenha uma aplicao CRUD com tudo funcionando em
minutos. to legal que voc pode querer at us-lo em produo. Podemos at achar isto legal tambm,
mas por favor tenha em mente que scaffold ... ahn... apenas um arcabouo. O uso de scaffold poupa o
trabalho da criao da estrutura real para acelerar o incio de um projeto em etapas iniciais. Scaffold no tem
inteno de ser completamente flexvel, mas sim um jeito temporrio de fazer as coisas funcionarem com
brevidade. Se voc se vir numa situao de querer personalizar a lgica e suas views, hora de deixar de
usar o recurso de scaffold e escrever o cdigo de fato. A ferramenta de linha de comando Bake do CakePHP,
abordado na prxima seo um grande passo frente: Ele gera todo o cdigo que voc deve precisar para
produzir o mesmo resultado que teria atualmente com o scaffold.
Scaffold uma excelente maneira de iniciar o desenvolvimento de partes prematuras da sua aplicao web.
Primeiras verses de esquemas de bases de dados tendem a sofrer mudanas, o que algo perfeitamente normal nas etapas iniciais do projeto da aplicao. Isto tem um lado negativo: Um desenvolvedor web detesta
criar formulrios que nunca viro a ser efetivamente usados. Para minimizar o esforo do desenvolvedor, o
recurso de scaffold foi includo no CakePHP. O scaffold analisa as tabelas de sua base de dados e cria uma
listagem padronizada com botes de insero, edio e excluso, formulrios padronizados para edio e
views padronizadas para visualizao de um nico registro da base de dados.
Para adicionar o recurso de scaffold sua aplicao, no controller, adicione o atributo $scaffold:
class CategoriesController extends AppController {
public $scaffold;
}
Assumindo que voc tenha criado um arquivo com a classe model mais bsica para o Category (em
/app/Model/Category.php), as coisas j estaro prontas. Acesse http://example.com/categories para
ver sua nova aplicao com scaffold.
Nota: Criar mtodos em controllers que possuam definies de scaffold pode causar resultados indesejados.
Por exemplo, se voc criar um mtodo index() em um controller com scaffold, seu mtodo index ser
renderizado no lugar da funcionalidade do scaffold.
O scaffold tem conhecimento sobre as associaes de models, ento se seu model Category possuir uma
referncia a (belongsTo) User, voc ver os IDs dos usurios relacionados na listagem de Category.
Enquanto o scaffold sabe como tratar os relacionamentos entre models, voc no ver nenhum registro
relacionado nas views do scaffold at que voc tenha adicionado manualmente as relaes entre os models.
Por exemplo, se Group hasMany (possui muitos) User e User belongsTo (pertence ) Group, voc
precisa adicionar manualmente o cdigo necessrio a seguir nos seus models User e Group. Antes de
voc adicionar o cdigo a seguir, a view mostrar uma tag select vazia para Group no formulrio de adio
do model User. Aps voc adicionar o cdigo, a view ir mostrar uma tag select populada com os IDs ou
nomes vindos da tabela groups no formulrio de adio de User.
64
Captulo 4. Controllers
// Em Group.php
public $hasMany = 'User';
// Em User.php
public $belongsTo = 'Group';
Se voc preferir ver algo alm do ID (como o primeiro nome dos usurios), voc pode alterar o valor do
atributo $displayField no model. Vamos ver o $displayField na nossa classe User de forma que
os usurios relacionados com categorias sejam mostrados pelo primeiro nome ao invs de apenas o ID. Em
muitos casos, este recurso torna o scaffold mais legvel.
class User extends AppModel {
public $name = 'User';
public $displayField = 'first_name';
}
Esta uma forma fcil de criar uma interface de administrao simples rapidamente. Tenha em mente que
voc no pode ter ambos os mtodos de scaffold, um para admin e outro para no-admin ao mesmo tempo.
Assim como em um scaffold normal voc pode sobrescrever um mtodo individual com seu prprio cdigo:
function admin_view($id = null) {
// cdigo customizado aqui
}
Uma vez que voc tenha substitudo uma ao de scaffold voc tambm precisar criar um arquivo de view
para a ao.
Customizando as Views de Scaffold
Se voc quiser uma view de scaffold um pouco diferente, voc pode criar templates. Continuamos a no
recomendar o uso desta tcnica para aplicaes em produo, mas tal customizao pode ser til durante o
perodo de prototipao.
65
Views de scaffold customizadas para todos os controllers devem ser criadas desta maneira:
/app/View/Scaffolds/index.ctp
/app/View/Scaffolds/form.ctp
/app/View/Scaffolds/view.ctp
O Controller Pages
O
CakePHP
j
vem
com
um
controller
padro
chamado
PagesController
(lib/Cake/Controller/PagesController.php). A pgina inicial que voc v logo aps
a instalao gerada usando este controller. Este controller geralmente usado para servir pginas
estticas. Ex. Se voc fez uma view app/View/Pages/sobre_nos.ctp, voc pode acess-la usando
a seguinte URL http://example.com/pages/sobre_nos
Quando voc constri uma aplicao utilizando o console bake o controller Pages copiado para seu
diretrio app/Controller/ e voc pode modific-lo se for preciso. Ou voc pode fazer uma cpia do arquivo
PagesController.php da pasta lib/Cake para seu diretrio app/Controller/ existente.
Aviso: No modifique nenhum arquivo dentro do diretrio Cake diretamente para evitar problemas
futuros quando for atualizar o ncleo do framework CakePHP.
Componentes
Componentes (components) so pacotes com funes lgicas que so usadas para serem compartilhadas
entre os controllers. Se voc est querendo copiar e colar coisas entre seus controllers, talvez seja uma boa
ideia considerar a possibilidade de empacotar estas funcionalidades em componentes.
O CakePHP tambm j vem com uma quantidade fantstica de componentes includos, que voc pode usar
para lhe ajudar com:
Segurana
Sesses
Lista de Controle de Acesso (do ingls ACL, Access control lists)
Emails
Cookies
Autenticao
66
Captulo 4. Controllers
Tratamento de Requisies
Cada um destes componentes do Cake so detalhados em seus prprios captulos. Neste momento, ns
lhe mostraremos como criar e usar seus prprios componentes. Criar componentes mantem o cdigo dos
controllers limpos e permitem a reutilizao de cdigos entre projetos.
Configurando Componentes
Muitos dos componentes includos no Cake requerem alguma configurao. Exemplos de componentes que requerem configurao so: /core-libraries/components/authentication,
/core-libraries/components/cookie e /core-libraries/components/email. As
configuraes para estes componentes, e outros em geral, so feitas no array $components ou no mtodo
beforeFilter() do seu controller:
class PostsController extends AppController {
public $components = array(
'Auth' => array(
'authorize' => array('controller'),
'loginAction' => array('controller' => 'users', 'action' => 'login')
),
'Cookie' => array('name' => 'CookieMonster')
);
O exemplo acima seria um exemplo de como configurar um componente usando o array $components.
Todos os componentes includos no Cake permitem ser configurados desta forma. Alm disso, voc pode
configurar componentes no mtodo beforeFilter() de seus controllers. Isto til quando voc precisa
atribuir os resultados de uma funo para uma propriedade do componente. O exemplo acima tambm pode
ser expressado da seguinte maneira:
public function beforeFilter() {
$this->Auth->authorize = array('controller');
$this->Auth->loginAction = array('controller' => 'users', 'action' => 'login');
$this->Cookie->name = 'CookieMonster';
}
possvel, no entanto, que um componente requeira que certa configurao seja feita antes do mtodo
beforeFilter() do controller ser executado. Para este fim, alguns componentes permitem que configuraes sejam feitas no array $components:
Consulte a documentao relevante para determinar quais opes de configurao cada componente oferece.
Usando Componentes
Aps ter includo alguns componentes em seu controller, us-los muito simples. Cada componente que
voc usa exposto como uma propriedade em seu controller. Se voc carregou o SessionComponent e
o CookieComponent no seu controller, voc pode acess-los da seguinte maneira:
67
Nota: Como os models e componentes so adicionados no controller como propriedades eles compartilham
o mesmo espao de nomes (namespace). Tenha certeza de no ter um componente e um model com o
mesmo nome.
Voc pode no precisar de todos os componentes disponibilizados em cada ao dos controllers. Nestas situaes voc pode carregar um componente em tempo de execuo usando o Component Collection.
Dentro de um controller voc pode fazer o seguinte:
$this->OneTimer = $this->Components->load('OneTimer');
$this->OneTimer->getTime();
Callbacks de Componentes
Componentes tambm oferecem alguns callbacks do ciclo de vida de uma requisio, permitindo acrescentar
rotinas ao fluxo. Veja a API dos Componentes para mais informaes sobre os callbacks que os componentes
oferecem.
Criando um Componente
Suponhamos que nossa aplicao online precisa realizar uma operao matemtica complexa em diferentes
partes da aplicao. Podemos criar um componente para abrigar esta lgica para ser usada nos diferentes
controllers.
O primeiro passo criar um novo arquivo para a classe do componente. Crie o arquivo em
/app/Controller/Component/MathComponent.php. A estrutura bsica para o componente ir
se parecer com algo assim:
class MathComponent extends Component {
function doComplexOperation($amount1, $amount2) {
return $amount1 + $amount2;
}
}
Nota: Todos os componentes devem estender a classe Component. Se no fizer isto, o Cake ir disparar
uma exceo.
68
Captulo 4. Controllers
Aps nosso componente estiver pronto, podemos us-lo nos controllers da nossa aplicao pondo o nome
do componente (sem o sufixo Component) no array $components do controller. O controller ir receber um novo atributo com o mesmo nome do componente, o qual poderemos acess-lo como sendo uma
instncia da classe componente que queremos.
/* Torna o novo componente acessvel em $this->Math,
bem como o $this->Session */
public $components = array('Math', 'Session');
s vezes, um de seus componentes poder precisar usar outro componente. Neste caso voc pode incluir
outros componentes no seu da mesma forma que inclui em controllers, usando o atributo $components:
// app/Controller/Component/CustomComponent.php
class CustomComponent extends Component {
// O outro componente que seu componente utiliza
public $components = array('Existing');
function initialize(Controller $controller) {
$this->Existing->foo();
}
function bar() {
// ...
}
}
69
// app/Controller/Component/ExistingComponent.php
class ExistingComponent extends Component {
function initialize(Controller $controller) {
$this->Parent->bar();
}
function foo() {
// ...
}
}
Component::initialize($controller)
O mtodo initialize chamado antes do mtodo beforeFilter do controller.
Component::startup($controller)
O mtodo startup chamado aps o mtodo beforeFilter do controller mas antes que o
controller execute a ao.
Component::beforeRender($controller)
O mtodo beforeRender chamado aps o controller executar a lgica da ao requisitada mas
antes que o controller renderize a view e o layout.
Component::shutdown($controller)
O mtodo shutdown chamado antes que o contedo seja enviado para o browser.
Component::beforeRedirect($controller, $url, $status=null, $exit=true)
O mtodo beforeRedirect invocado quando o mtodo redirect de um controller chamado
mas antes de qualquer ao. Se este mtodo retornar false o controller no ir continuar com o
redirecionamento. As variveis $url, $status e $exit possuem o mesmo significado do mtodo
do controller. Voc pode tambm retornar uma string que ser interpretada como uma URL para ser
usada no redirecionamento ou retornar um array associativo com a chave url e opcionalmente com
a chave status e a chave exit.
70
Captulo 4. Controllers
CAPTULO 5
Views
Views (ou Vises) so o V do MVC. Views so responsveis por gerar a sada de dados especfica para
uma determinada requisio. Geralmente esta sada apresentada na forma de HTML, XML ou JSON. No
entanto, disponibilizar arquivos atravs de streaming (fluxo de informao, geralmente multimdia, atravs
de pacotes) ou criar PDFs, que podem ser baixados, tambm so de responsabilidade da Camada View.
O CakePHP traz incluso vrias classes do tipo View para lidar com os cenrios mais comuns de renderizao:
Para criar webservices em XML ou JSON, voc pode usar o views/json-and-xml-views
Para prover arquivos protegidos ou arquivos criados dinamicamente,
views/media-view
Para criar mltiplos temas para as vises, voc pode usar views/themes
View Templates
Em CakePHP, voc fala com seus usurios atravs da camada view (viso). Na maior parte do tempo, suas
views exibiro documentos (X)HTML nos navegadores, mas voc pode tambm precisar prover dados AMF
para um objeto em Flash, responder a uma aplicao remota via SOAP ou gerar um arquivo CSV para um
usurio.
Por padro, no CakePHP os arquivos do tipo view so escritos em PHP comum e possuem a extenso .ctp
(CakePHP Template). Estes arquivos contm toda a lgica de apresentao necessria para transformar os
dados recebidos do controller em um formato pronto para o pblico. Caso voc prefira usar uma linguagem
de template como Twig ou Smarty, uma subclasse da View ir fazer uma ponte entre sua linguagem de
template e o CakePHP.
Arquivos do tipo view so guardados em /app/View/, dentro do diretrio com o nome do controller
que usa os arquivos e nomeado de acordo com a ao correspondente. Por exemplo, a ao view() do
controller Products ser normalmente encontrada em /app/View/Products/view.ctp.
A camada view no CakePHP pode ser composta de diferentes partes. Cada parte tem diferentes usos e sero
cobertas em sees especficas:
71
views: views a nica parte da pgina que est em execuo. Compem a parte crucial da resposta
da aplicao.
elements: pedaos de cdigo pequenos e reutilizveis. Elements geralmente so renderizados dentro
de views.
layouts: arquivos da view contendo cdigo de apresentao que envolve vrias interfaces da aplicao.
A maior parte dos arquivos views renderizada dentro de um layout.
helpers: essas classes encapsulam lgica da view que seja necessria em vrios lugares na camada
view. Helpers no CakePHP podem ajud-lo a construir formulrios, construir funcionalidade AJAX,
paginar dados do model, prover feeds RSS, dentre outras coisas.
Estendendo Views
Novo na verso 2.1.
A extenso de uma View permite que voc inclua uma view dentro de outra. Combinando isto com view
blocks voc tem uma maneira poderosa para deixar suas views DRY (enxutas). Por exemplo, sua aplicao
tem uma barra lateral (sidebar) que precisa mudar a depender de quando uma view especfica renderizada.
Estendendo um mesmo arquivo de view, voc pode evitar repeties de marcaes em comum e apenas
definir as que mudam:
// app/View/Common/view.ctp
<h1><?php echo $this->fetch('title'); ?></h1>
<?php echo $this->fetch('content'); ?>
<div class="actions">
<h3>Related actions</h3>
<ul>
<?php echo $this->fetch('sidebar'); ?>
</ul>
</div>
O arquivo de view acima pode ser usado como uma view pai. Esta espera que a view que a estende defina os
blocos sidebar e title. O bloco content um bloco especial que o CakePHP cria. Ele conter todo
o contedo no-capturado da view que a estende. Considerando que nosso arquivo view tem uma varivel
$post com informao sobre nosso post, nossa view poder parecer como:
<?php
// app/View/Posts/view.ctp
$this->extend('/Common/view');
$this->assign('title', $post)
$this->start('sidebar');
?>
<li>
echo $this->Html->link('edit', array(
'action' => 'edit',
$post['Post']['id']
)); ?>
</li>
72
Captulo 5. Views
A view de post acima mostra como voc pode estender uma view e preenche-la com um conjunto de blocos.
Qualquer contedo que no estiver definido em um bloco ser capturado e colocado em um bloco especial
chamado content. Quando uma view contm uma chamada para extend(), a execuo continua at o
fim do arquivo view atual. Uma vez finalizada, a view estendida ser renderizada. Chamar extend() mais
de uma vez em um arquivo view ir sobrescrever a view pai que ser processada em seguida:
$this->extend('/Common/view');
$this->extend('/Common/index');
O trecho acima resultar em /Common/index.ctp sendo renderizada como a view pai para a view atual.
Voc pode aninhar views estendidas quantas vezes forem necessrias. Cada view pode estender outra view
se quiser. Cada view pai pegar o contedo da view anterior como o bloco content.
Nota: Voc deve evitar o uso de content como o nome de um bloco em sua aplicao. CakePHP usa
este nome em views estendidas para contedos no-capturados.
O mtodo
73
Nota: Voc deve evitar o uso de content como o nome de um bloco em sua aplicao. CakePHP usa
este nome em views estendidas para contedos no-capturados .
Exibindo blocos
Novo na verso 2.1.
Voc pode exibir blocos usando o mtodo fetch(). fetch() ir retornar um bloco de maneira segura,
retornando se o bloco no existir:
echo $this->fetch('sidebar');
Voc tambm pode usar o fetch para exibir condicionalmente um contedo que deve envolver um bloco que
deveria existir. Isto til em layouts ou views estendidas, nas quais voc queira mostrar cabealhos e outras
marcaes condicionalmente:
// em app/View/Layouts/default.ctp
<?php if ($this->fetch('menu')): ?>
<div class="menu">
<h3>Menu options</h3>
<?php echo $this->fetch('menu'); ?>
</div>
<?php endif; ?>
74
Captulo 5. Views
</head>
// o resto do layout continua
A HtmlHelper tambm permite voc controlar para que bloco os scripts e CSS vo:
// na sua view
$this->Html->script('carousel', array('block' => 'scriptBottom'));
// no seu layout
echo $this->fetch('scriptBottom');
Layouts
Um layout contem o cdigo de apresentao que envolve uma view. Qualquer coisa que voc queira ver em
todas as suas views deve ser colocada em um layout.
Arquivos de layouts devem ser colocados em /app/View/Layouts. O layout padro do CakePHP pode
ser sobrescrito criando um novo layout padro em /app/View/Layouts/default.ctp. Uma vez
que um novo layout padro tenha sido criado, o cdigo da view renderizado pelo controller colocado
dentro do layout padro quando a pgina renderizada.
Quando voc cria um layout, voc precisa dizer ao CakePHP onde colocar o cdigo de suas views. Para isso,
garanta que o seu layout inclui um lugar para $this->fetch(content). A seguir, um exemplo de
como um layout padro deve parecer:
<!DOCTYPE html>
<html lang="en">
<head>
<title><?php echo $title_for_layout?></title>
<link rel="shortcut icon" href="favicon.ico" type="image/x-icon">
<!-- Incluir arquivos extenos e scripts aqui (Ver o helper HTML para mais detalhes) -->
echo $this->fetch('meta');
echo $this->fetch('css');
echo $this->fetch('script');
?>
</head>
<body>
<!-- Se voc quiser exibir algum menu
em todas as suas views, inclua-o aqui -->
<div id="header">
<div id="menu">...</div>
</div>
<!-- Aqui onde eu quero que minhas views sejam exibidas -->
<?php echo $this->fetch('content'); ?>
<!-- Adicionar um rodap para cada pgina exibida -->
<div id="footer">...</div>
Layouts
75
</body>
</html>
Voc pode criar quantos layouts voc desejar: apenas coloque-os no diretrio app/View/Layouts, e
defina qual deles usar dentro das aes do seu controller usando a propriedade $layout do controller ou
view:
// de um controller
public function admin_view() {
// cdigos
$this->layout = 'admin';
}
// de um arquivo view
$this->layout = 'loggedin';
Por exemplo, se a seo do meu site incluir um pequeno espao para banner, eu posso criar um novo layout
com um pequeno espao para propaganda e especific-lo como layout para as aes de todos os controllers
usando algo como:
class UsersController extends AppController {
public function view_active() {
$this->set('title_for_layout', 'View Active Users');
76
Captulo 5. Views
$this->layout = 'default_small_ad';
}
public function view_image() {
$this->layout = 'image';
//output user image
}
}
O CakePHP tem em seu ncleo, dois layouts (alm do layout padro) que voc pode usar em suas prprias
aplicaes: ajax e flash. O layout Ajax til para elaborar respostas Ajax - um layout vazio (a maior
parte das chamadas ajax requer pouca marcao de retorno, preferencialmente a uma interface totalmente
renderizada). O layout flash usado para mensagens mostradas pelo mtodo Controller::flash().
Outros trs layouts, XML, JS, e RSS, existem no ncleo como um modo rpido e fcil de servir contedo
que no seja text/html.
Elements
Muitas aplicaes possuem pequenos blocos de cdigo de apresentao que precisam ser repetidos a cada
pgina, s vezes em diferentes lugares no layout. O CakePHP ajuda voc a repetir partes do seu website
que precisam ser reutilizados. Estas partes reutilizveis so chamadas de Elements (ou Elementos). Propagandas, caixas de ajuda, controles de navegao, menus extras, formulrios de login e chamadas geralmente
so implementadas como elements. Um element bsicamente uma mini-view que pode ser includa em
outras views, layouts e at mesmo em outros elements. Elements podem ser usados para criar uma view mais
legvel, colocando o processamento de elementos repetidos em seu prprio arquivo. Eles tambm podem
ajud-lo a re-usar contedos fragmentados pela sua aplicao.
Elements so colocados na pasta /app/View/Elements/ e possuem a extenso .ctp no nome do arquivo.
Eles so exibidos atravs do uso do mtodo element da view:
echo $this->element('helpbox');
Elements
77
Dentro do arquivo do element, todas as variveis passadas esto disponveis como membros do array
de parmetros (da mesma forma que Controller::set() no controller trabalha com arquivos de
views). No exemplo acima, o arquivo /app/View/Elements/helpbox.ctp pode usar a varivel
$helptext:
// Dentro de app/View/Elements/helpbox.ctp
echo $helptext; //outputs "Oh, este texto muito til."
O mtodo View::element() tambm suporta opes para o element. As opes suportadas so cache
e callbacks. Um exemplo:
echo $this->element('helpbox', array(
"helptext" => "Isto passado para o *element * como $helptext",
"foobar" => "TIsto passado para o *element * como $foobar",
),
array(
"cache" => "long_view", // usa a configurao de cache "long_view"
"callbacks" => true // atribue verdadeiro para ter before/afterRender chamado pelo
)
);
O cache de element facilitado atravs da classe Cache. Voc pode configurar elements para serem guardados em qualquer configurao de cache que voc tenha definido. Isto permite uma maior flexibilidade para
decidir onde e por quantos elements so guardados. Para fazer o cache de diferentes verses de um mesmo
element em uma aplicao, defina uma nica chave de cache usando o seguinte formato:
$this->element('helpbox', array(), array(
"cache" => array('config' => 'short', 'key' => 'unique value')
)
);
Voc pode tirar vantagem de elements usando requestAction(). A funo requestAction() carrega variveis da views a partir de aes do controller e as retorna como um array. Isto habilita seus elements
para atuar verdadeiramente no estilo MVC. Crie uma ao de controller que prepara as variveis da view
para seu element, depois chame requestAction() no segundo parmetro do element() para carregar
as variveis da view a partir do seu controller.
Para isto, em seu controller, adicione algo como segue, como exemplo de Post:
class PostsController extends AppController {
// ...
public function index() {
$posts = $this->paginate();
if ($this->request->is('requested')) {
return $posts;
78
Captulo 5. Views
} else {
$this->set('posts', $posts);
}
}
}
Em seguida, no element, voc poder acessar os modelos de posts paginados. Para obter os ltimos cinco
posts em uma lista ordenada, voc pode fazer algo como:
<h2>Latest Posts</h2>
<?php $posts = $this->requestAction('posts/index/sort:created/direction:asc/limit:5'); ?>
<?php foreach ($posts as $post): ?>
<ol>
<li><?php echo $post['Post']['title']; ?></li>
</ol>
<?php endforeach; ?>
Caching Elements
Voc pode tomar proveito do CakePHP view caching, se voc fornecer um parmetro de cache. Se definido
como true, o element ser guardado na configurao de cache default. Caso contrrio, voc poder definir
qual configurao de cache deve ser usada. Veja /core-libraries/caching para mais informaes
de configurao Cache. Um exemplo simples de caching um element seria:
echo $this->element('helpbox', array(), array('cache' => true));
Se voc renderiza o mesmo element mais que uma vez em uma view e tem caching ativado, esteja certo
de definir o parmetro chave (key) para um nome diferente cada vez. Isto ir prevenir que cada chamada
sucessiva substitua o resultado armazenado da chamada element() anterior. E.g.:
echo $this->element(
'helpbox',
array('var' => $var),
array('cache' => array('key' => 'first_use', 'config' => 'view_long')
);
echo $this->element(
'helpbox',
array('var' => $differenVar),
array('cache' => array('key' => 'second_use', 'config' => 'view_long')
);
O cdigo acima garante que ambos os resultados do element sero armazenados separadamente. Se voc
quiser que todos os elementos armazenados usem a mesma configurao de cache, voc pode salvar alguma repetio, setando View::$elementCache para a configurao de cache que voc quer usar. O
CakePHP usar esta configurao, quando nenhuma outra for dada.
Elements
79
2.1
Se voc est usando um plugin e deseja usar elements de dentro deste plugin apenas use plugin syntax.
Se a view est renderizando para um controller/action de plugin, o nome do plugin ser automaticamente
prefixado antes de todos os elements usados, ao menos que outro nome de plugin esteja presente. Se o
element no existir no plugin, ser procurado na pasta principal da APP.:
echo $this->element('Contacts.helpbox');
Se sua view parte de um plugin voc pode omitir o nome do plugin. Por exemplo, se voc est no
ContactsController do plugin Contatos:
echo $this->element('helpbox');
// and
echo $this->element('Contacts.helpbox');
View API
class View
Mtodos de Views so acessveis por todas as views, elements e arquivos de layout. Para chamar qualquer
mtodo de uma view use $this->method().
View::set(string $var, mixed $value)
Views tm mtodos set() que so anlogos aos set() encontrados nos objetos controllers. Usando
set() em seu arquivo view sero adicionados variveis para layouts e elements que sero renderizados
posteriormente. Veja Mtodos dos Controllers para maiores informaes de como usar o set().
No seu arquivo de view, voc pode:
$this->set('activeMenuButton', 'posts');
Assim em seu layout a varivel $activeMenuButton estar disponvel e conter o valor posts.
View::getVar(string $var)
Obtem o valor de viewVar com o nome $var
80
Captulo 5. Views
View::getVars()
Obtem uma lista de todas as variveis disponveis da view, no escopo renderizado corrente. Retorna
um array com os nomes das variveis.
View::element(string $elementPath, array $data, array $options = array())
Renderiza um elemento ou parte de uma view. Veja a seo Elements para maiores informaes e
exemplos.
View::uuid(string $object, mixed $url)
Gera um DOM ID no randmico nico para um objeto, baseado no tipo do objeto e url. Este
mtodo frequentemente usado por helpers que precisam gerar DOM ID nicos para elementos como
JsHelper:
$uuid = $this->uuid('form', array('controller' => 'posts', 'action' => 'index'));
//$uuid contains 'form0425fe3bad'
81
82
Captulo 5. Views
CAPTULO 6
Plugins
CakePHP permite que voc defina uma combinao de controllers, models, e views e lance-os como um
pacote de aplicao que outras pessoas podem usar em suas aplicaes CakePHP. Voc quer ter um mdulo
de gesto de usurios, um blog simples, ou um mdulo de servios web em uma das suas aplicaes?
Empacote-os como um plugin do CakePHP para que voc possa coloc-lo em outras aplicaes.
A principal diferena entre um plugin e a aplicao em que ele instalado, a configurao da aplicao
(base de dados, conexo, etc.). Caso contrrio, ele opera em seu prprio espao, comportando-se como se
fosse uma aplicao por conta prpria.
Instalando um Plugin
Para instalar um plugin, basta simplesmente colocar a pasta plugin dentro do diretrio app/Plugin. Se voc
est instalando um plugin chamado ContactManager, ento voc deve ter uma pasta dentro de app/Plugin
chamado ContactManager em que podem estar os diretrios de plugin: View, Model, Controller, webroot,
e qualquer outro diretrio.
Novo para CakePHP 2.0, plugins precisam ser carregados manualmente em app/Config/bootstrap.php.
Voc pode carreg-los um por um ou todos eles em uma nica chamada:
CakePlugin::loadAll(); // Carrega todos os plugins de uma vez
CakePlugin::load('ContactManager'); // Carrega um nico plugin
loadAll carrega todos os plugins disponveis, enquanto permite que voc defina certas configuraes para
plugins especficos. load() funciona de maneira semelhante, mas carrega somente os plugins que voc
especificar explicitamente.
H uma poro de coisas que voc pode fazer com os mtodos load e loadAll para ajudar com a configurao do plugin e roteamento. Talvez voc tenha que carregar todos os plugins automaticamente, enquanto
especifica rotas personalizadas e arquivos de bootstrap para certos plugins.
Sem problema:
83
CakePlugin::loadAll(array(
'Blog' => array('routes' => true),
'ContactManager' => array('bootstrap' => true),
'WebmasterTools' => array('bootstrap' => true, 'routes' => true),
));
Com este estilo de configurao, voc no precisa mais fazer manualmente um include() ou require() de
arquivo de configurao do plugin ou rotas acontece automaticamente no lugar e na hora certa. Os exatos
mesmos parmetros tambm poderiam ter sido fornecidos ao mtodo load(), o que teria carregado apenas
aqueles trs plugins, e no o resto.
Finalmente, voc pode especificar tambm um conjunto de padres para loadAll que se aplicar a cada
plugin que no tem uma configurao mais especfica.
Carrega o arquivo bootstrap de todos os plugins, e as rotas do plugin Blog:
CakePlugin::loadAll(array(
array('bootstrap' => true),
'Blog' => array('routes' => true)
));
Note que todos os arquivos especificados devem realmente existir no plugin(s) configurado ou o PHP ir dar
avisos (warnings) para cada arquivo que no pde carregar. Isto especialmente importante para lembrar ao
especificar padres para todos os plugins.
Alguns plugins precisam que seja criado uma ou mais tabelas em sua base de dados. Nesses casos, muitas
vezes eles vo incluir um arquivo de esquema que voc pode chamar a partir do cake shell dessa forma:
user@host$ cake schema create --plugin ContactManager
A maioria dos plugins indicar o procedimento adequado para a configur-los e configurar a base de dados,
em sua documentao. Alguns plugins iro exigir mais configuraes do que outros.
Usando um Plugin
Voc pode referenciar controllers, models, components, behaviors, e helpers de um plugin, prefixando o
nome do plugin antes do nome da classe.
Por exemplo, digamos que voc queira usar o ContactInfoHelper do plugin CantactManager para a sada de
algumas informaes de contato em uma de suas views. Em seu controller, seu array $helpers poderia ser
assim:
public $helpers = array('ContactManager.ContactInfo');
Voc ento ser capaz de acessar o ContactInfoHelper como qualquer outro helper em sua view, tal como:
echo $this->ContactInfo->address($contact);
84
Captulo 6. Plugins
Note o nome da pasta do plugin, ContactManager. importante que essa pasta tenha o mesmo nome do
plugin.
Dentro da pasta do plugin, voc ver que se parece muito com uma aplicao CakePHP, e que basicamente
isso mesmo. Voc realmente no tem que incluir qualquer uma dessas pastas se voc no for us-las.
Alguns plugins podem definir somente um Component e um Behavior, e nesse caso eles podem omitir
completamente o diretrio View.
Um plugin pode tambm ter basicamente qualquer um dos outros diretrios que sua aplicao pode, como
Config, Console, Lib, webroot, etc.
Nota: Se voc quer ser capaz de acessar seu plugin com uma URL, necessrio definir um AppController e AppModel para o plugin. Estas duas classes especiais so nomeadas aps o plugin, e estendem
AppController e AppModel da aplicao pai. Aqui est o que deve ser semelhante para nosso exemplo
ContactManager:
// /app/Plugin/ContactManager/Controller/ContactManagerAppController.php:
class ContactManagerAppController extends AppController {
}
// /app/Plugin/ContactManager/Model/ContactManagerAppModel.php:
class ContactManagerAppModel extends AppModel {
}
Se voc se esqueceu de definir estas classes especiais, o CakePHP ir entregar a voc erros Missing Controller at que voc tenha feito isso.
Por favor, note que o processo de criao de plugins pode ser muito simplificado usando o Cake shell.
Para assar um plugin por favor use o seguinte comando:
user@host$ cake bake plugin ContactManager
Agora voc pode assar usando as mesmas convenes que se aplicam ao resto de sua aplicao. Por exemplo
- assando controllers:
85
Plugin Controllers
Controllers
de
nosso
plugin
ContactManager
sero
armazenados
em
/app/Plugin/ContactManager/Controller/. Como a principal coisa que vamos fazer a gesto de contatos, vamos precisar de um ContactsController para este plugin.
Ento, ns colocamos nosso novo ContactsController em /app/Plugin/ContactManager/Controller e deve se
parecer com isso:
// app/Plugin/ContactManager/Controller/ContactsController.php
class ContactsController extends ContactManagerAppController {
public $uses = array('ContactManager.Contact');
public function index() {
//...
}
}
Plugin Models
Models para plugins so armazenados em /app/Plugin/ContactManager/Model. Ns j definimos um ContactsController para este plugin, ento vamos criar o model para o controller, chamado Contact:
// /app/Plugin/ContactManager/Model/Contact.php:
class Contact extends ContactManagerAppModel {
}
Visitando /contact_manager/contacts agora (dado que voc tem uma tabela em seu banco de dados chamada
contacts) deveria nos dar um erro Missing View. Vamos criar na prxima.
Nota: Se voc precisar fazer referncia a um model dentro de seu plugin, voc precisa incluir o nome do
86
Captulo 6. Plugins
Se voc preferir que as chaves do array para associao no tenha o prefixo do plugin nelas, use uma sintaxe
alternativa:
// /app/Plugin/ContactManager/Model/Contact.php:
class Contact extends ContactManagerAppModel {
public $hasMany = array(
'AltName' => array(
'className' => 'ContactManager.AltName'
)
);
}
Plugin Views
Views se comportam exatamente como fazem em aplicaes normais. Basta coloc-las na pasta certa dentro
de /app/Plugin/[PluginName]/View/. Para nosso plugin ContactManager, vamos precisar de uma view para
nosso action ContactsController::index(), por isso vamos incluir isso como:
// /app/Plugin/ContactManager/View/Contacts/index.ctp:
<h1>Contacts</h1>
<p>Following is a sortable list of your contacts</p>
<!-- A sortable list of contacts would go here....-->
Nota: Para obter informaes sobre como usar elements de um plugin, veja Elements
Plugin Views
87
Voc pode colocar qualquer tipo de arquivo em qualquer diretrio, assim como um webroot normal. A nica
restrio que MediaView precisa saber o mime-type do arquivo.
deveria
servir
arquivo
Nota: importante notar o /your_plugin/ prefixado antes do caminho do arquivo. Isso faz a magica
acontecer!
Captulo 6. Plugins
Plugin Dicas
Uma vez que o plugin foi instalado em /app/Plugin, voc pode acess-lo atravs da URL /plugin_name/controller_name/action. Em nosso plugin ContactManager de exemplo, acessamos nosso ContactsController com /contact_manager/contacts.
Algumas dicas finais sobre como trabalhar com plugins em suas aplicaes CakePHP:
Quando voc no tiver um [Plugin]AppController e [Plugin]AppModel, voc ter um erro Missing
Controller quando estiver tentando acessar um controller de plugin.
Voc pode definir seus layouts para plugins, dentro de app/Plugin/[Plugin]/View/Layouts. Caso contrrio, o plugin ir utilizar por padro os layouts da pasta /app/View/Layouts.
89
90
Captulo 6. Plugins
CAPTULO 7
Desenvolvimento
Nesta seo vamos cobrir os vrios aspectos do desenvolvimento de uma aplicao CakePHP. Temas como
configurao, manipulao de erros e excees, depurao e testes sero abordados.
Configuration
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github1 ou use o boto Improve This Doc
para propor suas mudanas diretamente.
Voc pode referenciar-se verso inglesa no menu de seleo superior para obter informaes sobre o tpico
desta pgina.
Routing
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github2 ou use o boto Improve This Doc
para propor suas mudanas diretamente.
Voc pode referenciar-se verso inglesa no menu de seleo superior para obter informaes sobre o tpico
desta pgina.
Sessions
1
2
https://github.com/cakephp/docs
https://github.com/cakephp/docs
91
Exceptions
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github4 ou use o boto Improve This Doc
para propor suas mudanas diretamente.
Voc pode referenciar-se verso inglesa no menu de seleo superior para obter informaes sobre o tpico
desta pgina.
Error Handling
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github5 ou use o boto Improve This Doc
para propor suas mudanas diretamente.
Voc pode referenciar-se verso inglesa no menu de seleo superior para obter informaes sobre o tpico
desta pgina.
Debugging
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github6 ou use o boto Improve This Doc
para propor suas mudanas diretamente.
Voc pode referenciar-se verso inglesa no menu de seleo superior para obter informaes sobre o tpico
desta pgina.
3
https://github.com/cakephp/docs
https://github.com/cakephp/docs
5
https://github.com/cakephp/docs
6
https://github.com/cakephp/docs
4
92
Captulo 7. Desenvolvimento
Testing
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github7 ou use o boto Improve This Doc
para propor suas mudanas diretamente.
Voc pode referenciar-se verso inglesa no menu de seleo superior para obter informaes sobre o tpico
desta pgina.
REST
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github8 ou use o boto Improve This Doc
para propor suas mudanas diretamente.
Voc pode referenciar-se verso inglesa no menu de seleo superior para obter informaes sobre o tpico
desta pgina.
7
8
https://github.com/cakephp/docs
https://github.com/cakephp/docs
Testing
93
94
Captulo 7. Desenvolvimento
CAPTULO 8
Implementao
Uma vez que sua aplicao est completa, ou mesmo antes quando voc quiser coloc-la no ar. Existem
algumas poucas coisas que voc deve fazer quando colocar em produo uma aplicao CakePHP.
Definindo a Raiz
Definir a raiz do documento da sua aplicao corretamente um passo importante para manter seu cdigo
protegido e sua aplicao mais segura. As aplicaes desenvolvidas com o CakePHP devem ter a raiz apontando para o diretrio app/webroot. Isto torna a aplicao e os arquivos de configuraes inacessveis
via URL. Configurar a raiz do documento depende de cada webserver. Veja a Instalao Avanada para
informaes sobre webservers especficos.
Atualizar o core.php
Atualizar o arquivo core.php, especificamente o valor do debug de extrema importncia. Tornar o
debug igual a 0 desabilita muitos recursos do processo de desenvolvimento que nunca devem ser expostos
ao mundo. Desabilitando o debug, as coisas a seguir mudaro:
Mensagens de depurao criadas com pr() e debug() sero desabilitadas.
O cache interno do CakePHP ser descartado aps 99 anos em vez de 10 segundos.
Views de erros sero menos informativas, retornando mensagens de erros genricas.
Erros no sero mostrados.
O rastro da pilha de excees ser desabilitado.
Alm dos itens citados acima, muitos plugins e extenses usam o valor do debug para modificarem seus
comportamentos.
95
96
um
servidor
*nix
instalou
CakePHP
em
Captulo 8. Implementao
CAPTULO 9
Nesta seo, voc poder caminhar ao longo de tpicas aplicaes CakePHP para ver como todas as peas
se encaixam.
Como alternativa, voc pode preferir visitar o repositrio no oficial de plugins para o CakePHP CakePackages1 ou a Padaria2 para conhecer aplicaes e componentes existentes.
Blog
Bem vindo ao CakePHP. Voc provavelmente est lendo este tutorial porque quer aprender mais sobre como
o CakePHP funciona. Nosso objetivo aumentar a produtividade e fazer a programao uma tarefa mais
divertida: 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, criar
e configurar o banco de dados e criar a lgica da aplicao suficiente para listar, adicionar, editar e deletar
posts 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 instrues para usar outros servidores sejam bem semelhantes. Talvez tenhamos que brincar um pouco
com as configuraes do servidor mas a maioria das pessoas sero capazes de ter o Cake rodando sem
precisar configurar nada.
2. Um servidor de banco de dados. Ns iremos usar o MySQL Server neste tutorial. Voc precisa saber
o 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.
4. E por ltimo, voc vai precisar de um conhecimento bsico do padro de projetos MVC. Uma rpida
viso geral pode ser encontrada em Entendendo o Model-View-Controller. No se preocupe, deve ter
meia pgina ou menos.
1
2
http://plugins.cakephp.org/
http://bakery.cakephp.org/
97
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
git://github.com/cakephp/cakephp.git.
usando
git3 .
git clone
Idependente da maneira de como voc baixou o Cake, coloque o cdigo obtido dentro do seu diretrio web
pblico. A estrutura dos diretrios deve ficar parecido com o seguinte:
/caminho_para_diretorio_web_publico
/app
/lib
/plugins
/vendors
.htaccess
index.php
README
Agora pode ser um bom momento para aprender um pouco sobre como funciona a estrutura de diretrios do
CakePHP: Veja a seo Estrutura de Diretrios no CakePHP.
98
http://git-scm.com/
Aps salvar seu novo arquivo database.php, voc estar apto para abrir seu navegador e ver a pgina de boas
vindas do Cake. A pgina de boas vindas dever lhe mostrar uma mensagem dizendo que seu arquivo de
conexo 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 estes
itens, mas eles no so obrigatrios para este tutorial. Uma das configuraes customizar uma string (ou
salt) para ser utilizada nos hashes de segurana. O segundo definir um nmero (ou seed) para uso em
criptografia. E o terceiro dar permisso de escrita para o CakePHP na pasta tmp.
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 no
seja fcil de adivinhar.
Blog
99
/**
* 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 valor
seja, 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 (<?php echo whoami; ?>) e alterar o
dono da pasta app/tmp para este usurio. Voc pode executar (em *nix) o comando a seguir para alterar o
usurio 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 mensagem
enquanto estiver em modo de desenvolvimento.
100
LoadModule rewrite_module
libexec/httpd/mod_rewrite.so
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'));
Blog - Continuao
Crie um Model Post
A classe Model o po com manteiga das aplicaes CakePHP. Ao criar um model do CakePHP que
ir interagir com nossa base de dados, teremos os alicerces necessrios para posteriormente fazer nossas
operaes 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 ser
salvo 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 nosso
model 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
um arquivo correspondente na pasta /app/Model. Isto tambm significa que, se voc acidentalmente der um
nome errado ao seu arquivo (p.ex. post.php ou posts.php) o CakePHP no ser capaz de reconhecer nenhuma
Blog - Continuao
101
de suas configuraes adicionais e ao invs disso, passar a usar seus padres definidos internamente na
classe Model.
Para saber mais sobre models, como prefixos de nomes de tabelas, callbacks e validaes, confira o captulo
sobre /models deste manual.
Agora, vamos adicionar uma action ao nosso controller. Actions quase sempre representam uma
nica funo ou interface numa aplicao. Por exemplo, quando os usurios acessarem o endereo
www.exemplo.com/posts/index (que, neste caso o mesmo que www.exemplo.com/posts/), eles esperam
ver 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'));
}
}
102
Blog - Continuao
103
Os arquivos de view do Cake so armazenados na pasta /app/View dentro de uma pasta com o mesmo
nome do controller a que correspondem (em nosso caso, vamos criar uma pasta chamada Posts). Para
apresentar os dados do post num formato adequado de tabela, o cdigo de nossa view deve ser algo como:
<!-- File: /app/View/Posts/index.ctp -->
<h1>Posts do Blog</h1>
<table>
<tr>
<th>Id</th>
<th>Ttulo</th>
<th>Data de Criao</th>
</tr>
<!-- Aqui onde ns percorremos nossa matriz $posts, imprimindo
as informaes dos posts -->
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo $post['Post']['id']; ?></td>
<td>
<?php echo $this->Html->link($post['Post']['title'],
array('controller' => 'posts', 'action' => 'view', $post['Post']['id'])); ?>
</td>
<td><?php echo $post['Post']['created']; ?></td>
</tr>
<?php endforeach; ?>
</table>
A chamada do mtodo set() deve lhe parece familiar. Perceba que estamos usando o mtodo read() ao
invs 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 o
valor 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:
<!-- File: /app/View/Posts/view.ctp -->
<h1><?php echo $post['Post']['title']?></h1>
<p><small>Created: <?php echo $post['Post']['created']?></small></p>
<p><?php echo $post['Post']['body']?></p>
Adicionando Posts
Ler a partir da base de dados e exibir os posts foi um grande comeo, mas precisamos permitir tambm que
os 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'));
}
public function view($id) {
$this->Post->id = $id;
$this->set('post', $this->Post->read());
Blog - Continuao
105
}
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 controller que voc manipula variveis de sesso. Neste caso, inclumos apenas o componente porque ele
carrega o helper automaticamente. Se voc sempre utiliza sesses, inclua o componente no seu arquivo
AppController.
Aqui est o que a action add() faz: se o mtodo da requisio feita pelo cliente for do tipo post, ou seja, se
ele enviou dados pelo formulrio, tenta salvar os dados usando o model Post. Se, por alguma razo ele no
salvar, apenas renderize a view. Isto nos d uma oportunidade de mostrar erros de validao e outros avisos
ao usurio.
Quando um usurio utiliza um formulrio para submeter (POSTar) dados para sua aplicao, esta informao
fica disponvel em $this->request->data.Voc pode usar as funes pr() ou debug() para exibir
os dados se voc quiser conferir como eles se parecem.
Ns usamos o mtodo SessionComponent::setFlash() do componente SessionComponent para
definir uma varivel de sesso com uma mensagem a ser exibida na pgina depois de ser redirecionada. No
layout, ns temos SessionHelper::flash que exibe a mensagem e limpa a varivel de sesso correspondente. O mtodo Controller::redirect do controller redireciona para outra URL. O parmetro
array(action => index) convertido para a URL /posts, em outras palavras, a action index
do controller posts. Voc pode conferir a funo Router::url() na API para ver os formatos que voc
pode 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 tudo
isso mais fcil e mais rpido.
Para usufruir das vantagens dos recursos de validao, voc vai precisar usar o FormHelper do Cake em suas
views. O FormHelper est disponvel por padro em todas as suas views na varivel $this->Form.
Aqui est nossa view add:
<!-- File: /app/View/Posts/add.ctp -->
106
<h1>Add Post</h1>
<?php
echo $this->Form->create('Post');
echo $this->Form->input('title');
echo $this->Form->input('body', array('rows' => '3'));
echo $this->Form->end('Save Post');
Aqui, usamos o FormHelper para gerar a tag de abertura para um formulrio. Aqui est o HTML gerado
pelo $this->Form->create():
<form id="PostAddForm" method="post" action="/posts/add">
Se o mtodo create() for chamado sem quaisquer parmetros, o CakePHP assume que voc est criando
um formulrio que submete para a action add() do controller atual (ou para a action edit() se um campo
id for includo nos dados do formulrio), via POST.
O mtodo $this->Form->input() usado para criar elementos de formulrio de mesmo nome. O
primeiro parmetro informa ao CakePHP qual o campo correspondente e o segundo parmetro permite que
voc especifique um extenso array de opes. Neste caso, o nmero de linhas para o textarea. H alguma
introspeco automgica envolvida aqui: o input() ir exibir diferentes elementos de formulrio com
base no campo do model em questo.
A chamada $this->Form->end() gera um boto de submisso e encerra o formulrio. Se uma
string for informada como primeiro parmetro para o end(), o FormHelper exibe um boto de submit
apropriadamente rotulado junto com a tag de fechamento do formulrio. Novamente, confira o captulo
sobre os /views/helpers disponveis no CakePHP para mais informaes sobre os helpers.
Agora vamos voltar e atualizar nossa view /app/View/Post/index.ctp para incluir um novo link
para Adicionar Post. Antes de <table>, adicione a seguinte linha:
echo $this->Html->link('Add Post', array('controller' => 'posts', 'action' => 'add'));
Voc pode estar imaginando: como eu informo ao CakePHP sobre os requisitos de validao de meus dados?
Regras de validao so definidas no model. Vamos olhar de volta nosso model Post e fazer alguns pequenos
ajustes:
class Post extends AppModel {
public $name = 'Post';
public $validate = array(
'title' => array(
'rule' => 'notEmpty'
),
'body' => array(
'rule' => 'notEmpty'
)
);
}
O array $validate diz ao CakePHP sobre como validar seus dados quando o mtodo save() for
chamado. Aqui, eu especifiquei que tanto os campos body e title no podem ser vazios. O mecanismo
de validao do CakePHP robusto, com diversas regras predefinidas (nmeros de carto de crdito, endereos de e-mail, etc.) alm de ser bastante flexvel, permitindo adicionar suas prprias regras de validao.
Blog - Continuao
107
Editando Posts
Edio de Posts: Aqui vamos ns. A partir de agora voc j um profissional do CakePHP, ento voc deve
ter 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 a
view. Se a requisio no for do tipo GET, provavelmente esta contm dados de um formulrio POST. Ns
usaremos estes dados para atualizar o registro do nosso Post ou exibir novamente a view mostrando para o
usurio os erros de validao.
A view edit pode ser algo parecido com isto:
<!-- File: /app/View/Posts/edit.ctp -->
<h1>Edit
<?php
echo
echo
echo
echo
echo
Post</h1>
$this->Form->create('Post', array('action' => 'edit'));
$this->Form->input('title');
$this->Form->input('body', array('rows' => '3'));
$this->Form->input('id', array('type' => 'hidden'));
$this->Form->end('Save Post');
Esta view exibe o formulrio de edio (com os valores populados), juntamente com quaisquer mensagens
de erro de validao.
Uma coisa a atentar aqui: o CakePHP vai assumir que voc est editando um model se o campo id estiver
presente no array de dados. Se nenhum id estiver presente (como a view add de insero), o Cake ir
assumir que voc est inserindo um novo model quando o mtodo save() for chamado.
Voc agora pode atualizar sua view index com os links para editar os posts especficos:
108
<h1>Blog posts</h1>
<p><?php echo $this->Html->link("Add Post", array('action' => 'add')); ?></p>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Action</th>
<th>Created</th>
</tr>
<!-- Aqui onde ns percorremos nossa matriz $posts, imprimindo
as informaes dos posts -->
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
mensagem de confirmao para o usurio depois de redirecion-lo para /posts.
Blog - Continuao
109
Se o usurio tentar deletar um post usando uma requisio do tipo GET, ns lanamos uma exceo. Excees no apanhadas so capturadas pelo manipulador de excees do CakePHP e uma pgina de erro
amigvel mostrada. O CakePHP vem com muitas Exceptions que voc pode usar para indicar vrios tipos
de 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, como
um link executa uma requisio do tipo GET, nossa action ir lanar uma exceo. Precisamos ento criar
um pequeno formulrio que enviar um mtodo POST adequado. Para estes casos o helper FormHelper
fornece o mtodo postLink():
<!-- File: /app/View/Posts/index.ctp -->
<h1>Blog posts</h1>
<p><?php echo $this->Html->link('Add Post', array('action' => 'add')); ?></p>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Actions</th>
<th>Created</th>
</tr>
<!-- Aqui onde ns percorremos nossa matriz $posts, imprimindo
as informaes dos posts -->
Nota: O cdigo desta view tambm utiliza o HtmlHelper para solicitar uma confirmao do usurio com
um dilogo em Javascript antes de tentar excluir o post.
110
Rotas
Para alguns, o roteamento padro do CakePHP funcionar muito bem. Os desenvolvedores que estiverem
mais afeitos a criar produtos ainda mais amigveis aos usurios e aos mecanismos de busca iro gostar da
maneira que as URLs do CakePHP so mapeadas para actions especficas. Ento vamos fazer uma pequena
alterao 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) usando
seu PagesController e renderizando uma view chamada de home. Ao invs disso, vamos substituir isto
por nosso PostsController criando uma regra de roteamento.
As rotas do Cake so encontrada no arquivo /app/Config/routes.php. Voc vai querer comentar ou
remover 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 prprio
controller, 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 passar
array(controller => posts, action => index) a um mtodo que espere um
array, a URL resultante ser /. sempre uma boa ideia usar arrays para URLs, j que a partir disto que
suas rotas definem para onde suas URLs apontam, alm de garantir que os links sempre apontem para o
mesmo lugar.
Concluso
Criar aplicaes desta maneira ir lhe trazer paz, honra, amor e dinheiro alm de satisfazer s suas mais
ousadas fantasias. Simples, no? Tenha em mente que este tutorial foi muito bsico. O CakePHP possui
muito mais recursos a oferecer e flexvel de tantas maneiras que no conseguimos mostrar aqui por questes
de 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 seu
prprio projeto, leia o restante do Manual e da API4 .
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 website
4
http://api20.cakephp.org
Blog - Continuao
111
Ns respeitamos as convenes do CakePHP para nomear tabelas, mas tambm aproveitamos outra conveno: usando as colunas username e password em nossa tabela users, o CakePHP ser capaz de auto
configurar as coisas quando implementarmos os mecanismos de login de nossos usurios.
A prxima etapa criar o nosso model User, responsvel pelas pesquisas, gravaes e validaes de dados
dos usurios:
// app/Model/User.php
class User extends AppModel {
public $name = 'User';
public $validate = array(
'username' => array(
'required' => array(
'rule' => array('notEmpty'),
'message' => 'A username is required'
)
),
'password' => array(
'required' => array(
'rule' => array('notEmpty'),
'message' => 'A password is required'
)
),
112
Vamos criar tambm nosso UsersController, o contedo a seguir corresponde classe UsersController bsica
cozida usando a ferramenta de gerao de cdigos presente no CakePHP:
// app/Controller/UsersController.php
class UsersController extends AppController {
113
if ($this->User->save($this->request->data)) {
$this->Session->setFlash(__('The user has been saved'));
$this->redirect(array('action' => 'index'));
} else {
$this->Session->setFlash(__('The user could not be saved. Please, try again
}
} else {
$this->request->data = $this->User->read(null, $id);
unset($this->request->data['User']['password']);
}
}
public function delete($id = null) {
if (!$this->request->is('post')) {
throw new MethodNotAllowedException();
}
$this->User->id = $id;
if (!$this->User->exists()) {
throw new NotFoundException(__('Invalid user'));
}
if ($this->User->delete()) {
$this->Session->setFlash(__('User deleted'));
$this->redirect(array('action' => 'index'));
}
$this->Session->setFlash(__('User was not deleted'));
$this->redirect(array('action' => 'index'));
}
Da mesma forma criamos as views para nossos posts no blog ou usando a ferramanta de gerao de cdigo,
ns implementamos as views. Para o propsito de nosso tutorial, iremos mostrar somente o add.ctp:
<!-- app/View/Users/add.ctp -->
<div class="users form">
<?php echo $this->Form->create('User');?>
<fieldset>
<legend><?php echo __('Add User'); ?></legend>
<?php echo $this->Form->input('username');
echo $this->Form->input('password');
echo $this->Form->input('role', array(
'options' => array('admin' => 'Admin', 'author' => 'Author')
));
?>
</fieldset>
<?php echo $this->Form->end(__('Submit'));?>
</div>
114
Para
adicionar
esse
componente
em
sua
aplicao
app/Controller/AppController.php e adicione as seguintes linhas:
abra
seu
arquivo
// app/Controller/AppController.php
class AppController extends Controller {
//...
Aqui no h muito para configurar, como ns usamos convenes na tabela users. Ns somente configuramos as urls que sero carregadas aps as aes de login e logout, em nosso caso so /posts/ e /
respectivamente.
O que fizemos na funo beforeFilter foi dizer ao AuthComponent para no solicitar um login para
todas as actions index e view, em todos os controller. Ns queremos que nossos visitantes possam ler
qualquer post sem precisar se registrar no site.
Agora, ns precisamos autorizar que novos usurios possam se registrar, salvando o nome de usurio e a
senha deles, e o mais importante encriptar a senha pra que ela no seja armazenada como texto plano em
nosso banco de dados. Vamos dizer ao AuthComponet para permitir que usurios deslogados acessem a
funo add e implementar a ao de login e logout:
// app/Controller/UsersController.php
public function beforeFilter() {
parent::beforeFilter();
$this->Auth->allow('add'); // Permitindo que os usurios se registrem
}
public function login() {
if ($this->Auth->login()) {
$this->redirect($this->Auth->redirect());
} else {
$this->Session->setFlash(__('Invalid username or password, try again'));
}
}
public function logout() {
$this->redirect($this->Auth->logout());
}
Hash da senha no foi feito ainda, abra o seu arquivo de model app/Model/User.php e adicione o
Autenticao simples e Autorizao da Aplicao
115
seguinte:
// app/Model/User.php
App::uses('AuthComponent', 'Controller/Component');
class User extends AppModel {
// ...
Ento, agora toda vez que um usurio for salvo, a senha ser encriptada usando o hashing padro disponibilizado pela classe AuthComponent. Est faltando somente um arquivo view para a funo de login, Aqui
est ele:
<div class="users form">
<?php echo $this->Session->flash('auth'); ?>
<?php echo $this->Form->create('User');?>
<fieldset>
<legend><?php echo __('Please enter your username and password'); ?></legend>
<?php echo $this->Form->input('username');
echo $this->Form->input('password');
?>
</fieldset>
<?php echo $this->Form->end(__('Login'));?>
</div>
Voc pode registrar um novo usurio acessando a url /users/add e autenticar com as credenciais do
usurio recm criado indo para a url /users/login. Tente tambm acessar qualquer outra url sem que
a permiso tenha sido explicitada, como em /posts/add, voc ver que a aplicao ir redirecion-lo
automaticamente para a pgina de login.
E isso! Parece simples demais para ser verdade. Vamos voltar um pouco para explicar o que aconteceu.
A funo beforeFilter est falando para o AuthComponent no solicitar um login para a ao add
em adio as aes index e view que foram prontamente autorizadas na funo beforeFilter do
AppController.
A ao de login chama a funo $this->Auth->login() do AuthComponent, e ele funciona sem
qualquer configurao adicional porque seguimos as convenes mencionadas anteriormente. Isso , temos
um model User com uma coluna username e uma password, e usamos um form para postar os dados do
usurio para o controller. Essa funo retorna se o login foi bem sucedido ou no, e caso ela retorne sucesso,
ento ns redirecionamos o usurio para a url que configuramos quando adicionamos o AuthComponent em
nossa aplicao.
O logout funciona exatamente quando acessamos a url /users/logout e ir redirecionar o usurio
para a url configurada em logoutUrl anteriormente descrita. Essa url acionada quando a funo
AuthComponent::logout() obtm sucesso.
116
Tambm, necessria uma pequena mudana no PostsController para guardar a referncia do usurio logado
para o post criado:
// app/Controller/PostsController.php
public function add() {
if ($this->request->is('post')) {
$this->request->data['Post']['user_id'] = $this->Auth->user('id'); // Adicionada es
if ($this->Post->save($this->request->data)) {
$this->Session->setFlash('Your post has been saved.');
$this->redirect(array('action' => 'index'));
}
}
}
A funo user() fornecida pelo component retorna qualquer coluna do usurio logado no momento. Ns
usamos esse metdo para adicionar a informao dentro de request data para que ela seja salva.
Vamos garantir que nossa app evite que alguns autores editem ou apaguem posts de outros. Uma regra
bsica para nossa aplicao que usurios admin possam acessar qualquer url, enquanto usurios normais
(o papel author) podem somente acessar as actions permitidas. Abra novamente a classe AppController e
adicione um pouco mais de opes para as configuraes do Auth:
// app/Controller/AppController.php
public $components = array(
'Session',
'Auth' => array(
'loginRedirect' => array('controller' => 'posts', 'action' => 'index'),
'logoutRedirect' => array('controller' => 'pages', 'action' => 'display', 'home'),
'authorize' => array('Controller') // Adicionamos essa linha
)
);
public function isAuthorized($user) {
if (isset($user['role']) && $user['role'] === 'admin') {
return true; // Admin pode acessar todas actions
}
return false; // Os outros usurios no podem
}
Ns acabamos de criar um mecanismo de autorizao muito simples. Nesse caso os usurios com papel
admin podero acessar qualquer url no site quando estiverem logados, mas o restante dos usurios (i.e o
papel author) no podem acessar qualquer coisa diferente dos usurios no logados.
Isso no exatamente o que ns queremos, por isso precisamos corrigir nosso metdo isAuthorized()
para fornecer mais regras. Mas ao invs de fazer isso no AppController, vamos delegar a cada conAutenticao simples e Autorizao da Aplicao
117
troller para suprir essas regras extras. As regras que adicionaremos para o add de PostsController deve
permitir ao autores criarem os posts mas evitar a edio de posts que no sejam deles. Abra o arquivo
PostsController.php e adicione o seguinte contedo:
// app/Controller/PostsController.php
public function isAuthorized($user) {
if (parent::isAuthorized($user)) {
if ($this->action === 'add') {
// Todos os usurios registrados podem criar posts
return true;
}
if (in_array($this->action, array('edit', 'delete'))) {
$postId = (int) $this->request->params['pass'][0];
return $this->Post->isOwnedBy($postId, $user['id']);
}
}
return false;
}
Ns estamos sobreescrevendo a chamada do isAuthorized() do AppController e internamente verificando na classe pai se o usurio est autorizado. Caso ele no esteja, permitiremos acesso ao add, e
condicionamente acesso s aes edit e delete. A ltima coisa que falta implementar, dizer se usurio
autorizado a editar o post ou no, ns estamos chamando a funo isOwnedBy() no model Post. Mover
lgica para dentro dos models normalmente uma boa prtica. Vamos ento implementar essa funo:
// app/Model/Post.php
public function isOwnedBy($post, $user) {
return $this->field('id', array('id' => $post, 'user_id' => $user)) === $post;
}
Isso conclui ento nossa autorizao simples e nosso tutorial de autorizao. Para garantir o UsersController
voc pode seguir as mesmas tcnicas que usamos para PostsController, voc tambm pode ser mais criativo
e codificar algumas coisas mais gerais no AppController para suas prprias regras baseadas em papis.
Se precisar de mais controle, ns sugerimos que leia o guia completo do Auth
/core-libraries/components/authentication seo onde voc encontrar mais sobre
a configurao do componente, criao de classes de Autorizao customizadas, e muito mais.
Sugerimos as seguintes leituras
1. /console-and-shells/code-generation-with-bake Generating basic CRUD code
2. /core-libraries/components/authentication: User registration and login
118
Por favor, sinta-se a vontade para nos enviar um pull request no Github5 ou use o boto Improve This Doc
para propor suas mudanas diretamente.
Voc pode referenciar-se verso inglesa no menu de seleo superior para obter informaes sobre o tpico
desta pgina.
5
6
https://github.com/cakephp/docs
https://github.com/cakephp/docs
119
120
CAPTULO 10
Apndices
Os apndices contm informaes sobre os novos recursos introduzidos na verso 2.0 e o guia de migrao
da verso 1.3 para a verso 2.0.
https://github.com/cakephp/docs
https://github.com/cakephp/docs
121
Se sua aplicao j tiver esses arquivos/classes voc no precisa fazer nada. Alm disso, se voc estiver
utilizando o PagesController do ncleo do CakePHP, voc precisa copi-lo para a pasta app/Controller tambm.
3
https://github.com/cakephp/docs
122
Arquivos .htaccess
Os arquivos .htaccess foram alterados, voc deve lembrar de atuliz-los ou a atualizar o esquema de
reescrita de URL re-writing para combinar com as atualizaes feitas.
Models
O callbackbeforeDelete ser disparado antes dos callbacks beforeDelete dos behaviors. Isto o
torna consistente com o resto dos eventos disparados na camada de modelo.
O mtodo Model::find(threaded) agora aceita o parmetro $options[parent] se
estiver usando outro campo como parent_id. Alm disso, se o model tem o TreeBehavior e configurado com outro campo definido para o pai, o threaded ir encontr-lo e o utilizar por padro.
Parmetros para consultas usando instrues preparadas (prepared statements) agora ser
parte do dump SQL.
Arrays de validao agora podem ser mais especficos quando um campo obrigatrio. A chave
required agora aceita create e update. Esses valores faro o campo obrigatrio quando criar
ou atualizar.
Behaviors
TranslateBehavior
Debugger::getType() foi adicionada. Pode ser utilizada para obter o tipo das variveis.
Debugger::exportVar() foi modificada para criar uma sada mais legvel e til.
debug()
debug() agora utiliza Debugger internamente. Isto o torna mais consistente com o Debugger, e tira proveito
das melhorias feitas l.
123
Set
Set::nest() foi adicionada. Recebe uma matriz simples e retorna uma matriz aninhada.
File
App::build() agora tem a capacidade de registrar novos pacotes usando App::REGISTER. Veja
app-build-register para mais informaes.
As classes que no podem ser encontradas nos caminhos configurados sero pesquisados dentro de
APP, como um caminho alternativo. Isso torna o carregamento automtico dos diretrios aninhados
em app/Vendedor mais fcil.
Console
Test Shell
Um novo TestShell foi adicionado. Ele reduz a digitao necessria para executar os testes unitrios, e
oferece uma interface baseada nos caminhos dos arquivos:
# Run the post model tests
Console/cake test app/Model/Post.php
Console/cake test app/Controller/PostsController.php
124
Rotas
Router
As rotas agora podem usar uma sintaxe especial /** para incluir todos os argumentos finais como
um nico argumento passado. Veja a seo sobre connecting-routes para mais informaes.
Router::resourceMap() foi adicionada.
Router::defaultRouteClass() foi adicionada. Este mtodo permite que voc defina a classe
padro usada para todas as rotas definidas.
Network
CakeRequest
O Controller::$uses foi modificado, seu valor padro agora true em vez de false. Alm
disso, valores diferentes so tratados de maneira ligeiramente diferente, mas ir comportar o mesmo
na maioria dos casos.
true Ir carregar o modelo padro e mesclar com AppController.
Um array ir carregar os modelos e mesclar com AppController.
An empty array will not load any models other than those declared in the base class.
Um array vazio no vai carregar outros modelos que no os declarados na classe base.
false no ir carregar qualquer modelo, e no vai se fundir com a classe base tambm.
Componentes
AuthComponent
125
A opo recursive foi adicionada a todos os adaptadores de autenticao. Permite controlar mais
facilmente as associaes armazenados na sesso.
AclComponent
AclComponent no mais inflexiona o nome da classe usada para Acl.classname. Em vez disso
utiliza o valor como fornecido.
Implementaes do Acl agora devem ser colocadas em Controller/Component/Acl.
Implementaes do Acl agora devem ser movidas da pasta Component para a pasta
Component/Acl. Por exemplo: se sua classe Acl se chama CustomAclComponent, e
est em Controller/Component/CustomAclComponent.php. Ela deve ser movida para
Controller/Component/Acl/CustomAcl.php e renomeada para CustomAcl.
DbAcl foi movida para um arquivo separado.
IniAcl foi movida para um arquivo separado.
AclInterface foi movida para um arquivo separado.
Helpers
TextHelper
TextHelper::autoLink(),
TextHelper::autoLinkUrls(),
TextHelper::autoLinkEmails() escapa o HTML por padro. Voc pode controlar
este comportamento com a opo escape.
HtmlHelper
$scripts_for_layout ainda est disponvel, mas a API view blocks API mais flexvel e extensvel.
A sintaxe Plugin.view est agora disponvel em todos os lugares. Voc pode usar esta sintaxe em
qualquer lugar que voc fizer referncia ao nome de uma view, layout ou element.
A opo $options[plugin] para element() est obsoleta. Em vez disso voc deve utilizar
Plugin.element_name.
Content type views
View has a new method allowing you to wrap or extend a view/element/layout with another file. See the
section on Estendendo Views for more information on this feature.
Temas
A classe ThemeView est obsoleta em favor da classe View. Simplesmente defina o $this->theme =
MyTheme que o suporte a temas ser habilitado, e todas as classes de View personalizadas que estendem
da ThemeView deve estender de View.
Blocos de View
Blocos de View so uma maneira flexvel de criar slots ou blocos em suas views. Os blocos substituem
$scripts_for_layout com uma API mais robusta e flexvel. Consulte a seo sobre Usando Blocos
de Views (Vises) para mais informaes.
127
Helpers
Novos callbacks
O FormHelper agora omite campos desabilitados a partir do hash dos campos protegidos. Isso torna
o trabalho com SecurityComponent e os inputs desabilitados mais fcil.
A opo between quando utilizado em conjunto com os radio inputs, agora se comporta de forma
diferente. O valor do between agora colocado entre a legenda e o primeiro input.
A opo hiddenField dos campos checkbox pode agora ser definida para um valor especfico,
como N ao invs de apenas 0.
O atributo for para campos datetime agora reflete o primeiro campo gerado. Isso pode resultar na
mudana do atributo for de acordo com os campo geradas.
O atributo type para FormHelper::button() pode ser removido agora. O padro ainda
submit.
FormHelper::radio() agora permite que voc desabilite todas as opes. Voc pode
fazer isso definindo disabled => true ou disabled => disabled no array
$attributes.
PaginatorHelper
128
https://github.com/cakephp/docs
https://github.com/cakephp/docs
6
https://github.com/cakephp/docs
5
129
Informaes Gerais
Glossary
routing array An array of attributes that are passed to Router::url(). They typically look like:
array('controller' => 'posts', 'action' => 'view', 5)
HTML attributes An array of key => values that are composed into HTML attributes. For example:
// Given
array('class' => 'my-class', 'target' => '_blank')
// Would generate
class="my-class" target="_blank"
If an option can be minimized or accepts its name as the value, then true can be used:
// Given
array('checked' => true)
// Would generate
checked="checked"
plugin syntax Plugin syntax refers to the dot separated class name indicating classes are part of a plugin.
E.g. DebugKit.Toolbar The plugin is DebugKit, and the class name is Toolbar.
dot notation Dot notation defines an array path, by separating nested levels with . For example:
Asset.filter.css
CSRF Cross Site Request Forgery. Prevents replay attacks, double submissions and forged requests from
other domains.
routes.php A file in APP/Config that contains routing configuration. This file is included before each
request is processed. It should connect all the routes your application needs so requests can be routed
to the correct controller + action.
DRY Dont repeat yourself. Is a principle of software development aimed at reducing repetition of information of all kinds. In CakePHP DRY is used to allow you to code things once and re-use them across
your application.
130
CAPTULO 11
genindex
131
132
ndice
Symbols
$this->request, 54
$this->response, 60
__construct() (mtodo Component), 70
A
acceptLanguage() (mtodo CakeRequest), 60
accepts() (mtodo CakeRequest), 59
addDetector() (mtodo CakeRequest), 59
addScript() (mtodo View), 81
afterFilter() (mtodo Controller), 45
afterScaffoldSave() (mtodo Controller), 48
afterScaffoldSaveError() (mtodo Controller), 48
append() (mtodo View), 81
assign() (mtodo View), 81
B
base (CakeRequest property), 60
beforeFilter() (mtodo Controller), 45
beforeRedirect() (mtodo Component), 70
beforeRender() (mtodo Component), 70
beforeRender() (mtodo Controller), 45
beforeScaffold() (mtodo Controller), 48
Blocks (View property), 82
blocks() (mtodo View), 81
body() (mtodo CakeResponse), 63
C
cache() (mtodo CakeResponse), 63
cacheAction (Controller property), 54
CakeRequest (class), 58
CakeResponse (class), 63
charset() (mtodo CakeResponse), 63
D
data (CakeRequest property), 60
data() (mtodo CakeRequest), 59
disableCache() (mtodo CakeResponse), 63
disableCache() (mtodo Controller), 49
domain() (mtodo CakeRequest), 58
dot notation, 130
download() (mtodo CakeResponse), 63
DRY, 130
E
element() (mtodo View), 81
elementCache (View property), 82
end() (mtodo View), 81
extend() (mtodo View), 82
F
fetch() (mtodo View), 81
flash() (mtodo Controller), 48
G
getVar() (mtodo View), 80
getVars() (mtodo View), 80
H
header() (mtodo CakeRequest), 59
133
I
initialize() (mtodo Component), 70
input() (mtodo CakeRequest), 59
is() (mtodo CakeRequest), 59
L
layout (View property), 82
loadModel() (mtodo Controller), 52
M
method() (mtodo CakeRequest), 59
T
type() (mtodo CakeResponse), 63
U
uses (Controller property), 53
uuid() (mtodo View), 81
V
View (class), 80
W
webroot (CakeRequest property), 60
O
output (View property), 82
P
paginate (Controller property), 54
paginate() (mtodo Controller), 50
params (CakeRequest property), 60
plugin syntax, 130
postConditions() (mtodo Controller), 49
Q
query (CakeRequest property), 60
R
redirect() (mtodo Controller), 47
referer() (mtodo CakeRequest), 59
referer() (mtodo Controller), 49
render() (mtodo Controller), 46
request (View property), 82
requestAction() (mtodo Controller), 50
routes.php, 130
routing array, 130
S
scaffoldError() (mtodo Controller), 48
send() (mtodo CakeResponse), 63
set() (mtodo Controller), 46
134
ndice