Beruflich Dokumente
Kultur Dokumente
Verso 3.x
02 February, 2016
Contedo
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
1
1
2
2
3
4
4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
25
25
25
25
26
26
26
26
27
27
27
27
27
28
29
30
31
i
Log . . . . . . . . . .
Roteamento . . . . . .
Rede . . . . . . . . . .
Sesses . . . . . . . .
Network\Http . . . . .
Network\Email . . . .
Controller . . . . . . .
Controller\Components
Model . . . . . . . . .
Sute de Testes . . . . .
View . . . . . . . . . .
View\Helper . . . . . .
I18n . . . . . . . . . .
Localizao . . . . . .
Testes . . . . . . . . .
Utilitrios . . . . . . .
4
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
31
32
34
34
35
35
35
37
39
40
41
43
47
49
49
49
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
53
53
59
67
70
81
88
Contribuindo
Documentao . . . . . . . .
Tickets . . . . . . . . . . . .
Cdigo . . . . . . . . . . . .
Padres de cdigo . . . . . .
Guia de retrocompatibilidade
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
97
97
97
97
98
98
Instalao
Requisitos . . . . . . . . . .
Instalando o CakePHP . . .
Permisses . . . . . . . . .
Servidor de Desenvolvimento
Produo . . . . . . . . . .
Aquecendo . . . . . . . . .
Reescrita de URL . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
99
99
100
101
101
102
102
103
Configurao
109
Additional Class Paths . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
Roteamento
111
Connecting Routes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
ii
10 Controllers (Controladores)
O App Controller . . . . . . . . . . . . . . .
Fluxo de requisies . . . . . . . . . . . . .
Mtodos (actions) de controllers . . . . . . .
Redirecionando para outras pginas . . . . .
Carregando models adicionais . . . . . . . .
Paginando um model . . . . . . . . . . . . .
Configurando components para carregar . . .
Configurando helpers para carregar . . . . . .
Ciclo de vida de callbacks em uma requisio
Mais sobre controllers . . . . . . . . . . . . .
11 Views (Visualizao)
Using View Blocks .
Layouts . . . . . . .
Elements . . . . . . .
More About Views .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
115
115
116
117
120
121
122
122
123
123
124
.
.
.
.
127
127
127
127
127
12 Models (Modelos)
133
Exemplo rpido . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Mais informao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
13 Authentication
143
14 Bake Console
145
Instalao . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
15 Caching
147
16 Console e Shells
O Console do CakePHP . . . . . . . . . . .
Criando uma Shell . . . . . . . . . . . . .
Tasks de Shell . . . . . . . . . . . . . . . .
Invocando outras Shells a partir da sua Shell
Recenendo Input de usurios . . . . . . . .
Criando Arquivos . . . . . . . . . . . . . .
Sada de dados do Console . . . . . . . . .
Opes de configurao e Gerao de ajuda
Roteamento em Shells / CLI . . . . . . . .
Mtodos enganchados . . . . . . . . . . . .
Mais tpicos . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
17 Debugging
18 Implantao
Atualizar config/app.php . . . . . . . . .
Checar a segurana . . . . . . . . . . . .
Definir a raiz do documento . . . . . . . .
Aprimorar a performance de sua aplicao
149
149
150
152
154
154
154
155
157
165
165
165
169
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
171
171
172
172
172
iii
19 Email
173
175
21 Sistema de eventos
177
22 Internacionalizao e Localizao
179
23 Logging
181
183
25 Pagination
185
26 Plugins
187
27 REST
189
28 Segurana
191
Segurana . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Cross Site Request Forgery . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191
Security . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
29 Sessions
193
30 Testing
Instalando o PHPUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Configurao do banco de dados test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Controller Integration Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
195
195
196
196
31 Validao
197
32 App Class
199
33 Collections (Colees)
201
203
35 Hash
205
36 Http Client
207
37 Inflector
209
38 Nmero
211
39 Objetos de Registro
213
40 Texto
215
41 Tempo
217
iv
42 Xml
219
43 Constantes e Funes
221
44 Debug Kit
Instalao . . . . . . . . . . . . . .
Armazenamento do DebugKit . . .
Uso da barra de ferramentas . . . .
Usando o painel History . . . . . . .
Desenvolvendo seus prprios painis
223
223
223
224
224
224
45 Migrations
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
227
46 Apndices
229
Guia de Migrao para a verso 3.x . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 229
Informaes Gerais . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 256
PHP Namespace Index
259
ndice
261
vi
CAPTULO 1
O CakePHP concebido para tornar tarefas de desenvolvimento web mais simples e fceis. Por fornecer
uma caixa de ferramentas completa para voc poder comear, o CakePHP funciona bem em conjunto ou
isoladamente.
O objetivo desta anlise introduzir os conceitos gerais presentes no CakePHP, e lhe dar uma rpida viso
geral de como estes conceitos so implementados. Se voc est vido para comear um projeto, voc pode
comear com o tutorial, ou mergulhar na documentao.
A camada Model
A camada Model representa a parte da sua aplicao que implementa a lgica de negcio. Ela responsvel por recuperar dados e convert-los nos conceitos significativos primrios na sua aplicao. Isto inclui
processar, validar, associar ou qualquer outra tarefa relacionada manipulao de dados.
No caso de uma rede social, a camada Model deveria tomar cuidado de tarefas como salvar os dados do
usurio, salvar as associaes entre amigos, salvar e recuperar fotos de usurios, localizar sugestes para
novos amigos, etc. Os objetos de modelo podem ser pensados como Friend, User, Comment, ou
Photo. Se ns quisssemos carregar alguns dados da nossa tabela users poderiamos fazer:
use Cake\ORM\TableRegistry;
$users = TableRegistry::get('Users');
$query = $users->find();
Voc pode notar que no precisamos escrever nenhum cdigo antes de podermos comear a trabalhar com
nossos dados. Por usar convenes, o CakePHP ir utilizar classes padro para tabelas e entidades ainda no
definidas.
Se ns quisssemos criar um usurio e salv-lo (com validao) fariamos algo assim:
use Cake\ORM\TableRegistry;
$users = TableRegistry::get('Users');
$user = $users->newEntity(['email' => 'mark@example.com']);
$users->save($user);
A camada View
A View renderiza uma apresentao de dados modelados. Estando separada dos objetos da Model, responsvel por utilizar a informao que tem disponvel para produzir qualquer interface de apresentao que a
sua aplicao possa precisar.
Por exemplo, a view pode usar dados da model para renderizar uma pgina HTML que os conhtenha, ou um
resultado formatado como XML:
// No arquivo view, ns renderizaremos um 'elemento' para cada usurio.
<?php foreach ($users as $user): ?>
<div class="user">
<?= $this->element('user', ['user' => $user]) ?>
</div>
<?php endforeach; ?>
A camada View prov alguma variedade de extenses como Elements e View Cells (Clulas de Visualizao)
para permitir que voc reutilize sua lgica de apresentao.
A camada View no est limitada somente a HTML ou apresentao textual dos dados. Ela pode ser usada
para entregar formatos de dado comuns como JSON, XML, e atravs de uma arquitetura encaixvel qualquer
outro formato que voc venha precisar.
A camada Controller
A camada Controller manipula requisies dos usurios. responsvel por renderizar uma resposta com o
auxlio de ambas as camadas, Model e View respectivamente.
Um controller pode ser visto como um gerente que certifica-se que todos os recursos necessrios para completar uma tarefa sejam delegados aos trabalhadores corretos. Ele aguarda por peties dos clientes, checa
suas validades de acordo com autenticao ou regras de autorizao, delega requisies ou processamento
de dados da camada Model, selecciona o tipo de dados de apresentao que os clientes esto aceitando, e
finalmente delega o processo de renderizao para a camada View. Um exemplo de controller para registro
de usurio seria:
public function add()
{
$user = $this->Users->newEntity();
if ($this->request->is('post')) {
$user = $this->Users->patchEntity($user, $this->request->data);
if ($this->Users->save($user, ['validate' => 'registration'])) {
$this->Flash->success(__('Voc est registrado.'));
} else {
$this->Flash->error(__('Houve algum problema.'));
}
}
$this->set('user', $user);
}
Voc pode perceber que ns nunca renderizamos uma view explicitamente. As convenes do CakePHP
tomaro cuidado de selecionar a view correta e renderiz-la como os dados definidos com set().
O cclo de requisio tpico do CakePHP comea com um usurio solicitando uma pgina ou recurso na sua
aplicao. Em alto nvel cada requisio vai atravs dos seguintes passos:
1. A requisio primeiramente processada pela suas rotas.
2. Depois da requisio ter sido roteada, o despachante ir selecionar o objeto de controller correto para
manipul-la.
3. A action do controller chamada e o controller interage com os models e components requisitados.
4. O controller delega a criao de resposta view para gerar os dados de sada resultantes dos dados do
model.
Apenas o Comeo
Esperamos que essa rpida viso geral tenha despertado seu interesse. Alguns outros grandes recursos no
CakePHP so:
Framework de cache que integra com Memcached, Redis e outros backends.
Poderosas ferramentas de gerao de cdigo para voc sair em disparada.
Framework de teste integrado para voc assegurar-se que seu cdigo funciona perfeitamente.
Os prximos passos bvios so baixar o CakePHP, ler o tutorial e construir algo fantstico.
Leitura adicional
Onde Conseguir Ajuda
O website oficial do CakePHP
http://www.cakephp.org
O website oficial do CakePHP sempre um timo lugar para visitar. Ele prov links para ferramentas
comunmente utilizadas por desenvolvedores, screencasts, oportunidades de doao e downloads.
O Cookbook
http://book.cakephp.org
Esse manual deveria ser o primeiro lugar para onde voc iria afim de conseguir respostas. Assim como
muitos outros projetos de cdigo aberto, ns conseguimos novos colaboradores regularmente. Tente o seu
melhor para responder suas questes por si s. Respostas vo vir lentamente, e provavelmente continuaro
longas. Voc pode suavizar nossa carga de suporte. Tanto o manual quanto a API possuem um componente
online.
A Bakery
http://bakery.cakephp.org
A padaria do CakePHP um local para todas as coisas relacionadas ao CakePHP. Visite-a para tutoriais, estudos de caso e exemplos de cdigo. Uma vez que voc tenha se familiarizado com o CakePHP,
autentique-se e compartilhe seu conhecimento com a comunidade, ganhe instantaneamente fama e fortuna.
A API
http://api.cakephp.org/
Diretamente ao ponto, dos desenvolvedores do ncleo do CakePHP, a API (Application Programming Interface) do CakePHP a mais compreensiva documentao sobre os detalhes tcnicos e minuciosos sobre do
funcionamento interno do framework.
Os Testes de Caso
Se voc sente que a informao provida pela API no suficiente, verifique os cdigos de testes de caso do
CakePHP. Eles podem servir como exemplos prticos para funes e e utilizao de dados referentes a uma
classe.:
tests/TestCase/
O canal de IRC
Canal de IRC na irc.freenode.net:
#cakephp Discusso geral
#cakephp-docs Documentao
#cakephp-bakery Bakery
#cakephp-fr Canal francs.
Se voc est travado, nos faa uma visita no canal de IRC do CakePHP. Algum do time de desenvolvimento1
normalmente est conectado, especiamente nos horrios diurnos da Amrica do Sul e Amrica do Norte.
Ns apreciaramos ouv-lo se voc precisar de ajuda, se quiser encontrar usurios da sua rea ou ainda se
quiser doar seu novo carro esporte.
Grupo oficial de discusso do CakePHP
Grupo de discusso do Google2
1
2
https://github.com/cakephp?tab=members
http://groups.google.com/group/cake-php
Leitura adicional
O CakePHP tambm possui seu grupo de discusso oficial no Google Grupos. Existem milhares de pessoas
discutindo projetos CakePHP, ajudando uns aos outros, resolvendo problemas, construindo projetos e compartilhando idias. Pode ser uma grande fonte para encontrar respostas arquivadas, perguntas frequentes e
conseguir respostas para problemas imediatos. Junte-se a outros usurios do CakePHP e comece a conversar.
Stackoverflow
http://stackoverflow.com/3
Marque suas questes com a tag cakephp e especifique a verso que voc est utilizando para permitir que
usurios do stackoverflow achem suas questes.
Onde conseguir ajuda em sua lngua
Francs
Convenes do CakePHP
Ns somos grandes fs de conveno sobre configurao. Apesar de levar um pouco de tempo para aprender
as convenes do CakePHP, voc economiza tempo a longo prazo. Ao seguir as convenes, voc ganha
funcionalidades instantaneamente e liberta-se do pesadelo de manuteno e rastreamento de arquivos de
configurao. Convenes tambm prezam por uma experincia de desenvolvimento uniforme, permitindo
que outros desenvolvedores ajudem mais facilmente.
Convenes para Controllers
Os nomes das classes de Controllers so pluralizados, CamelCased, e terminam em Controller.
PeopleController e LatestArticlesController so exemplos de nomes convencionais para
controllers.
Mtodos pblicos nos Controllers so frequentemente referenciados como actions acessveis atravs
de um navegador web. Por exemplo, o /articles/view mapeia para o mtodo view() do
ArticlesController sem nenhum esforo. Mtodos privados ou protegidos no podem ser acessados
pelo roteamento.
3
http://stackoverflow.com/questions/tagged/cakephp/
http://cakephp-fr.org
5
http://cakephp-br.org
4
Como voc acabou de ver, controllers singulares mapeiam facilmente um caminho simples, todo em minsculo. Por exemplo, ApplesController (o qual deveria ser definido no arquivo de nome ApplesController.php) acessado por http://example.com/apples.
Controllers com mltiplas palavras podem estar em qualquer forma flexionada igual ao nome do controller,
ento:
/redApples
/RedApples
/Red_apples
/red_apples
Todos resolvero para o index do controller RedApples. Porm, a forma correta que suas URLs sejam
minsculas e separadas por sublinhado, portanto /red_apples/go_pick a forma correta de acessar a action
RedApplesController::go_pick.
When you create links using this->Html->link(), you can use the following conventions for the url
array:
$this->Html->link('link-title', [
'prefix' => 'MyPrefix' // CamelCased
'plugin' => 'MyPlugin', // CamelCased
'controller' => 'ControllerName', // CamelCased
'action' => 'actionName' // camelBacked
]
Para mais informaes sobre o manuseio de URLs e parmetros do CakePHP, veja Connecting Routes.
Convenes para nomes de Classes e seus nomes de arquivos
No geral, nomes de arquivos correspondem aos nomes das classes, e seguem os padres PSR-0 ou PSR-4
para auto-carregamento. A seguir seguem exemplos de nomes de classes e de seus arquivos:
A classe de Controller KissesAndHugsController deveria ser encontrada em um arquivo nomeado
KissesAndHugsController.php
A classe de Component MyHandyComponent deveria ser encontrada em um arquivo nomeado MyHandyComponent.php
A classe de Table OptionValuesTable deveria ser encontrada em um arquivo nomeado OptionValuesTable.php.
A classe de Entity OptionValue deveria ser encontrada em um arquivo nomeado OptionValue.php.
A classe de Behavior EspeciallyFunkableBehavior deveria ser encontrada em um arquivo nomeado
EspeciallyFunkableBehavior.php
A classe de View SuperSimpleView deveria ser encontrada em um arquivo nomeado SuperSimpleView.php
Leitura adicional
Agora que voc foi introduzido aos fundamentos do CakePHP, voc pode tentar seguir atravs do Tutorial Criando um Blog - Parte 1 para ver como as coisas se encaixam juntas.
Leitura adicional
O diretrio webroot ser a raz pblica de documentos da sua aplicao. Ele contem todos os arquivos
que voc gostaria que fossem pblicos.
Certifique-se que os diretrios tmp e logs existem e so passveis de escrita, seno a performance de
sua aplicao ser severamente impactada. Em modo de debug, o CakePHP ir alert-lo se este for o
caso.
O diretrio src
O diretrio src do CakePHP onde voc far a maior parte do desenvolvimento de sua aplicao. Vamos
ver mais de perto a estrutura de pastas dentro de src.
Console Contm os comandos e tarefas de console para sua aplicao. Para mais informaes veja Console
e Shells.
Controller Contm os controllers de sua aplicao e seus componentes.
Locale Armazena arquivos textuais para internacionalizao.
Model Contm as tables, entities e behaviors de sua aplicao.
View Classes de apresentao so alocadas aqui: cells, helpers, e arquivos view.
Template Arquivos de apresentao so alocados aqui: elements, pginas de erro, layouts, e templates
view.
10
CAPTULO 2
A melhor forma de viver experincias e aprender sobre CakePHP sentar e construir algo. Para comear
ns iremos construir uma aplicao simples de blog.
Instalao do CakePHP
A maneira mais fcil de instalar o CakePHP usando Composer, um gerenciador de dependncias para o
PHP. uma forma simples de instalar o CakePHP a partir de seu terminal ou prompt de comando. Primeiro,
voc precisa baixar e instalar o Composer. Se voc tiver instalada a extenso cURL do PHP, execute o
seguinte comando:
curl -s https://getcomposer.org/installer | php
Ao invs disso, voc tambm pode baixar o arquivo composer.phar do site1 oficial.
1
https://getcomposer.org/download/
11
Em seguida, basta digitar a seguinte linha no seu terminal a partir do diretrio onde se localiza o arquivo
composer.phar para instalar o esqueleto de aplicaes do CakePHP no diretrio bookmarker.
php composer.phar create-project --prefer-dist cakephp/app bookmarker
A vantagem de usar Composer que ele ir completar automaticamente um conjunto importante de tarefas,
como configurar as permisses de arquivo e criar a sua config/app.php.
H outras maneiras de instalar o CakePHP. Se voc no puder ou no quiser usar Composer, veja a seo
Instalao.
Independentemente de como voc baixou o CakePHP, uma vez que sua instalao for concluda, a estrutura
dos diretrios deve ficar parecida com o seguinte:
/bookmarker
/bin
/config
/logs
/plugins
/src
/tests
/tmp
/vendor
/webroot
.editorconfig
.gitignore
.htaccess
.travis.yml
composer.json
index.php
phpunit.xml.dist
README.md
Agora pode ser um bom momento para aprender sobre como a estrutura de diretrios do CakePHP funciona:
Confira a seo Estrutura de pastas do CakePHP.
Isto ir iniciar o servidor embutido do PHP na porta 8765. Abra http://localhost:8765 em seu
navegador para ver a pgina de boas-vindas. Todas as verificaes devem estar checadas corretamente, a
no ser a conexo com banco de dados do CakePHP. Se no, voc pode precisar instalar extenses do PHP
adicionais, ou definir permisses de diretrio.
cake_bookmarks. Voc pode executar o seguinte SQL para criar as tabelas necessrias:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(255) NOT NULL,
password VARCHAR(255) NOT NULL,
created DATETIME,
modified DATETIME
);
CREATE TABLE bookmarks (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
title VARCHAR(50),
description TEXT,
url TEXT,
created DATETIME,
modified DATETIME,
FOREIGN KEY user_key (user_id) REFERENCES users(id)
);
CREATE TABLE tags (
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255),
created DATETIME,
modified DATETIME,
UNIQUE KEY (title)
);
CREATE TABLE bookmarks_tags (
bookmark_id INT NOT NULL,
tag_id INT NOT NULL,
PRIMARY KEY (bookmark_id, tag_id),
INDEX tag_idx (tag_id, bookmark_id),
FOREIGN KEY tag_key(tag_id) REFERENCES tags(id),
FOREIGN KEY bookmark_key(bookmark_id) REFERENCES bookmarks(id)
);
Voc deve ter notado que a tabela bookmarks_tags utilizada uma chave primria composta. O CakePHP
suporta chaves primrias compostas quase todos os lugares, tornando mais fcil construir aplicaes multiarrendados.
Os nomes de tabelas e colunas que usamos no foram arbitrrias. Usando convenes de nomenclatura
do CakePHP, podemos alavancar o desenvolvimento e evitar ter de configurar o framework. O CakePHP
flexvel o suficiente para acomodar at mesmo esquemas de banco de dados legados inconsistentes, mas
aderir s convenes vai lhe poupar tempo.
13
config/app.php pelos que se aplicam sua configurao. A amostra completa da gama de configuraes
pode ser algo como o seguinte:
return [
// Mais configurao acima.
'Datasources' => [
'default' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
'username' => 'cakephp',
'password' => 'AngelF00dC4k3~',
'database' => 'cake_bookmarks',
'encoding' => 'utf8',
'timezone' => 'UTC',
'cacheMetadata' => true,
],
],
// Mais configurao abaixo.
];
Depois de salvar o seu arquivo config/app.php, voc deve notar que a mensagem CakePHP is able to
connect to the database tem uma marca de verificao.
Nota:
Uma cpia do arquivo de configurao padro do CakePHP encontrado em config/app.default.php.
Isso ir gerar os controllers, models, views, seus casos de teste correspondentes, e fixtures
para os nossos users, bookmarks e tags.
Se voc parou seu servidor, reinicie-o e v para
http://localhost:8765/bookmarks.
Voc dever ver uma aplicao que d acesso bsico, mas funcional a tabelas de banco de dados. Adicione
alguns users, bookmarks e tags.
14
Este tambm um bom momento para falar sobre a camada de modelo. No CakePHP, separamos os mtodos
que operam em uma coleo de objetos, e um nico objeto em diferentes classes. Mtodos que operam na
recolha de entidades so colocadas na classe Table, enquanto as caractersticas pertencentes a um nico
registro so colocados na classe Entity.
Por exemplo, a criptografia de senha feita no registro individual, por isso vamos implementar esse comportamento no objeto entidade. Dada a circunstncia de ns querermos criptografar a senha cada vez que
definida, vamos usar um mtodo modificador/definidor. O CakePHP vai chamar mtodos de definio
baseados em convenes a qualquer momento que uma propriedade definida em uma de suas entidades.
Vamos adicionar um definidor para a senha. Em src/Model/Entity/User.php adicione o seguinte:
namespace App\Model\Entity;
use Cake\ORM\Entity;
use Cake\Auth\DefaultPasswordHasher;
class User extends Entity
{
// Code from bake.
protected function _setPassword($value)
{
$hasher = new DefaultPasswordHasher();
return $hasher->hash($value);
}
}
Agora atualize um dos usurios que voc criou anteriormente, se voc alterar sua senha, voc deve ver um
senha criptografada ao invs do valor original nas pginas de lista ou visualizao. O CakePHP criptografa
senhas com bcrypt2 por padro. Voc tambm pode usar sha1 ou md5 caso venha a trabalhar com um banco
de dados existente.
http://codahale.com/how-to-safely-store-a-password/
15
}
);
Criando a view
Agora, se voc visitar a URL /bookmarks/tagged, o CakePHP ir mostrar um erro e deix-lo saber
que voc ainda no fez um arquivo view. Em seguida, vamos construir o arquivo view para a nossa ao
tags. Em src/Template/Bookmarks/tags.ctp coloque o seguinte contedo:
16
<h1>
Bookmarks tagged with
<?= $this->Text->toList($tags) ?>
</h1>
<section>
<?php foreach ($bookmarks as $bookmark): ?>
<article>
<h4><?= $this->Html->link($bookmark->title, $bookmark->url) ?></h4>
<small><?= h($bookmark->url) ?></small>
<?= $this->Text->autoParagraph($bookmark->description) ?>
</article>
<?php endforeach; ?>
</section>
O CakePHP espera que os nossos templates sigam a conveno de nomenclatura onde o nome do template
a verso minscula e grifada do nome da ao do controller.
Voc pode perceber que fomos capazes de utilizar as variveis $tags e bookmarks em nossa view.
Quando usamos o mtodo set() em nosso controller, automaticamente definimos variveis especficas
que devem ser enviadas para a view. A view vai tornar todas as variveis passadas disponveis nos templates
como variveis locais.
Em nossa view, usamos alguns dos helpers nativos do CakePHP. Helpers so usados para criar lgica reutilizvel para a formatao de dados, a criao de HTML ou outra sada da view.
Agora voc deve ser capaz de visitar a URL /bookmarks/tagged/funny e ver todas os bookmarks
com a tag funny.
At agora, ns criamos uma aplicao bsica para gerenciar bookmarks, tags e users. No entanto, todos
podem ver as tags de toda a gente. No prximo captulo, vamos implementar a autenticao e restringir os
bookmarks visveis para somente aqueles que pertencem ao usurio atual.
Agora v a Tutorial - Criando um Bookmarker - Parte 2 para continuar a construir sua aplicao ou
mergulhe na documentao para saber mais sobre o que CakePHP pode fazer por voc.
Adicionando login
No CakePHP, a autenticao feita por Components (Componentes). Os Components podem ser considerados como formas de criar pedaos reutilizveis de cdigo relacionado a controllers com uma caracterstica
especfica ou conceito. Os components tambm podem ligar-se ao evento do ciclo de vida do controller e
interagir com a sua aplicao. Para comear, vamos adicionar o AuthComponent a nossa aplicao. Ns
vamos querer muito que cada mtodo exija autenticao, por isso vamos acrescentar o AuthComponent em
nosso AppController:
Tutorial - Criando um Bookmarker - Parte 2
17
// Em src/Controller/AppController.php
namespace App\Controller;
use Cake\Controller\Controller;
class AppController extends Controller
{
public function initialize()
{
$this->loadComponent('Flash');
$this->loadComponent('Auth', [
'authenticate' => [
'Form' => [
'fields' => [
'username' => 'email',
'password' => 'password'
]
]
],
'loginAction' => [
'controller' => 'Users',
'action' => 'login'
]
]);
// Permite a ao display, assim nosso pages controller
// continua a funcionar.
$this->Auth->allow(['display']);
}
}
Acabamos de dizer ao CakePHP que queremos carregar os components Flash e Auth. Alm disso, temos
a configurao personalizada do AuthComponent, assim a nossa tabela users pode usar email como username. Agora, se voc for a qualquer URL, voc vai ser chutado para /users/login, que ir mostrar uma
pgina de erro j que no escrevemos o cdigo ainda. Ento, vamos criar a ao de login:
// Em src/Controller/UsersController.php
public function login()
{
if ($this->request->is('post')) {
$user = $this->Auth->identify();
if ($user) {
$this->Auth->setUser($user);
return $this->redirect($this->Auth->redirectUrl());
}
$this->Flash->error('Your username or password is incorrect.');
}
}
18
<h1>Login</h1>
<?= $this->Form->create() ?>
<?= $this->Form->input('email') ?>
<?= $this->Form->input('password') ?>
<?= $this->Form->button('Login') ?>
<?= $this->Form->end() ?>
Agora que temos um simples formulrio de login, devemos ser capazes de efetuar login com um dos users
que tenham senha criptografada.
Nota: Se nenhum de seus users tem senha criptografada, comente a linha loadComponent(Auth).
Ento v e edite o user, salvando uma nova senha para ele.
Agora voc deve ser capaz de entrar. Se no, certifique-se que voc est usando um user que tenha senha
criptografada.
Adicionando logout
Agora que as pessoas podem efetuar o login, voc provavelmente vai querer fornecer uma maneira de encerrar a sesso tambm. Mais uma vez, no UsersController, adicione o seguinte cdigo:
public function logout()
{
$this->Flash->success('You are now logged out.');
return $this->redirect($this->Auth->logout());
}
Agora voc pode visitar /users/logout para sair e ser enviado pgina de login.
Ativando inscries
Se voc no estiver logado e tentar visitar / usurios / adicionar voc vai ser expulso para a pgina de login.
Devemos corrigir isso se quisermos que as pessoas se inscrevam em nossa aplicao. No UsersController
adicione o seguinte:
public function beforeFilter(\Cake\Event\Event $event)
{
$this->Auth->allow(['add']);
}
O texto acima diz ao AuthComponent que a ao add no requer autenticao ou autorizao. Voc pode
querer dedicar algum tempo para limpar a /users/add e remover os links enganosos, ou continuar para a
prxima seo. Ns no estaremos construindo a edio do usurio, visualizao ou listagem neste tutorial,
ento eles no vo funcionar, j que o AuthComponent vai negar-lhe acesso a essas aes do controller.
19
Restringindo acesso
Agora que os usurios podem conectar-se, ns vamos querer limitar os bookmarks que podem ver para
aqueles que fizeram. Ns vamos fazer isso usando um adaptador de autorizao. Sendo os nossos requisitos bastante simples, podemos escrever um cdigo em nossa BookmarksController. Mas antes
de fazer isso, vamos querer dizer ao AuthComponent como nossa aplicao vai autorizar aes. Em seu
AppController adicione o seguinte:
public function isAuthorized($user)
{
return false;
}
Vamos usar como padro, negao do acesso, e de forma incremental conceder acesso onde faa sentido.
Primeiro, vamos adicionar a lgica de autorizao para os bookmarks. Em seu BookmarksController
adicione o seguinte:
public function isAuthorized($user)
{
$action = $this->request->params['action'];
// As aes add e index so permitidas sempre.
if (in_array($action, ['index', 'add', 'tags'])) {
20
return true;
}
// Todas as outras aes requerem um id.
if (empty($this->request->params['pass'][0])) {
return false;
}
// Checa se o bookmark pertence ao user atual.
$id = $this->request->params['pass'][0];
$bookmark = $this->Bookmarks->get($id);
if ($bookmark->user_id == $user['id']) {
return true;
}
return parent::isAuthorized($user);
}
Agora, se voc tentar visualizar, editar ou excluir um bookmark que no pertena a voc, voc deve ser
redirecionado para a pgina de onde veio. No entanto, no h nenhuma mensagem de erro sendo exibida,
ento vamos corrigir isso a seguir:
// In src/Template/Layout/default.ctp
// Under the existing flash message.
<?= $this->Flash->render('auth') ?>
21
$this->set(compact('bookmark', 'tags'));
}
View de listagem
Agora, ns precisamos apenas exibir bookmarks para o user logado. Ns podemos fazer isso ao atualizar a
chamada para paginate(). Altere sua ao index:
public function index()
{
$this->paginate = [
'conditions' => [
'Bookmarks.user_id' => $this->Auth->user('id'),
]
];
$this->set('bookmarks', $this->paginate($this->Bookmarks));
}
Ns tambm devemos atualizar a action tags() e o mtodo localizador relacionado, mas vamos deixar
isso como um exerccio para que voc conclua por s.
22
Isso vai nos deixar acessar a propriedade computada $bookmark->tag_string. Vamos usar essa propriedade em inputs mais tarde. Lembre-se de adicionar a propriedade tag_string a lista _accessible
em sua entidade.
Em src/Model/Entity/Bookmark.php adicione o tag_string ao _accessible desta forma:
protected $_accessible = [
'user_id' => true,
'title' => true,
'description' => true,
'url' => true,
'user' => true,
'tags' => true,
'tag_string' => true,
];
Atualizando as views
Com a entidade atualizado, podemos adicionar uma nova entrada para as nossas tags. Nas views add e edit,
substitua tags._ids pelo seguinte:
<?= $this->Form->input('tag_string', ['type' => 'text']) ?>
23
usar um mtodo beforeSave para analisar a cadeia tag e encontrar/construir as entidades relacionadas.
Adicione o seguinte em src/Model/Table/BookmarksTable.php:
public function beforeSave($event, $entity, $options)
{
if ($entity->tag_string) {
$entity->tags = $this->_buildTags($entity->tag_string);
}
}
protected function _buildTags($tagString)
{
$new = array_unique(array_map('trim', explode(',', $tagString)));
$out = [];
$query = $this->Tags->find()
->where(['Tags.title IN' => $new]);
// Remove tags existentes da lista de novas tags.
foreach ($query->extract('title') as $existing) {
$index = array_search($existing, $new);
if ($index !== false) {
unset($new[$index]);
}
}
// Adiciona tags existentes.
foreach ($query as $tag) {
$out[] = $tag;
}
// Adiciona novas tags.
foreach ($new as $tag) {
$out[] = $this->Tags->newEntity(['title' => $tag]);
}
return $out;
}
Embora esse cdigo seja um pouco mais complicado do que o que temos feito at agora, ele ajuda a mostrar
o quo poderosa a ORM do CakePHP . Voc pode facilmente manipular resultados da consulta usando os
mtodos de Collections (Colees), e lidar com situaes em que voc est criando entidades sob demanda
com facilidade.
Terminando
Ns expandimos nossa aplicao bookmarker para lidar com situaes de autenticao e controle de autorizao/acesso bsico. Ns tambm adicionamos algumas melhorias agradveis UX, aproveitando os
recursos FormHelper e ORM.
Obrigado por dispor do seu tempo para explorar o CakePHP. Em seguida, voc pode saber mais sobre o
Models (Modelos), ou voc pode ler os /topics.
24
CAPTULO 3
Esta pgina resume as alteraes do CakePHP 2.x e ir auxiliar na migrao do seu projeto para a verso 3.0,
e tambm ser uma referncia para atualiz-lo quanto s principais mudanas do branch 2.x. Certifique-se
de ler tambm as outras pginas nesse guia para conhecer todas as novas funcionalidades e mudanas na
API.
Requerimentos
O CakePHP 3.x suporta o PHP 5.4.16 e acima.
O CakePHP 3.x precisa da extenso mbstring.
O CakePHP 3.x precisa da extenso intl.
Aviso: O CakePHP 3.0 no ir funcionar se voc no atender aos requisitos acima.
Ferramenta de atualizao
Enquanto este documento cobre todas as alteraes e melhorias feitas no CakePHP 3.0, ns tambm criamos
uma aplicao de console para ajudar voc a completar mais facilmente algumas das alteraes mecnicas
que consomem tempo. Voc pode pegar a ferramenta de atualizao no github1 .
https://github.com/cakephp/upgrade
http://www.php-fig.org/psr/psr-4/
3
https://github.com/cakephp/app
2
25
Namespaces
Todas as classes do core do CakePHP agora usam namespaces e seguem as especificaes de autoload (autocarregamento) do PSR-4. Por exemplo src/Cache/Cache.php tem o namespace Cake\Cache\Cache.
Constantes globais e mtodos de helpers como __() e debug() no usam namespaces por questes de
convenincia.
Constantes removidas
As seguintes constantes obsoletas foram removidas:
IMAGES
CSS
JS
IMAGES_URL
JS_URL
CSS_URL
DEFAULT_LANGUAGE
Configurao
As configuraes no CakePHP 3.0 esto significativamente diferentes que nas verses anteriores. Voc deve
ler a documentao Configurao para ver como a configurao feita.
Voc no pode mais usar o App::build() para configurar caminhos adicionais de classes. Ao invs
disso, voc deve mapear caminhos adicionais usando o autoloader da sua aplicao. Veja a seo Caminhos
de Classes Adicionais para mais informaes.
Trs novas variveis de configurao fornecem o caminho de configurao para plugins, views
e arquivos de localizao. Voc pode adicionar vrios caminhos em App.paths.templates,
App.paths.plugins, App.paths.locales para configurar mltiplos caminhos para templates,
plugins e arquivos de localizao respectivamente.
A chave de configurao www_root mudou para wwwRoot devido a consistncia. Por favor, ajuste seu arquivo de configurao app.php assim como qualquer uso de Configure::read(App.wwwRoot).
4
26
http://getcomposer.org
Novo ORM
O CakePHP 3.0 possui um novo ORM que foi refeito do zero. O novo ORM significativamente diferente
e incompatvel com o anterior. Migrar para o novo ORM necessita de alteraes extensas em qualquer
aplicao que esteja sendo atualizada. Veja a nova documentao Models (Modelos) para informaes de
como usar o novo ORM.
Bsico
O LogError() foi removido, ele no tinha vantagens e era raramente ou mesmo, nunca usado.
As seguintes funes globais foram removidas: config(), cache(), clearCache(),
convertSlashes(), am(), fileExistsInPath(), sortByKey().
Debug
A funo Configure::write(debug, $bool) no suporta mais 0/1/2. Um boleano simples usado para mudar o modo de debug para ligado ou desligado.
Especificaes/Configuraes de objetos
Os objetos usados no CakePHP agora tem um sistema consistente de armazenamento/recuperao
de configurao-de-instncia.
Os cdigos que anteriormente acessavam, por exemplo
$object->settings, devem ser atualizados para usar $object->config() alternativamente.
Cache
Memcache foi removido, use Cake\Cache\Cache\Engine\Memcached alternativamente.
Cache engines so carregados sob demanda no primeiro uso.
Cake\Cache\Cache::engine() foi adicionado.
Cake\Cache\Cache::enabled() foi adicionado.
Cache.disable.
Novo ORM
27
Cache::set() foi removido. recomendado criar mltiplas configuraes de cache para substituir
ajustes de configurao em tempo de execuo anteriormente possveis com Cache::set().
Todas as subclasses CacheEngine agora implementam um mtodo config().
Cake\Cache\Cache::readMany(),
Cake\Cache\Cache::deleteMany(),
Cake\Cache\Cache::writeMany() foram adicionados.
Core
App
App::pluginPath() foi removido. Use CakePlugin::path() alternativamente.
App::build() foi removido.
App::location() foi removido.
App::paths() foi removido.
App::load() foi removido.
App::objects() foi removido.
App::RESET foi removido.
App::APPEND foi removido.
App::PREPEND foi removido.
App::REGISTER foi removido.
Plugin
O Cake\Core\Plugin::load() no configura a carga automtica a menos que voc defina a
opo autoload como true.
Quanto estiver carregando plugins voc no pode mais fornecer um callable.
Quanto estiver carregando plugins voc no pode mais fornecer um array de arquivos de configurao
para carregar.
Configure
O Cake\Configure\PhpReader foi renomeado para Cake\Core\Configure\EnginePhpConfig
28
foi
renomeado
para
Object
A classe Object foi removida. Ela anteriormente continha um monte de mtodos que eram utilizados em
vrios locais no framework. O mais til destes mtodos foi extraido como um trait. Voc pode usar o
Cake\Log\LogTrait para acessar o mtodo log(). O Cake\Routing\RequestActionTrait
fornece o mtodo requestAction().
Console
O executvel cake foi movido do diretrio app/Console para o diretrio bin dentro do esqueleto da
aplicao. Voc pode agora invocar o console do CakePHP com bin/cake.
TaskCollection Substitudo
Essa classe foi renomeada para Cake\Console\TaskRegistry. Veja a seo em Objetos de Registro para mais informaes sobre funcionalidades fornecidas pela nova classe. Voc pode usar o cake
upgrade rename_collections para ajuda ao atualizar seu cdigo. Tarefas no tem mais acesso a
callbacks, como nunca houve nenhum callback para se usar.
Shell
O Shell::__construct()
Cake\Console\ConsoleIo.
foi
alterado.
Ele
agora
usa
uma
instncia
de
29
ConsoleOptionParser
O ConsoleOptionParser::merge() foi adicionado para mesclar os parsers.
ConsoleInputArgument
O ConsoleInputArgument::isEqualTo() foi adicionado para comparar dois argumentos.
Shell / Tarefa
Os Shells e Tarefas foram movidas de Console/Command e Console/Command/Task para Shell
e Shell/Task, respectivamente.
ApiShell Removido
O ApiShell foi removido pois ele no fornecia nenhum beneficio alm do prprio arquivo fonte e da documentao/API5 online.
SchemaShell Removido
O SchemaShell foi removido como ele nunca foi uma implementao completa de migrao de banco de dados e surgiram ferramentas melhores como o Phinx6 . Ele foi substitudo pelo CakePHP Migrations Plugin7
que funciona como um empacotamento entre o CakePHP e o Phinx8 .
ExtractTask
O bin/cake i18n extract no inclui mais mensagens de validao sem traduo. Se voc
quiser mensagens de validao traduzidas voc deve encapsula-las com chamadas __() como qualquer
outro contedo.
BakeShell / TemplateTask
O Bake no faz mais parte do fonte do ncleo e suplantado pelo CakePHP Bake Plugin9
Os templates do Bake foram movidos para src/Template/Bake.
A sintaxe dos templates do Bake agora usam tags estilo erb (<% %>) para denotar lgica de template,
permitindo cdigo php ser tratado como texto plano.
O comando bake view foi renomeado para bake template.
5
http://api.cakephp.org/
https://phinx.org/
7
https://github.com/cakephp/migrations
8
https://phinx.org/
9
https://github.com/cakephp/bake
6
30
Eventos
O mtodo getEventManager(), foi removido de todos os objetos que continham. Um mtodo
eventManager() agora fornecido pelo EventManagerTrait. O EventManagerTrait contm a lgica de instanciao e manuteno de uma referncia para um gerenciador local de eventos.
O subsistema Event teve um monte de funcionalidades opcionais removidas. Quando despachar eventos
voc no poder mais usar as seguintes opes:
passParams Essa opo est agora ativada sempre implicitamente. Voc no pode desliga-la.
break Essa opo foi removida. Voc deve agora parar os eventos.
breakOn Essa opo foi removida. Voc deve agora parar os eventos.
Log
As configuraes do Log agora no imutveis. Se voc precisa alterar a configurao voc deve
primeiro derrubar a configurao e ento recria-la. Isso previne problemas de sincronizao com
opes de configurao.
Os mecanismos de Log agora so carregados tardiamente aps a primeira escrita nos logs.
O Cake\Log\Log::engine() foi adicionado.
Os seguintes mtodos foram removidos de Cake\Log\Log :: defaultLevels(), enabled(),
enable(), disable().
Voc no pode mais criar nveis personalizados usando Log::levels().
Quando configurar os loggers voc deve usar levels ao invs de types.
Voc no pode mais especificar nveis personalizados de log. Voc deve usar o conjunto padro de
nveis de log. Voc deve usar escopos de log para criar arquivos de log personalizados ou manipulaes especficas para diferentes sees de sua aplicao. Usando um nvel de log no padro ir
lanar uma exceo.
O Cake\Log\LogTrait foi adicionado. Voc pode usar este trait em suas classes para adicionar
o mtodo log().
O escopo de log passado para Cake\Log\Log::write() agora encaminhado para o mtodo
write() dos mecanismos de log de maneira a fornecer um melhor contexto para os mecanismos.
Os mecanismos de Log agora so necessrios para implementar Psr\Log\LogInterface
invs do prprio LogInterface do Cake.
Em geral, se voc herdou o
Cake\Log\Engine\BaseEngine voc s precisa renomear o mtodo write() para
log().
O Cake\Log\Engine\FileLog agora grava arquivos em ROOT/logs no lugar de
ROOT/tmp/logs.
Eventos
31
Roteamento
Parmetros Nomeados
Os parmetros nomeados foram removidos no 3.0. Os parmetros nomeados foram adicionados no 1.2.0
como uma verso bonita de parmetros de requisio. Enquanto o benefcio visual discutvel, os problemas criados pelos parmetros nomeados no so.
Os parmetros nomeados necessitam manipulao especial no CakePHP assim como em qualquer biblioteca
PHP ou JavaScript que necessite interagir com eles, os parmetros nomeados no so implementados ou
entendidos por qualquer biblioteca exceto o CakePHP. A complexidade adicionada e o cdigo necessrio
para dar suporte aos parmetros nomeados no justificam a sua existncia, e eles foram removidos. No lugar
deles, voc deve agora usar o padro de parmetros de requisio (querystring) ou argumentos passados
configurados nas rotas. Por padro o Router ir tratar qualquer parmetro adicional ao Router::url()
como argumentos de requisio.
Como muitas aplicaes ainda precisaro analisar URLs contendo parmetros nomeados, o
Cake\Routing\Router::parseNamedParams() foi adicionado para permitir compatibilidade
com URLs existentes.
RequestActionTrait
O Cake\Routing\RequestActionTrait::requestAction() teve algumas de suas
opes extras alteradas:
o options[url] agora options[query].
o options[data] agora options[post].
os parmetros nomeados no so mais suportados.
Roteador
Os parmetros nomeados foram removidos, veja acima para mais informaes.
A opo full_base foi substituda com a opo _full.
A opo ext foi substituda com a opo _ext.
As opes _scheme, _port, _host, _base, _full, _ext foram adicionadas.
As URLs em strings no so mais modificados pela adio de plugin/controller/nomes de prefixo.
A manipulao da rota padro de fallback foi removida. Se nenhuma rota combinar com o conjunto de parmetros, o / ser retornado.
As classes de rota so responsveis por toda gerao de URLs incluindo parmetros de requisio
(query string). Isso faz com que as rotas sejam muito mais poderosas e flexveis.
Parmetros
persistentes
foram
removidos.
Eles
foram
substitudos
pelo
Cake\Routing\Router::urlFilter() que permite um jeito mais flexvel para mudar
URLs sendo roteadas reversamente.
32
O
Router::parseExtensions()
foi
removido.
Use
o
Cake\Routing\Router::extensions() no lugar.
Esse mtodo deve ser chamado
antes das rotas serem conectadas. Ele no ir modificar rotas existentes.
O
Router::setExtensions()
foi
removido.
Cake\Routing\Router::extensions() no lugar.
Use
Route
O CakeRoute foi renomeado para Route.
A assinatura de match() mudou para match($url, $context = []).
Cake\Routing\Route::match() para mais informaes sobre a nova assinatura.
Veja
FilterAssetFilter
Os itens de plugins e temas manipulados pelo AssetFilter no so mais lidos via include, ao invs
disso eles so tratados como arquivos de texto plano. Isso corrige um nmero de problemas com
bibliotecas javascript como TinyMCE e ambientes com short_tags ativadas.
O suporte para a configurao Asset.filter e ganchos foram removidos. Essa funcionalidade
pode ser facilmente substituda com um plugin ou filtro de despachante.
Roteamento
33
Rede
Requisio
O CakeRequest foi renomeada para Cake\Network\Request.
O Cake\Network\Request::port() foi adicionado.
O Cake\Network\Request::scheme() foi adicionado.
O Cake\Network\Request::cookie() foi adicionado.
O Cake\Network\Request::$trustProxy foi adicionado. Isso torna mais fcil colocar aplicaes CakePHP atrs de balanceadores de carga.
O Cake\Network\Request::$data no mais mesclado com a chave de dados prefixada, pois
esse prefixo foi removido.
O Cake\Network\Request::env() foi adicionado.
O Cake\Network\Request::acceptLanguage() mudou de um mtodo esttico para noesttico.
O detector de requisio para dispositivos mveis foi removido do ncleo. Agora o app template
adiciona detectores para dispositivos mveis usando a biblioteca MobileDetect.
O mtodo onlyAllow() foi renomeado para allowMethod() e no aceita mais argumentos
var. Todos os nomes de mtodos precisam ser passados como primeiro argumento, seja como string
ou como array de strings.
Resposta
O mapeamento do mimetype text/plain para extenso csv foi removido. Como consequncia o
Cake\Controller\Component\RequestHandlerComponent no define a extenso para
csv se o cabealho Accept tiver o mimetype text/plain que era um problema comum quando
recebia uma requisio XHR do jQuery.
Sesses
A classe de sesso no mais esttica, agora a sesso (session) pode ser acessada atravs do objeto de
requisio (request). Veja a documentao em Sessions para ver como usar o objeto de sesso.
O Cake\Network\Session e classes de sesso relacionadas foram movidas para o namespace
Cake\Network.
O SessionHandlerInterface foi removido em favor ao fornecido pelo prprio PHP.
A propriedade Session::$requestCountdown foi removida.
O funcionalidade de sesso checkAgent foi removida. Ela causava um monte de bugs quando
quadros do chrome e o flash player estavam envolvidos.
34
A conveno de nome para a tabela de sesso no banco de dados agora sessions ao invs de
cake_sessions.
O cookie de tempo limite da sesso atualizado automaticamente em conjunto com o tempo limite
dos dados de sesso.
O caminho padro para o cookie de sesso agora o caminho base da aplicao, ao invs de /. Alm
disso, uma nova varivel de configurao Session.cookiePath foi adicionada para facilitar a
personalizao do caminho para os cookies.
Um novo mtodo conveniente Cake\Network\Session::consume() foi adicionado para permitir a leitura e excluso de dados de sesso em um nico passo.
O valor padro do argumento $renew de Cake\Network\Session::clear() mudou de
true para false.
Network\Http
O HttpSocket agora Cake\Network\Http\Client.
O HttpClient foi reescrito do zero. Ele tem uma API mais simples/fcil de usar, suporta novos sistemas
de autenticao como OAuth, e uploads de arquivos. Ele usa as API de stream do PHP de modo que
no h requerimentp para o cURL. Veja a documentao Http Client para mais informaes.
Network\Email
O Cake\Network\Email\Email::config() agora usado para definir perfis de configurao. Isso substitui as classes EmailConfig nas verses anteriores.
O Cake\Network\Email\Email::profile() substitui o config() como modo de modificar opes de configurao por instncia.
O Cake\Network\Email\Email::drop() foi adicionado para permitir a remoo de configuraes de email.
O Cake\Network\Email\Email::configTransport() foi adicionado para permitir a
definio de configuraes de transporte. Essa mudana retira as opes de transporte dos perfis
de entrega e permite a voc reusar facilmente os transportes atravs de perfis de e-mails.
O Cake\Network\Email\Email::dropTransport() foi adicionado para permitir a remoo de configuraes de transporte.
Controller
Controller
As propriedades $helpers e $components agora esto mescladas com todas classes pai, no
apenas a AppController e o plugin de AppController. As propriedades so mescladas de modo
Network\Http
35
diferente agora tambm. No lugar de todas as configuraes em todas as classes serem mescladas juntas, as configuraes definidas nas classes filho sero usadas. Isso quer dizer que se voc tem alguma
configuraes definida no seu AppController, e alguma configurao definida em uma a subclasse,
apenas a configurao na subclasse ser usada.
O Controller::httpCodes() foi removido, use o Cake\Network\Response::httpCodes()
no lugar.
O
Controller::disableCache()
foi
Cake\Network\Response::disableCache() no lugar.
removido,
use
O Controller::flash() foi removido. Esse mtodo era raramente usado em aplicaes reais e
no tinha mais propsito algum.
O Controller::validate() e Controller::validationErrors() foram removidos.
Eles eram restos dos dias do 1.x onde as preocupaes com os models + controllers eram muito mais
entrelaados.
O Controller::loadModel() agora carrega uma tabela de objetos.
A propriedade Controller::$scaffold foi removida. O scaffolding dinmico foi removido do
ncleo do CakePHP. Um plugin de scaffolding melhorado, chamado CRUD, pode ser encontrado em:
https://github.com/FriendsOfCake/crud
A propriedade Controller::$ext foi removida. Voc deve agora estender e sobrescrever a propriedade View::$_ext se voc deseja usar uma extenso de arquivo de viso no padro.
A propriedade Controller::$methods foi removida.
Voc deve usar o
Controller::isAction() para determinar quando ou no um nome de mtodo uma
ao. Essa mudana foi feita para permitir personalizaes mais fceis do que vai contar ou no
como uma ao.
A propriedade Controller::$Components foi removida e substituda pelo _components.
Se voc precisar carregar componentes em tempo de execuo voc deve usar o
$this->loadComponent() em seu controller.
A assinatura do Cake\Controller\Controller::redirect() mudou para
Controller::redirect(string|array $url, int $status = null).
O terceiro argumento $exit foi removido. O mtodo no pode mais enviar resposta e sair do script, no
lugar ele retorna uma instncia de Response com os cabealhos apropriados definidos.
As propriedades mgicas base, webroot, here, data, action, e params foram removidas.
Voc deve acessar todas essas propriedades em $this->request no lugar.
Mtodos de controlar prefixados com sublinhado como _someMethod() no so mais tratados
como mtodos privados. Use as palavras chaves de visibilidade apropriadas no lugar. Somente mtodos pblicos podem ser usados como ao de controllers.
Scaffold Removido
O scaffolding dinmico no CakePHP foi removido do ncleo do CakePHP. Ele no era usado com frequncia, e no era voltado para uso em produo. Um plugin melhorado de scaffolding, chamado CRUD, pode
ser encontrado em: https://github.com/FriendsOfCake/crud
36
ComponentCollection Substitudo
Essa classe foi renomeada para Cake\Controller\ComponentRegistry. Veja a seo em Objetos
de Registro para mais informaes sobre as funcionalidades fornecidas pela nova classe. Voc pode usar o
cake upgrade rename_collections para ajudar voc a atualizar o seu cdigo.
Components
A propriedade _Collection agora _registry.
Cake\Controller\ComponentRegistry agora.
Todos components devem agora usar o mtodo config() para obter/definir configuraes.
A configurao padro para components deve ser definido na propriedade $_defaultConfig.
Essa propriedade automaticamente mesclada com qualquer configurao fornecida pelo construtor.
Opes de configurao no so mais definidas como propriedades pblicas.
O mtodo Component::initialize() no mais um event listener (ouvinte de eventos). Ao invs disso, ele um gancho ps-construtor como o Table::initialize() e
Controller::initialize(). O novo mtodo Component::beforeFilter() ligado
ao mesmo evento que o Component::initialize() costumava ser. O mtodo de inicializao
deve ter a seguinte assinatura initialize(array $config).
Controller\Components
CookieComponent
Ele usa o Cake\Network\Request::cookie() para ler os dados de cookies, isso facilita os
testes, e permite o ControllerTestCase definir os cookies.
Os Cookies encriptados pelas verses anteriores do CakePHP usando o mtodo cipher(), agora
no podem ser lidos, pois o Security::cipher() foi removido. Voc precisar reencriptar os
cookies com o mtodo rijndael() ou aes() antes de atualizar.
O CookieComponent::type() foi removido e substitudo com dados de configurao acessados
atravs de config().
O write() no aceita mais os parmetros encryption ou expires. Os dois agora so gerenciados atravs de dados de configurao. Veja CookieComponent para mais informaes.
O caminho padro para os cookies agora o caminho base da aplicao, ao invs de /.
AuthComponent
O Default agora o hasher de senhas padro usado pelas classes de autenticao. Ele usa exclusivamente o algoritmo de hash bcrypt. Se voc desejar continuar usando o hash SHA1 usado no 2.x,
use passwordHasher => Weak nas configuraes de seu autenticador.
Controller\Components
37
O novo FallbackPasswordHasher foi adicionado para ajudar os usurios migrar senhas antigas
de um algoritmo para o outro. Veja a documentao do AuthComponent para mais informaes.
A classe BlowfishAuthenticate foi removida. Apenas use FormAuthenticate.
A classe BlowfishPasswordHasher foi removida. Use o DefaultPasswordHasher no
lugar.
O mtodo loggedIn() foi removido. Use o user() no lugar.
As opes de configurao no so mais definidas como propriedades pblicas.
Os mtodos allow() e deny() no aceitam mais var args. Todos os nomes de mtodos precisam
ser passados como primeiro argumento, seja como string ou array de strings.
O mtodo login() foi removido e substitudo por setUser(). Para logar um usurio agora voc
deve chamar identify() que retorna as informaes do usurio caso identificado com sucesso e
ento usar setUser() para salvar as informaes na sesso de maneira persistente entre as requisies.
O BaseAuthenticate::_password() foi removido. Use a classe PasswordHasher no
lugar.
O BaseAuthenticate::logout() foi removido.
O AuthComponent agora dispara dois eventos Auth.afterIdentify e Auth.logout
aps um usurio ser identificado e antes de um usurio ser deslogado respectivamente. Voc
pode definir funes de callback para esses eventos retornando um array mapeado no mtodo
implementedEvents() de sua classe de autenticao.
Classes relacionadas a ACL foram movidas para um plugin separado. Hashers de senha, fornecedores de
Autenticao e Autorizao foram movidos para o namespace \Cake\Auth. Voc DEVE mover seus
fornecedores e hashers para o namespace App\Auth tambm.
RequestHandlerComponent
Os seguintes mtodos foram removidos do componente RequestHandler:
isAjax(),
isFlash(), isSSL(), isPut(), isPost(), isGet(), isDelete(). Use o mtodo
Cake\Network\Request::is() no lugar com o argumento relevante.
O
RequestHandler::setContent()
Cake\Network\Response::type() no lugar.
foi
removido,
use
O
RequestHandler::getReferer()
Cake\Network\Request::referer() no lugar.
foi
removido,
use
removido,
use
O
RequestHandler::getClientIP()
Cake\Network\Request::clientIp() no lugar.
foi
SecurityComponent
Os seguintes mtodos e as propriedades relacionadas foram removidas do componente Security: requirePost(), requireGet(), requirePut(), requireDelete(). Use o
Cake\Network\Request::allowMethod() no lugar.
SecurityComponent::$disabledFields()
SecurityComponent::$unlockedFields().
foi
removido,
use
SessionComponent
O SessionComponent::setFlash() est obsoleto. Voc deve usar o Flash no lugar.
Error
ExceptionRenderers
personalizados
agora
espera-se
que
retornem
ou
um
objeto
Cake\Network\Response ou uma string quando renderizando erros. Isso significa que qualquer
mtodo que manipule excees especficas devem retornar uma resposta ou valor de string.
Model
A camada de model do 2.x foi completamente reescrita e substituda. Voc deve revisar o Guia de atualizao para o novo ORM para saber como usar o novo ORM.
A classe Model foi removida.
A classe BehaviorCollection foi removida.
A classe DboSource foi removida.
A classe Datasource foi removida.
As vrias classes de fonte de dados foram removidas.
ConnectionManager
O ConnectionManager
Cake\Datasource.
Model
(gerenciador
de
conexo)
foi
movido
para
namespace
39
foi
adicionado.
Ele
substitui
Behaviors
Os mtodos de comportamentos (behaviors) prefixados com sublinhado como _someMethod() no
so mais tratados como mtodos privados. Use as palavras chaves de visibilidade.
TreeBehavior
O TreeBehavior foi completamente reescrito para usar o novo ORM. Embora ele funcione do mesmo modo
que no 2.x, alguns mtodos foram renomeados ou removidos:
TreeBehavior::children() agora uma busca personalizada find(children).
TreeBehavior::generateTreeList()
find(treeList).
agora
uma
busca
personalizada
Sute de Testes
Casos de Teste
O _normalizePath() foi adicionado para permitir testes de comparao de caminhos para executar em todos os sistemas operacionais, independente de sua configurao (\ no Windows vs / no
40
assertEqual($is,
View
Temas so agora Plugins Bsicos
Ter os temas e plugins de modo a criar components modulares da aplicao se provou limitado e confuso. No
CakePHP 3.0, temas no residem mais dentro da aplicao. Ao invs disso, eles so plugins independentes.
Isso resolveu alguns problemas com temas:
Voc no podia colocar temas nos plugins.
Temas no podiam fornecer helpers (helpers), ou classes de viso personalizadas.
Esses dois problemas foram resolvidos ao converter os temas em plugins.
41
As seguintes pastas de Viso foram renomeadas para evitar coliso de nomes com nomes de controllers:
Layouts agora Layout
Elements agora Element
Errors agora Error
Emails agora Email (o mesmo para Email dentro de Layout)
Classe View
A chave plugin foi removida do argumento $options de Cake\View\View::element().
Especifique o nome do elemento como AlgumPlugin.nome_do_elemento no lugar.
O View::getVar() foi removido, use o Cake\View\View::get() no lugar.
O View::$ext foi removido e no lugar uma propriedade protegida View::$_ext foi adicionada.
O View::addScript() foi removido. Use o Using View Blocks no lugar.
As propriedades mgicas base, webroot, here, data, action, e params foram removidas.
Ao invs disso, voc deve acessar todas essas propriedades no $this->request.
O View::start() no se liga mais a um bloco existente. Ao invs disso ele ir sobrescrever o
contedo do bloco quando o end() for chamado. Se voc precisa combinar o contedo de um bloco
voc dever buscar o contedo do bloco quando chamar o start uma segunda vez, ou usar o modo de
captura de append().
O View::prepend() no tem mais um modo de captura.
O View::startIfEmpty() foi removido. Agora que o start() sempre sobrescreve, o startIfEmpty
no tem mais propsito.
A propriedade View::$Helpers foi removida e substituda com _helpers. Se voc precisar
carregar helpers em tempo de execuo voc deve usar o $this->addHelper() em seus arquivos
de viso.
O View agora ir lanar Cake\View\Exception\MissingTemplateException quando
templates estiverem faltando, ao invs de MissingViewException.
ViewBlock
O ViewBlock::append() foi removido, use o Cake\ViewViewBlock::concat() no lugar. Entretanto o View::append() ainda existe.
42
JsonView
Agora os dados JSON tero as entidades HTML codificadas por padro. Isso previne possveis problemas de XSS quando o contedo de viso JSON est encapsulado em arquivos HTML.
O Cake\View\JsonView agora suporta a varivel de viso _jsonOptions. Isso permite a voc
configurar as opes de mscara de bits usadas ao gerar JSON.
XmlView
A Cake\View\XmlView agora suporta a varivel de viso _xmlOptions. Isso permite a voc
configurar as opes usadas quando gerar XML.
View\Helper
A propriedade $settings agora chamada $_config e deve ser acessada atravs do mtodo
config().
As opes de configurao no so mais definidas como propriedades pblicas.
O Helper::clean() foi removido. Ele nunca foi robusto o suficiente para prevenir completamente XSS. Ao invs disso voc deve escapar o contedo com h ou ou usar uma biblioteca dedicada
como o htmlPurifier.
O Helper::output() foi removido. Esse mtodo estava obsoleto no 2.x.
Os mtodos Helper::webroot(),
Helper::url(),
Helper::assetUrl(),
Helper::assetTimestamp()
foram
movidos
para
o
novo
ajudante
Cake\View\Helper\UrlHelper.
O Helper::url() est agora disponvel como
Cake\View\Helper\UrlHelper::build().
Os Assessores Mgicos a propriedades obsoletas foram removidos. A seguinte propriedade agora
deve ser acessada a partir do objeto de requisio:
base
here
webroot
data
action
params
Helpers
A classe Helper teve os seguintes mtodos removidos:
Helper::setEntity()
View\Helper
43
Helper::entity()
Helper::model()
Helper::field()
Helper::value()
Helper::_name()
Helper::_initInputField()
Helper::_selectedArray()
Esses mtodos eram partes usadas apenas pelo FormHelper, e parte de uma funcionalidade de persistncia
de campos que se mostrou problemtica com o tempo. O FormHelper no precisa mais destes mtodos e a
complexidades que eles provm no mais necessria.
Os seguintes mtodos foram removidos:
Helper::_parseAttributes()
Helper::_formatAttribute()
Esses mtodos podem agora ser encontrados na classe StringTemplate que os helpers usam com frequncia. Veja o StringTemplateTrait para um jeito fcil de integrar os templates de string em seus
prprios helpers.
FormHelper
O FormHelper foi completamente reescrito para o 3.0. Ele teve algumas grandes mudanas:
O FormHelper trabalha junto com o novo ORM. Mas tambm possui um sistema extensvel para
integrar com outros ORMs e fontes de dados.
O FormHelper possui um sistema de widgets extensvel que permite a voc criar novos widgets de
entrada personalizados e expandir facilmente aqueles inclusos no framework.
Os Templates de String so a fundao deste ajudante. Ao invs de encher de arrays por toda parte,
a maioria do HTML que o FormHelper gera pode ser personalizado em um lugar central usando
conjuntos de templates.
Alm dessas grandes mudanas, foram feitas algumas mudanas menores que causaram rompendo algumas
coisas da verso anterior. Essas mudanas devem simplificar o HTML que o FormHelper gera e reduzir os
problemas que as pessoas tinham no passado:
O prefixo data[ foi removido de todas as entradas geradas. O prefixo no tem mais propsito.
Os vrios mtodos de entradas independentes, como text(), select() e outros, no geram mais
atributos id.
A opo inputDefaults foi removida de create().
As opes default e onsubmit do create() foram removidas. No lugar voc deve usar
JavaScript event binding ou definir todos os cdigos js necessrios para o onsubmit.
O end() no gerar mais botes. Voc deve criar botes com button() ou submit().
44
http://getbootstrap.com/
http://foundation.zurb.com/
View\Helper
45
HtmlHelper
O HtmlHelper::useTag() foi removido, use tag() no lugar.
O HtmlHelper::loadConfig() foi removido. As tags podem ser personalizadas usando
templates() ou as configuraes de templates.
O segundo parmetro $options para HtmlHelper::css() agora sempre ir exigir um array.
O primeiro parmetro $data para HtmlHelper::style() agora sempre ir exigir um array.
O parmetro inline foi removido dos mtodos meta(), css(), script() e scriptBlock(). Ao invs
disso, voc deve usar a opo block. Definindo block => true ir emular o comportamento
anterior.
O HtmlHelper::meta() agora exige que o $type seja uma string. Opes adicionais podem
ser passadas como $options.
O HtmlHelper::nestedList() agora exige que o $options seja um array. O quarto argumento para o tipo tag foi removido e incluido no array $options.
O argumento $confirmMessage de Cake\View\Helper\HtmlHelper::link() foi removido. Voc deve usar agora a chave confirm no $options para especificar a menssagem.
PaginatorHelper
O link() foi removido. Ele no era mais usado internamente pelo ajudante. Ele era pouco usado
em cdigos de usurios e no se encaixava mais nos objetivos do ajudante.
O next() no tem mais as opes class ou tag. Ele no tem mais argumentos desabilitados. Ao
invs disso so usados templates.
O prev() no tem mais as opes class ou tag. Ele no tem mais argumentos desabilitados. Ao
invs disso so usados templates.
O first() no tem mais as opes after, ellipsis, separator, class ou tag.
O last() no tem mais as opes after, ellipsis, separator, class ou tag.
O numbers() no tem mais as opes separator, tag, currentTag, currentClass, class, tag e
ellipsis. Essas opes so agora facilitadas pelos templates. Ele tambm exige que agora o parmetro
$options seja um array.
46
TimeHelper
TimeHelper::__set(), TimeHelper::__get(), e TimeHelper::__isset() foram
removidos. Eles eram mtodos mgicos para atributos obsoletos.
O TimeHelper::serverOffset() foi removido. Ele provia prticas incorretas de operaes
com tempo.
O TimeHelper::niceShort() foi removido.
NumberHelper
O NumberHelper::format() agora exige que $options seja um array.
SessionHelper
O SessionHelper est obsoleto. Voc pode usar $this->request->session() diretamente, e a funcionalidade de mensagens flash foi movida para Flash.
JsHelper
O JsHelper e todos motores associados foram removidos. Ele podia gerar somente um subconjunto
muito pequeno de cdigos JavaScript para biblioteca selecionada e consequentemente tentar gerar
todo cdigo JavaScript usando apenas o ajudante se tornava um impedimento com frequncia.
recomendado usar diretamente sua biblioteca JavaScript preferida.
CacheHelper Removido
O CacheHelper foi removido. A funcionalidade de cache que ele fornecia no era padro, limitada e incompatvel com layouts no-HTML e views de dados. Essas limitaes significavam que uma reconstruo
completa era necessria. O ESI (Edge Side Includes) se tornou uma maneira padronizada para implementar
a funcionalidade que o CacheHelper costumava fornecer. Entretanto, implementando Edge Side Includes12
em PHP tem vrias limitaes e casos. Ao invs de construir uma soluo ruim, recomendado que os
desenvolvedores que precisem de cache de resposta completa use o Varnish13 ou Squid14 no lugar.
I18n
O subsistema de internacionalizao foi completamente reescrito. Em geral, voc pode esperar o mesmo
comportamento que nas verses anteriores, especialmente se voc est usando a famlia de funes __().
12
http://en.wikipedia.org/wiki/Edge_Side_Includes
http://varnish-cache.org
14
http://squid-cache.org
13
I18n
47
Internamente, a classe I18n usa Aura\Intl, e mtodos apropriados so expostos para dar acesso a
funes especficas da biblioteca. Por esta razo a maior parte dos mtodos dentro de I18n foram removidos ou renomeados.
Devido ao uso do ext/intl, a classe L10n foi removida completamente. Ela fornecia dados incompletos
e desatualizados em comparao com os dados disponveis na classe Locale do PHP.
O idioma padro da aplicao no ser mais alterado automaticamente pelos idiomas aceitos pelo navegador
nem por ter o valor Config.language definido na sesso do navegador. Voc pode, entretanto, usar um
filtro no despachante para trocar o idioma automaticamente a partir do cabealho Accept-Language
enviado pelo navegador:
// No config/bootstrap.php
DispatcherFactory::addFilter('LocaleSelector');
No h nenhum substituto incluso para selecionar automaticamente o idioma a partir de um valor configurado na sesso do usurio.
A funo padro para formatao de mensagens traduzidas no mais a sprintf, mas a mais avanada
e funcional classe MessageFormatter. Em geral voc pode reescrever os espaos reservados nas mensagens como segue:
// Antes:
__('Hoje um dia %s na %s', 'Ensolarado', 'Espanha');
// Depois:
__('Hoje um dia {0} na {1}', 'Ensolarado', 'Espanha');
Voc pode evitar ter de reescrever suas mensagens usando o antigo formatador sprintf:
I18n::defaultFormatter('sprintf');
Adicionalmente, o valor Config.language foi removido e ele no pode mais ser usado para controlar o
idioma atual da aplicao. Ao invs disso, voc pode usar a classe I18n:
// Antes
Configure::write('Config.language', 'fr_FR');
// Agora
I18n::locale('en_US');
para
Como agora o CakePHP requer a extenso mbstring, a classe Multibyte foi removida.
As mensagens de erro por todo o CakePHP no passam mais atravs das funes de internacionalizao. Isso foi feito para simplificar o ncleo do CakePHP e reduzir a sobrecarga. As mensagens
48
apresentadas aos desenvolvedores so raramente, isso quando, so de fato traduzidas - de modo que
essa sobrecarga adicional trs pouco beneficio.
Localizao
Agora o construtor de Cake\I18n\L10n recebe uma instncia de Cake\Network\Request
como argumento.
Testes
O TestShell foi removido. O CakePHP, o esqueleto da aplicao e novos plugins cozinhados,
todos usam o phpunit para rodar os testes.
O webrunner (webroot/test.php) foi removido. A adoo do CLI aumentou grandemente desde o
release inicial do 2.x. Adicionalmente, os CLI de execuo oferecem integrao superior com IDEs
e outras ferramentas automticas.
Se voc sentir necessidade de um jeito de executar os testes a partir de um navegador, voc deve
verificar o VisualPHPUnit15 . Ele oferece muitas funcionalidades adicionais que o antigo webrunner.
O ControllerTestCase est obsoleto e ser removido no CakePHP 3.0.0. Ao invs disso, voc
deve usar a nova funcionalidade Controller Integration Testing.
As Fixtures devem agora ser referenciadas usando sua forma no plural:
// No lugar de
$fixtures = ['app.artigo'];
// Voc deve usar
$fixtures = ['app.artigos'];
Utilitrios
Classe Set Removida
A classe Set foi removida, agora voc deve usar a classe Hash no lugar dela.
https://github.com/NSinopoli/VisualPHPUnit
Localizao
49
Inflexo
O valor padro para o argumento $replacement do Cake\Utility\Inflector::slug()
foi alterado do sublinhado (_) para o trao (-). Usando traos para separar palavras nas URLs a
escolha popular e tambm recomendada pelo Google.
As transliteraes para Cake\Utility\Inflector::slug() foram alteradas. Se voc usa
transliteraes personalizadas voc ter que atualizar seu cdigo. No lugar de expresses regulares,
as transliteraes usam simples substituies de string. Isso rendeu melhorias de performance significativas:
// No lugar de
Inflector::rules('transliteration', [
'/|/' => 'ae',
'//' => 'aa'
]);
// Voc deve usar
Inflector::rules('transliteration', [
'' => 'ae',
'' => 'ae',
'' => 'aa'
]);
Os conjuntos distintos de regras de no-inflexes e irregulares para pluralizao e singularizao foram removidos. No lugar agora temos uma lista comum para cada. Quando usar
Cake\Utility\Inflector::rules() com o tipo singular e plural voc no poder mais
usar chaves como uninflected e irregular no array de argumentos $rules.
Voc pode adicionar / sobrescrever a lista de regras de no-inflexionados e irregulares usando
Cake\Utility\Inflector::rules() com valores uninflected e irregular para o argumento $type.
Sanitize
A classe Sanitize foi removida.
Segurana
O Security::cipher() foi removido. Ele era inseguro e promovia prticas ruins de criptografia.
Voc deve usar o Security::encrypt() no lugar.
O valor de configurao Security.cipherSeed no mais necessrio. Com a remoo de
Security::cipher() ele no tem utilidade.
A retrocompatibilidade do Cake\Utility\Security::rijndael() para valores encriptados antes do CakePHP 2.3.1 foi removido.
Voc deve reencriptar os valores usando
Security::encrypt() e uma verso recente do CakePHP 2.x antes de migrar.
A habilidade para gerar um hash do tipo blowfish foi removido. Voc no pode mais usar
o tipo blowfish em Security::hash(). Deve ser usado apenas o password_hash() do
50
Data e Hora
O CakeTime foi renomeado para Cake\I18n\Time.
O CakeTime::serverOffset() foi removido. Ele provia prticas incorretas de operaes com
tempo.
O CakeTime::niceShort() foi removido.
O CakeTime::convert() foi removido.
O CakeTime::convertSpecifiers() foi removido.
O CakeTime::dayAsSql() foi removido.
O CakeTime::daysAsSql() foi removido.
O CakeTime::fromString() foi removido.
O CakeTime::gmt() foi removido.
O CakeTime::toATOM() foi renomeado para toAtomString.
O CakeTime::toRSS() foi renomeado para toRssString.
O CakeTime::toUnix() foi renomeado para toUnixString.
O CakeTime::wasYesterday() foi renomeado para isYesterday para combinar com o
resto da renomeao de mtodos.
O CakeTime::format() no usa mais o formato do sprintf, ao invs disso voc deve usar o
formato i18nFormat.
O Time::timeAgoInWords() agora exige que o $options seja um array.
A classe Time no mais uma coleo de mtodos estticos, ela estende o DateTime para herdar todos
seus mtodos e adicionar funes de formatao baseado em localizao com ajuda da extenso intl.
Em geral, expresses assim:
16
https://packagist.org/packages/ircmaxell/password-compat
Utilitrios
51
CakeTime::aMethod($date);
Nmeros
A biblioteca Number foi reescrita para usar internamente a classe NumberFormatter.
O CakeNumber foi renomeada para Cake\I18n\Number.
O Number::format() agora exige que o $options seja um array.
O Number::addFormat() foi removido.
O Number::fromReadableSize() foi movido para Cake\Utility\Text::parseFileSize().
Validao
A faixa de valores para Validation::range() agora inclusiva se $lower e $upper forem
fornecidos.
O Validation::ssn() foi removido.
Xml
O Xml::build() agora exige que o $options seja um array.
O Xml::build() no aceita mais uma URL. Se voc precisar criar um documento XML a partir
de uma URL, use o
52
CAPTULO 4
Nesta seo, voc poder caminhar atravs 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 e a Bakery (Padaria)2 para conhecer aplicaes e componentes existentes.
Instalao do CakePHP
A maneira mais fcil de instalar o CakePHP usando Composer, um gerenciador de dependncias para o
PHP. uma forma simples de instalar o CakePHP a partir de seu terminal ou prompt de comando. Primeiro,
voc precisa baixar e instalar o Composer. Se voc tiver instalada a extenso cURL do PHP, execute o
seguinte comando:
1
2
http://plugins.cakephp.org/
http://bakery.cakephp.org/
53
Ao invs disso, voc tambm pode baixar o arquivo composer.phar do site3 oficial.
Em seguida, basta digitar a seguinte linha no seu terminal a partir do diretrio onde se localiza o arquivo
composer.phar para instalar o esqueleto de aplicaes do CakePHP no diretrio bookmarker.
php composer.phar create-project --prefer-dist cakephp/app bookmarker
A vantagem de usar Composer que ele ir completar automaticamente um conjunto importante de tarefas,
como configurar as permisses de arquivo e criar a sua config/app.php.
H outras maneiras de instalar o CakePHP. Se voc no puder ou no quiser usar Composer, veja a seo
Instalao.
Independentemente de como voc baixou o CakePHP, uma vez que sua instalao for concluda, a estrutura
dos diretrios deve ficar parecida com o seguinte:
/bookmarker
/bin
/config
/logs
/plugins
/src
/tests
/tmp
/vendor
/webroot
.editorconfig
.gitignore
.htaccess
.travis.yml
composer.json
index.php
phpunit.xml.dist
README.md
Agora pode ser um bom momento para aprender sobre como a estrutura de diretrios do CakePHP funciona:
Confira a seo Estrutura de pastas do CakePHP.
Isto ir iniciar o servidor embutido do PHP na porta 8765. Abra http://localhost:8765 em seu
navegador para ver a pgina de boas-vindas. Todas as verificaes devem estar checadas corretamente, a
no ser a conexo com banco de dados do CakePHP. Se no, voc pode precisar instalar extenses do PHP
adicionais, ou definir permisses de diretrio.
3
54
https://getcomposer.org/download/
Voc deve ter notado que a tabela bookmarks_tags utilizada uma chave primria composta. O CakePHP
suporta chaves primrias compostas quase todos os lugares, tornando mais fcil construir aplicaes multiarrendados.
Os nomes de tabelas e colunas que usamos no foram arbitrrias. Usando convenes de nomenclatura
do CakePHP, podemos alavancar o desenvolvimento e evitar ter de configurar o framework. O CakePHP
flexvel o suficiente para acomodar at mesmo esquemas de banco de dados legados inconsistentes, mas
aderir s convenes vai lhe poupar tempo.
55
Depois de salvar o seu arquivo config/app.php, voc deve notar que a mensagem CakePHP is able to
connect to the database tem uma marca de verificao.
Nota:
Uma cpia do arquivo de configurao padro do CakePHP encontrado em config/app.default.php.
Isso ir gerar os controllers, models, views, seus casos de teste correspondentes, e fixtures
para os nossos users, bookmarks e tags.
Se voc parou seu servidor, reinicie-o e v para
http://localhost:8765/bookmarks.
Voc dever ver uma aplicao que d acesso bsico, mas funcional a tabelas de banco de dados. Adicione
alguns users, bookmarks e tags.
56
Agora atualize um dos usurios que voc criou anteriormente, se voc alterar sua senha, voc deve ver um
senha criptografada ao invs do valor original nas pginas de lista ou visualizao. O CakePHP criptografa
senhas com bcrypt4 por padro. Voc tambm pode usar sha1 ou md5 caso venha a trabalhar com um banco
de dados existente.
http://codahale.com/how-to-safely-store-a-password/
57
Router::scope(
'/bookmarks',
['controller' => 'Bookmarks'],
function ($routes) {
$routes->connect('/tagged/*', ['action' => 'tags']);
}
);
58
Criando a view
Agora, se voc visitar a URL /bookmarks/tagged, o CakePHP ir mostrar um erro e deix-lo saber
que voc ainda no fez um arquivo view. Em seguida, vamos construir o arquivo view para a nossa ao
tags. Em src/Template/Bookmarks/tags.ctp coloque o seguinte contedo:
<h1>
Bookmarks tagged with
<?= $this->Text->toList($tags) ?>
</h1>
<section>
<?php foreach ($bookmarks as $bookmark): ?>
<article>
<h4><?= $this->Html->link($bookmark->title, $bookmark->url) ?></h4>
<small><?= h($bookmark->url) ?></small>
<?= $this->Text->autoParagraph($bookmark->description) ?>
</article>
<?php endforeach; ?>
</section>
O CakePHP espera que os nossos templates sigam a conveno de nomenclatura onde o nome do template
a verso minscula e grifada do nome da ao do controller.
Voc pode perceber que fomos capazes de utilizar as variveis $tags e bookmarks em nossa view.
Quando usamos o mtodo set() em nosso controller, automaticamente definimos variveis especficas
que devem ser enviadas para a view. A view vai tornar todas as variveis passadas disponveis nos templates
como variveis locais.
Em nossa view, usamos alguns dos helpers nativos do CakePHP. Helpers so usados para criar lgica reutilizvel para a formatao de dados, a criao de HTML ou outra sada da view.
Agora voc deve ser capaz de visitar a URL /bookmarks/tagged/funny e ver todas os bookmarks
com a tag funny.
At agora, ns criamos uma aplicao bsica para gerenciar bookmarks, tags e users. No entanto, todos
podem ver as tags de toda a gente. No prximo captulo, vamos implementar a autenticao e restringir os
bookmarks visveis para somente aqueles que pertencem ao usurio atual.
Agora v a Tutorial - Criando um Bookmarker - Parte 2 para continuar a construir sua aplicao ou
mergulhe na documentao para saber mais sobre o que CakePHP pode fazer por voc.
59
Adicionando login
No CakePHP, a autenticao feita por Components (Componentes). Os Components podem ser considerados como formas de criar pedaos reutilizveis de cdigo relacionado a controllers com uma caracterstica
especfica ou conceito. Os components tambm podem ligar-se ao evento do ciclo de vida do controller e
interagir com a sua aplicao. Para comear, vamos adicionar o AuthComponent a nossa aplicao. Ns
vamos querer muito que cada mtodo exija autenticao, por isso vamos acrescentar o AuthComponent em
nosso AppController:
// Em src/Controller/AppController.php
namespace App\Controller;
use Cake\Controller\Controller;
class AppController extends Controller
{
public function initialize()
{
$this->loadComponent('Flash');
$this->loadComponent('Auth', [
'authenticate' => [
'Form' => [
'fields' => [
'username' => 'email',
'password' => 'password'
]
]
],
'loginAction' => [
'controller' => 'Users',
'action' => 'login'
]
]);
// Permite a ao display, assim nosso pages controller
// continua a funcionar.
$this->Auth->allow(['display']);
}
}
Acabamos de dizer ao CakePHP que queremos carregar os components Flash e Auth. Alm disso, temos
a configurao personalizada do AuthComponent, assim a nossa tabela users pode usar email como username. Agora, se voc for a qualquer URL, voc vai ser chutado para /users/login, que ir mostrar uma
pgina de erro j que no escrevemos o cdigo ainda. Ento, vamos criar a ao de login:
// Em src/Controller/UsersController.php
public function login()
{
if ($this->request->is('post')) {
$user = $this->Auth->identify();
if ($user) {
$this->Auth->setUser($user);
60
return $this->redirect($this->Auth->redirectUrl());
}
$this->Flash->error('Your username or password is incorrect.');
}
}
Agora que temos um simples formulrio de login, devemos ser capazes de efetuar login com um dos users
que tenham senha criptografada.
Nota: Se nenhum de seus users tem senha criptografada, comente a linha loadComponent(Auth).
Ento v e edite o user, salvando uma nova senha para ele.
Agora voc deve ser capaz de entrar. Se no, certifique-se que voc est usando um user que tenha senha
criptografada.
Adicionando logout
Agora que as pessoas podem efetuar o login, voc provavelmente vai querer fornecer uma maneira de encerrar a sesso tambm. Mais uma vez, no UsersController, adicione o seguinte cdigo:
public function logout()
{
$this->Flash->success('You are now logged out.');
return $this->redirect($this->Auth->logout());
}
Agora voc pode visitar /users/logout para sair e ser enviado pgina de login.
Ativando inscries
Se voc no estiver logado e tentar visitar / usurios / adicionar voc vai ser expulso para a pgina de login.
Devemos corrigir isso se quisermos que as pessoas se inscrevam em nossa aplicao. No UsersController
adicione o seguinte:
public function beforeFilter(\Cake\Event\Event $event)
{
$this->Auth->allow(['add']);
}
O texto acima diz ao AuthComponent que a ao add no requer autenticao ou autorizao. Voc pode
querer dedicar algum tempo para limpar a /users/add e remover os links enganosos, ou continuar para a
Tutorial - Criando um Bookmarker - Parte 2
61
prxima seo. Ns no estaremos construindo a edio do usurio, visualizao ou listagem neste tutorial,
ento eles no vo funcionar, j que o AuthComponent vai negar-lhe acesso a essas aes do controller.
Restringindo acesso
Agora que os usurios podem conectar-se, ns vamos querer limitar os bookmarks que podem ver para
aqueles que fizeram. Ns vamos fazer isso usando um adaptador de autorizao. Sendo os nossos requisitos bastante simples, podemos escrever um cdigo em nossa BookmarksController. Mas antes
de fazer isso, vamos querer dizer ao AuthComponent como nossa aplicao vai autorizar aes. Em seu
AppController adicione o seguinte:
public function isAuthorized($user)
{
return false;
}
Vamos usar como padro, negao do acesso, e de forma incremental conceder acesso onde faa sentido.
Primeiro, vamos adicionar a lgica de autorizao para os bookmarks. Em seu BookmarksController
adicione o seguinte:
62
Agora, se voc tentar visualizar, editar ou excluir um bookmark que no pertena a voc, voc deve ser
redirecionado para a pgina de onde veio. No entanto, no h nenhuma mensagem de erro sendo exibida,
ento vamos corrigir isso a seguir:
// In src/Template/Layout/default.ctp
// Under the existing flash message.
<?= $this->Flash->render('auth') ?>
63
View de listagem
Agora, ns precisamos apenas exibir bookmarks para o user logado. Ns podemos fazer isso ao atualizar a
chamada para paginate(). Altere sua ao index:
public function index()
{
$this->paginate = [
'conditions' => [
'Bookmarks.user_id' => $this->Auth->user('id'),
]
];
$this->set('bookmarks', $this->paginate($this->Bookmarks));
}
Ns tambm devemos atualizar a action tags() e o mtodo localizador relacionado, mas vamos deixar
isso como um exerccio para que voc conclua por s.
64
Isso vai nos deixar acessar a propriedade computada $bookmark->tag_string. Vamos usar essa propriedade em inputs mais tarde. Lembre-se de adicionar a propriedade tag_string a lista _accessible
em sua entidade.
Em src/Model/Entity/Bookmark.php adicione o tag_string ao _accessible desta forma:
protected $_accessible = [
'user_id' => true,
'title' => true,
'description' => true,
'url' => true,
'user' => true,
'tags' => true,
'tag_string' => true,
];
Atualizando as views
Com a entidade atualizado, podemos adicionar uma nova entrada para as nossas tags. Nas views add e edit,
substitua tags._ids pelo seguinte:
65
Embora esse cdigo seja um pouco mais complicado do que o que temos feito at agora, ele ajuda a mostrar
o quo poderosa a ORM do CakePHP . Voc pode facilmente manipular resultados da consulta usando os
mtodos de Collections (Colees), e lidar com situaes em que voc est criando entidades sob demanda
com facilidade.
Terminando
Ns expandimos nossa aplicao bookmarker para lidar com situaes de autenticao e controle de autorizao/acesso bsico. Ns tambm adicionamos algumas melhorias agradveis UX, aproveitando os
66
Instalao do CakePHP
A maneira mais fcil de instalar o CakePHP usando Composer, um gerenciador de dependncias para o
PHP. Se trata de uma forma simples de instalar o CakePHP a partir de seu terminal ou prompt de comando.
Primeiro, voc precisa baixar e instalar o Composer. Se possuir instalada a extenso cURL do PHP, execute
o seguinte comando:
curl -s https://getcomposer.org/installer | php
A vantagem de usar o Composer que ele ir completar automaticamente um conjunto importante de tarefas,
como configurar corretamente as permisses de pastas e criar o config/app.php para voc.
5
https://getcomposer.org/download/
67
H outras maneiras de instalar o CakePHP. Se voc no puder ou no quiser usar o Composer, confira a
seo Instalao.
Independentemente de como voc baixou o CakePHP, uma vez que sua instalao for concluda, a estrutura
dos diretrios deve ficar parecida com o seguinte:
/nome_do_app
/bin
/config
/logs
/plugins
/src
/tests
/tmp
/vendor
/webroot
.editorconfig
.gitignore
.htaccess
.travis.yml
composer.json
index.php
phpunit.xml.dist
README.md
Agora pode ser um bom momento para aprender sobre como a estrutura de diretrios do CakePHP funciona:
Confira a seo Estrutura de pastas do CakePHP.
Se por alguma razo o CakePHP no puder escrever nesses diretrios, voc ser informado por uma advertncia enquanto no estiver em modo de produo.
Embora no seja recomendado, se voc incapaz de redefinir as permisses do seu servidor web, voc
pode simplesmente alterar as permisses de gravao diretamente nos diretrios, executando os seguintes
comandos:
chmod 777 -R tmp
chmod 777 -R logs
68
Ns vamos tambm inserir alguns artigos para usarmos em nossos testes. Execute os seguintes comandos
SQL em seu banco de dados:
/* Ento inserimos articles para testes: */
INSERT INTO articles (title,body,created)
VALUES ('The title', 'This is the article body.', NOW());
INSERT INTO articles (title,body,created)
VALUES ('A title once again', 'And the article body follows.', NOW());
INSERT INTO articles (title,body,created)
VALUES ('Title strikes back', 'This is really exciting! Not.', NOW());
Os nomes de tabelas e colunas que usamos no foram arbitrrias. Usando convenes de nomenclatura do
CakePHP, podemos alavancar o desenvolvimento e acelerar a configurao do framework. O CakePHP
flexvel o suficiente para acomodar at mesmo esquemas de banco de dados legados inconsistentes, mas
aderir s convenes vai lhe poupar tempo.
69
Depois de salvar o arquivo config/app.php, voc deve notar a mensagem CakePHP is able to connect to the
database ao acessar o Blog pelo seu navegador.
Nota:
Uma cpia do arquivo de configurao padro do CakePHP pode ser encontrada em config/app.default.php.
Configuraes opcionais
H alguns outros itens que podem ser configurados. Muitos desenvolvedores completam esta lista de itens,
mas os mesmos no so obrigatrios para este tutorial. Um deles definir uma sequncia personalizada (ou
salt) para uso em hashes de segurana.
A sequncia personalizada (ou salt) utilizada para gerar hashes de segurana. Se voc utilizou o Composer,
ele cuidou disso para voc durante a instalao. Apesar disso, voc precisa alterar a sequncia personalizada
padro editando o arquivo config/app.php. No importa qual ser o novo valor, somente dever ser algo
difcil de descobrir:
'Security' => [
'salt' => 'algum valor longo contendo uma mistura aleatria de valores.',
],
70
Os arquivos de classes, correspondentes aos models, no CakePHP esto divididos entre os objetos Table e
Entity. Objetos Table provm acesso coleo de entidades armazenada em uma tabela e so alocados
em src/Model/Table.
O arquivo que criaremos dever ficar salvo em src/Model/Table/ArticlesTable.php:
// src/Model/Table/ArticlesTable.php
namespace App\Model\Table;
use Cake\ORM\Table;
class ArticlesTable extends Table
{
public function initialize(array $config)
{
$this->addBehavior('Timestamp');
}
}
Para mais informaes sobre o bake e suas caractersticas relacionadas a gerao de cdigo, visite o captulo
Gerao de cdigo com o Bake do manual.
Criando o controller
A seguir, criaremos um controller (controlador) para nossos artigos. O controller responsvel pela lgica de
interao da aplicao. o lugar onde voc utilizar as regras contidas nos models e executar tarefas relacionadas aos artigos. Criaremos um arquivo chamado ArticlesController.php no diretrio src/Controller:
// src/Controller/ArticlesController.php
namespace App\Controller;
71
Agora, vamos adicionar uma action (ao) ao nosso controller. Actions frequentemente, representam uma funo ou interface em uma aplicao. Por exemplo, quando os usurios requisitarem
www.example.com/articles/index (sendo o mesmo que www.example.com/articles/), eles esperam ver uma
lista de artigos:
// src/Controller/ArticlesController.php
namespace App\Controller;
class ArticlesController extends AppController
{
public function index()
{
$articles = $this->Articles->find('all');
$this->set(compact('articles'));
}
}
Ao definir a funo index() em nosso ArticlesController, os usurios podem acess-la requisitando www.example.com/articles/index. Similarmente, se definssemos uma funo chamada foobar(),
os usurios poderiam acess-la em www.example.com/articles/foobar.
Aviso: Vocs podem ser tentados a nomear seus controllers e actions para obter uma certa URL. Resista
a essa tentao. Siga as Convenes do CakePHP e crie nomes de action legveis e compreensveis. Voc
pode mapear URLs para o seu cdigo utilizando Roteamento.
A instruo na action usa set() para passar dados do controller para a view. A varivel definida como
articles, sendo igual ao valor retornado do mtodo find(all) do objeto ArticlesTable.
Nota: Se voc completou a primeira parte do tutorial e criou a tabela articles, voc pode tomar
proveito da capacidade de gerao de cdigo do bake atravs do console do CakePHP para criar o controller
ArticlesController:
bin/cake bake controller Articles
Para mais informaes sobre o bake e suas caractersticas sobre gerao de cdigo, visite o captulo Gerao
de cdigo com o Bake do manual.
Criando as views
Agora que ns temos os dados fluindo pelo nosso model, e nossa lgica da aplicao definida em nosso
controller, vamos criar uma view (visualizao) para a action index().
As views do CakePHP so camadas de apresentao que se encaixam nos layouts da aplicao. Para a
maioria das aplicaes, elas so uma mescla entre HTML e PHP, mas tambm podem ser distribudas como
72
<!-- Aqui onde iremos iterar nosso objeto de solicitao $articles, exibindo informa
<?php foreach ($articles as $article): ?>
<tr>
<td><?= $article->id ?></td>
<td>
<?= $this->Html->link($article->title, ['action' => 'view', $article->id]) ?>
</td>
<td>
<?= $article->created->format(DATE_RFC850) ?>
</td>
</tr>
<?php endforeach; ?>
</table>
Voc deve ter notado o uso de um objeto chamado $this->Html, uma instncia da classe
Cake\View\Helper\HtmlHelper do CakePHP. O CakePHP vem com um conjunto de view helpers
que simplificam tarefas como gerar links e formulrios. Voc pode aprender como us-los em Helpers (Facilitadores), mas aqui importante notar que o mtodo link() ir gerar um link HTML com o referido
ttulo (primeiro parmetro) e URL (segundo parmetro).
Quando se especifca URLs no CakePHP, recomendado o uso do formato de array. Isto ser melhor
explicado posteriormente na seo Rotas. Usando o formato de array para URLs, voc toma vantagem das
capacidades de roteamento reverso do CakePHP. Voc tambm pode especificar URLs relativas a base da
aplicao com o formato /controller/action/param1/param2 ou usar named routes.
Neste ponto, voc pode visitar http://www.example.com/articles/index no seu navegador. Voc deve ver sua
view corretamente formatada listando os artigos.
Se voc clicar no link do ttulo de um artigo listado, provavelmente ser informado pelo CakePHP que a
action ainda no foi definida, ento vamos cri-la no ArticlesController agora:
Tutorial - Criando um Blog - Parte 2
73
// src/Controller/ArticlesController.php
namespace App\Controller;
class ArticlesController extends AppController
{
public function index()
{
$this->set('articles', $this->Articles->find('all'));
}
public function view($id = null)
{
$article = $this->Articles->get($id);
$this->set(compact('article'));
}
}
O uso do set() deve parecer familiar. Repare que voc est usando get() ao invs de find(all)
porqu ns queremos a informao de apenas um artigo.
Repare que nossa action recebe um parmetro: o ID do artigo que gostariamos de visualizar. Esse parmetro
entregue para a action atravs da URL solicitada. Se o usurio requisitar /articles/view/3, ento o
valor 3 passado como $id para a action.
Ao usar a funo get(), fazemos tambm algumas verificaes para garantir que o usurio realmente
est acessando um registro existente , se no ou se o $id for indefinido, a funo ir lanar uma
NotFoundException.
Agora vamos criar a view para nossa action em src/Template/Articles/view.ctp
<!-- File: src/Template/Articles/view.ctp -->
<h1><?= h($article->title) ?></h1>
<p><?= h($article->body) ?></p>
<p><small>Criado: <?= $article->created->format(DATE_RFC850) ?></small></p>
Adicionando artigos
Primeiro, comece criando a action add() no ArticlesController:
// src/Controller/ArticlesController.php
namespace App\Controller;
use App\Controller\AppController;
74
Nota: Voc precisa incluir o Flash component em qualquer controller que v us-lo. Se necessrio,
inclua no AppController e assim o FlashComponent estar disponvel para todos os controllers da
aplicao.
A action add() checa se o mtodo HTTP da solicitao foi POST, e ento tenta salvar os dados utilizando
o model Articles. Se por alguma razo ele no salvar, apenas renderiza a view. Isto nos d a chance de exibir
erros de validao ou outros alertas.
Cada requisio do CakePHP instancia um objeto Request que acessvel usando $this->request.
O objeto contm informaes teis sobre a requisio que foi recebida e pode ser usado para controlar
o fluxo de sua aplicao. Nesse caso, ns usamos o mtodo Cake\Network\Request::is() para
checar se a requisio do tipo HTTP POST.
Quando se usa um formulrio para postar dados, essa informao fica disponvel em
$this->request->data. Voc pode usar as funes pr() ou debug() caso queira verificar
esses dados.
Tutorial - Criando um Blog - Parte 2
75
Usamos os mtodos success() e error() do FlashComponent para definir uma mensagem que
ser armazenada numa varivel de sesso. Esses mtodos so gerados usando os recursos de mtodos
mgicos6 do PHP. Mensagens flash sero exibidas na pgina aps um redirecionamento. No layout ns
temos <?= $this->Flash->render() ?> que exibe a mensagem e limpa a varivel de sesso. A
funo do controller Cake\Controller\Controller::redirect redireciona para qualquer outra
URL. O parmetro [action => index] corresponde a URL /articles, isto , a action index()
do ArticlesController. Voc pode consultar a funo Cake\Routing\Router::url() na
API7 e checar os formatos a partir dos quais voc pode montar uma URL.
Chamar o mtodo save() vai checar erros de validao e abortar o processo caso os encontre. Ns vamos
abordar como esses erros so tratados nas sesses a seguir.
Validando artigos
O CakePHP torna mais prtica e menos montona a validao de dados de formulrio.
Para tirar proveito dos recursos de validao, voc vai precisar usar o Form helper em suas views.
O Cake\View\Helper\FormHelper est disponvel por padro em todas as views pelo uso do
$this->Form.
Segue a view correspondente a action add:
<!-- File: src/Template/Articles/add.ctp -->
<h1>Add Article</h1>
<?php
echo $this->Form->create($article);
echo $this->Form->input('title');
echo $this->Form->input('body', ['rows' => '3']);
echo $this->Form->button(__('Salvar artigo'));
echo $this->Form->end();
?>
Ns usamos o FormHelper para gerar a tag de abertura HTML de um formulrio. Segue o HTML gerado
por $this->Form->create():
<form method="post" action="/articles/add">
Se create() chamado sem parmetros fornecidos, assume-se a construo de um formulrio que submete dados via POST para a action add() (ou edit() no caso de um id estar includo nos dados do
formulrio).
O mtodo $this->Form->input() usado para criar elementos do formulrio do mesmo nome. O
primeiro parmetro diz ao CakePHP qual o campo correspondente, e o segundo parmetro permite que
voc especifique um vasto array de opes, nesse, o nmero de linhas para o textarea. input() vai gerar
diferentes elementos de formulrios baseados no tipo de campo especificado no model.
O $this->Form->end() fecha o formulrio, entregando tambm elementos ocultos caso a preveno
contra CSRF/Form Tampering esteja habilitada.
6
7
76
http://php.net/manual/en/language.oop5.overloading.php#object.call
http://api.cakephp.org
Agora vamos voltar e atualizar nossa view src/Template/Articles/index.ctp para incluir um novo link.
Antes do <table>, adicione a seguinte linha:
<?= $this->Html->link('Adicionar artigo', ['action' => 'add']) ?>
Voc deve estar se perguntando: como eu digo ao CakePHP meus critrios de validao? Regras de validao so definidas no model. Vamos fazer alguns ajustes no nosso model:
// src/Model/Table/ArticlesTable.php
namespace App\Model\Table;
use Cake\ORM\Table;
use Cake\Validation\Validator;
class ArticlesTable extends Table
{
public function initialize(array $config)
{
$this->addBehavior('Timestamp');
}
public function validationDefault(Validator $validator)
{
$validator
->notEmpty('title')
->notEmpty('body');
return $validator;
}
}
O mtodo validationDefault() diz ao CakePHP como validar seus dados quando o mtodo save()
for solicitado. Aqui, estamos especificando que tanto o campo body quanto title no devem estar vazios.
O CakePHP possui muitos recursos de validao e um bom nmero de regras pr-determinadas (nmero
de cartes, endereos de email, etc), alm de flexibilidade para adicionar regras de validao customizadas.
Para mais informaes sobre configurao de validaes, visite a documentao em Validao.
Agora que suas regras de validao esto definidas, tente adicionar um artigo sem definir o
campo title e body para ver como a validao funciona. Desde que tenhamos usado o mtodo
Cake\View\Helper\FormHelper::input() do FormHelper para criar nossos elementos, nossas mensagens de alerta da validao sero exibidas automaticamente.
Editando artigos
Edio, a vamos ns! Voc j um profissional do CakePHP agora, ento possivelmente detectou um
padro... Cria-se a action e ento a view. Aqui segue a action edit() que dever ser inserida no
ArticlesController:
// src/Controller/ArticlesController.php
public function edit($id = null)
77
{
$article = $this->Articles->get($id);
if ($this->request->is(['post', 'put'])) {
$this->Articles->patchEntity($article, $this->request->data);
if ($this->Articles->save($article)) {
$this->Flash->success(__('Seu artigo foi atualizado.'));
return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__('Seu artigo no pde ser atualizado.'));
}
$this->set('article', $article);
}
Essa action primeiramente certifica-se que o registro apontado existe. Se o parmetro $id no foi passado
ou se o registro inexistente, uma NotFoundException lanada pelo ErrorHandler do CakePHP.
Em seguida, a action verifica se a requisio POST ou PUT e caso seja, os dados so usados para atualizar a entidade de artigo em questo ao usar o mtodo patchEntity(). Ento finalmente usamos o
ArticlesTable para salvar a entidade.
Segue a view correspondente a action edit:
<!-- File: src/Template/Articles/edit.ctp -->
<h1>Edit
<?php
echo
echo
echo
echo
echo
?>
Article</h1>
$this->Form->create($article);
$this->Form->input('title');
$this->Form->input('body', ['rows' => '3']);
$this->Form->button(__('Salvar artigo'));
$this->Form->end();
Essa view retorna o formulrio de edio com os dados populados, juntamente com qualquer mensagem de
erro proveniente de validaes.
O CakePHP ir determinar se o save() vai inserir ou atualizar um registro baseado nos dados da entidade.
Voc pode atualizar sua view index com os links para editar artigos:
<!-- File: src/Template/Articles/index.ctp
<h1>Blog articles</h1>
<p><?= $this->Html->link("Adicionar artigo", ['action' => 'add']) ?></p>
<table>
<tr>
<th>Id</th>
<th>Ttulo</th>
<th>Criado</th>
<th>Aes</th>
</tr>
<!-- Aqui onde iremos iterar nosso objeto de solicitao $articles, exibindo informaes
78
Deletando artigos
A seguir, vamos criar uma forma de deletar artigos.
ArticlesController:
// src/Controller/ArticlesController.php
public function delete($id)
{
$this->request->allowMethod(['post', 'delete']);
$article = $this->Articles->get($id);
if ($this->Articles->delete($article)) {
$this->Flash->success(__('O artigo com id: {0} foi deletado.', h($id)));
return $this->redirect(['action' => 'index']);
}
}
Essa lgica deleta o artigo especificado pelo $id e usa $this->Flash->success() para exibir uma
mensagem de confirmao aps o redirecionamento para /articles. Tentar excluir um registro usando
uma requisio GET, far com que o allowMethod() lance uma exceo. Excees so capturadas pelo
gerenciador de excees do CakePHP e uma pgina de erro exibida. Existem muitos Exceptions embutidos
que podem indicar variados erros HTTP que sua aplicao possa precisar.
Por estarmos executando apenas lgica e redirecionando, essa action no tem uma view. Vamos atualizar
nossa view index com links para excluir artigos:
<!-- File: src/Template/Articles/index.ctp (delete links added) -->
<h1>Blog articles</h1>
<p><?= $this->Html->link('Adicionar artigo', ['action' => 'add']) ?></p>
<table>
<tr>
<th>Id</th>
79
<th>Ttulo</th>
<th>Criado</th>
<th>Aes</th>
</tr>
<!-- Aqui onde iremos iterar nosso objeto de solicitao $articles, exibindo informa
<?php foreach ($articles as $article): ?>
<tr>
<td><?= $article->id ?></td>
<td>
<?= $this->Html->link($article->title, ['action' => 'view', $article->id]) ?>
</td>
<td>
<?= $article->created->format(DATE_RFC850) ?>
</td>
<td>
<?= $this->Form->postLink(
'Deletar',
['action' => 'delete', $article->id],
['confirm' => 'Tem certeza?'])
?>
<?= $this->Html->link('Edit', ['action' => 'edit', $article->id]) ?>
</td>
</tr>
<?php endforeach; ?>
</table>
Usar View\Helper\FormHelper::postLink() vai criar um link que usa JavaScript para criar uma
requisio POST afim de deletar um artigo.
Aviso: Permitir que registros sejam deletados usando requisies GET perigoso, pois rastreadores na
web podem acidentalmente deletar todo o seu contedo.
Nota: Esse cdigo da view tambm usa o FormHelper para confirmar a action atravs de JavaScript.
Rotas
Para muitos o roteamento padro do CakePHP funciona bem o suficiente. Desenvolvedores que consideram
facilidade de uso e SEO iro apreciar a forma como o CakePHP mapeia determinadas URLs para actions
especficas. Vamos realizar uma pequena mudana nas rotas neste tutorial.
Para mais informaes sobre tcnicas avanadas de roteamento, visite Connecting Routes.
Por padro, o CakePHP responde a uma requisio pela raz do seu site usando o PagesController, ao
renderizar uma view chamada home.ctp. Alternativamente, ns vamos substituir esse comportamento pelo
ArticlesController ao criar uma regra de roteamento.
A configurao de rotas do CakePHP pode ser encontrada em config/routes.php. Voc deve comentar ou
80
Essa linha conecta a URL / com a pgina padro do CakePHP. Ns queremos que ela conecte-se ao nosso
prprio controller, ento a substitua por esta:
$routes->connect('/', ['controller' => 'Articles', 'action' => 'index']);
Concluso
Simples, no ? Tenha em mente que esse foi um tutorial bsico. O CakePHP tem muito mais recursos a
oferecer. No abordamos outros tpicos aqui para manter a simplicidade. Use o restante do manual como
um guia para criar aplicaes mais ricas.
Agora que voc criou uma aplicao bsica no CakePHP, voc pode continuar no Tutorial - Criando
um Blog - Parte 3, ou comear seu prprio projeto. Voc tambm pode folhear os /topics ou a API
<http://api.cakephp.org/3.0> para aprender mais sobre o CakePHP.
Se voc precisar de ajuda, h muitas formas de conseguir, por favor, visite a pgina Onde Conseguir Ajuda
e bem-vindo(a) ao CakePHP!
Leitura complementar
Existem tpicos comuns que as pessoas que esto estudando o CakePHP normalmente visitam a seguir:
1. Layouts: Customizando o layout da aplicao
2. Elements: Incluso e reutilizao de elementos na view
3. Gerao de cdigo com o Bake: Gerando cdigo CRUD
4. Tutorial - Criando um Blog - Autenticao e Autorizao: Tutorial de autorizao e autenticao
81
Migrao de Plugin
Ns vamos usar o plugin de migraes para criar uma tabela em nosso banco de dados. Se voc tem
a tabela articles no seu banco de dados, apague. Agora abra o arquivo composer.json do seu aplicativo.
Normalmente, voc veria que o plugin de migrao j est requisitando. Se no, addicione atrves da
execuo:
composer require cakephp/migrations:~1.0
adicionar
Uma vez que o plugin est carregado, execute o seguinte comando para criar um arquivo de migrao:
82
}
}
Executar outro comando para criar uma tabela de categorias. Se voc precisar especificar um comprimento
de campo, voc pode faz-lo dentro de colchetes no tipo de campo, ou seja:
83
Agora que os arquivos de migrao esto criadas, voc pode edit-los antes de criar suas tabelas. Precisamos
mudar o null => false para o campo parent_id com null => true porque uma categoria de nvel
superior tem null no parent_id
Execute o seguinte comando para criar suas tabelas:
bin/cake migrations migrate
Modificando as Tabelas
Com nossas tabelas configuradas, agora podemos nos concentrar em categorizar os nossos artigos.
Supomos que voc j tem os arquivos (Tabelas, controladores e modelos dos artigos) da parte 2. Ento
vamos adicionar as referncias a categorias.
Precisamos associar os artigos e categorias juntos
src/Model/Table/ArticlesTable.php e adicione o seguinte:
nas
tabelas.
Abra
arquivo
// src/Model/Table/ArticlesTable.php
namespace App\Model\Table;
use Cake\ORM\Table;
class ArticlesTable extends Table
{
public function initialize(array $config)
{
$this->addBehavior('Timestamp');
// Just add the belongsTo relation with CategoriesTable
$this->belongsTo('Categories', [
'foreignKey' => 'category_id',
]);
}
}
A ferramenta bake criou todos os seus arquivos em um piscar de olhos. Voc pode fazer uma leitura rpida
se quiser familiarizar como o CakePHP funciona.
Nota: Se voc estiver no Windows lembre-se de usar em vez de /.
84
Voc
vai
precisar
editar
src/Template/Categories/edit.ctp:
seguinte
em
src/Template/Categories/add.ctp
echo $this->Form->input('parent_id', [
'options' => $parentCategories,
'empty' => 'No parent category'
]);
Com o TreeBehavior anexado voc vai ser capaz de acessar alguns recursos como a reordenao das categorias. Vamos ver isso em um momento.
Mas, por agora, voc tem que remover as seguintes entradas em seus Categorias de adicionar e editar arquivos de modelo:
echo $this->Form->input('lft');
echo $this->Form->input('rght');
Alm disso, voc deve desabilitar ou remover o requirePresence do validador, tanto para a lft e rght nas
colunas em seu modelo CategoriesTable:
public function validationDefault(Validator $validator)
{
$validator
->add('id', 'valid', ['rule' => 'numeric'])
->allowEmpty('id', 'create');
$validator
->add('lft', 'valid', ['rule' => 'numeric'])
//
->requirePresence('lft', 'create')
->notEmpty('lft');
$validator
->add('rght', 'valid', ['rule' => 'numeric'])
//
->requirePresence('rght', 'create')
->notEmpty('rght');
}
Esses campos so automaticamente gerenciados pelo TreeBehavior quando uma categoria salvo.
Usando seu navegador, adicione algumas novas categorias usando os /yoursite/categories/add
ao do controlador.
Tutorial - Criando um Blog - Parte 3
85
86
<th>Id</th>
<th>Parent Id</th>
<th>Lft</th>
<th>Rght</th>
<th>Name</th>
<th>Description</th>
<th>Created</th>
<th class="actions"><?= __('Actions') ?></th>
</tr>
</thead>
<tbody>
<?php foreach ($categories as $category): ?>
<tr>
<td><?= $category->id ?></td>
<td><?= $category->parent_id ?></td>
<td><?= $category->lft ?></td>
<td><?= $category->rght ?></td>
<td><?= h($category->name) ?></td>
<td><?= h($category->description) ?></td>
<td><?= h($category->created) ?></td>
<td class="actions">
<?= $this->Html->link(__('View'), ['action' => 'view', $category->id]) ?>
<?= $this->Html->link(__('Edit'), ['action' => 'edit', $category->id]) ?>
<?= $this->Form->postLink(__('Delete'), ['action' => 'delete', $category->i
<?= $this->Form->postLink(__('Move down'), ['action' => 'moveDown', $catego
<?= $this->Form->postLink(__('Move up'), ['action' => 'moveUp', $category->
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
Modificando o ArticlesController
Em nossa ArticlesController, vamos obter a lista de todas as categorias. Isto ir permitir-nos para escolher
uma categoria para um artigo ao criar ou editar ele:
// src/Controller/ArticlesController.php
namespace App\Controller;
use Cake\Network\Exception\NotFoundException;
class ArticlesController extends AppController
{
// ...
public function add()
{
$article = $this->Articles->newEntity();
if ($this->request->is('post')) {
$article = $this->Articles->patchEntity($article, $this->request->data);
87
if ($this->Articles->save($article)) {
$this->Flash->success(__('Your article has been saved.'));
return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__('Unable to add your article.'));
}
$this->set('article', $article);
// Just added the categories list to be able to choose
// one category for an article
$categories = $this->Articles->Categories->find('treeList');
$this->set(compact('categories'));
}
}
Quando voc vai para o endereo /yoursite/articles/add voc deve ver uma lista de categorias
para escolher.
88
password VARCHAR(255),
role VARCHAR(20),
created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL
);
Respeitado as convenes do CakePHP para nomear tabelas, mas tambm aproveitando de outras conveno: Usando as colunas username e password da tabela de usurios, CakePHP ser capaz de configurar automaticamente a maioria das coisas para ns, na implementao do login do usurio.
O prximo passo criar a nossa classe UsersTable, responsvel por encontrar, salvar e validar os dados do
usurio:
// src/Model/Table/UsersTable.php
namespace App\Model\Table;
use Cake\ORM\Table;
use Cake\Validation\Validator;
class UsersTable extends Table
{
public function validationDefault(Validator $validator)
{
return $validator
->notEmpty('username', 'Usurio necessrio')
->notEmpty('password', 'Senha necessria')
->notEmpty('role', 'Funo necessria')
->add('role', 'inList', [
'rule' => ['inList', ['admin', 'author']],
'message' => 'Por favor informe uma funo vlida'
]);
}
}
Vamos tambm criar o nosso UsersController. O contedo a seguir corresponde a partes de uma classe
UsersController bsica gerado atrves do utilitrio de gerao de cdigo bake fornecido com CakePHP:
// src/Controller/UsersController.php
namespace App\Controller;
use App\Controller\AppController;
use Cake\Event\Event;
class UsersController extends AppController
{
public function beforeFilter(Event $event)
{
parent::beforeFilter($event);
$this->Auth->allow('add');
}
89
Da mesma maneira que criamos as views para os nossos artigos usando a ferramenta de gerao de cdigo,
podemos implementar as views do usurio. Para o propsito deste tutorial, vamos mostrar apenas o
add.ctp:
<!-- src/Template/Users/add.ctp -->
<div class="users form">
<?= $this->Form->create($user) ?>
<fieldset>
<legend><?= __('Add User') ?></legend>
<?= $this->Form->input('username') ?>
<?= $this->Form->input('password') ?>
<?= $this->Form->input('role', [
'options' => ['admin' => 'Admin', 'author' => 'Author']
]) ?>
</fieldset>
<?= $this->Form->button(__('Submit')); ?>
<?= $this->Form->end() ?>
</div>
90
determinadas aes, a manipulao de login e logout de usurio, e tambm permite as aes para que
esto autorizados.
Para adicionar este componente em sua aplicao abra o arquivos src/Controller/AppController.php e
adicione as seguintes linha:
// src/Controller/AppController.php
namespace App\Controller;
use Cake\Controller\Controller;
use Cake\Event\Event;
class AppController extends Controller
{
//...
public function initialize()
{
$this->loadComponent('Flash');
$this->loadComponent('Auth', [
'loginRedirect' => [
'controller' => 'Articles',
'action' => 'index'
],
'logoutRedirect' => [
'controller' => 'Pages',
'action' => 'display',
'home'
]
]);
}
public function beforeFilter(Event $event)
{
$this->Auth->allow(['index', 'view', 'display']);
}
//...
}
No h muito para ser configurado, como usamos as convenes para a tabela de usurios. Ns apenas
configuramos as URLs que sero carregados aps o login e logout, ests aes so realizadas no nosso
caso para os /articles/ e / respectivamente.
O que fizemos na funo beforeFilter() foi dizer ao AuthComponent para no exigir login em
todos index() e view(), em cada controlador. Queremos que os nossos visitantes sejam capaz de ler e
listar as entradas sem registrar-se no site.
Agora, precisamos ser capaz de registrar novos usurios, salvar seu username e password, e mais
importante, o hash da senha para que ele no seja armazenado como texto simples no nosso banco de dados.
Vamos dizer ao AuthComponet para permitir que usurios deslogados acessem a funo add e execute as
aes de login e logout:
91
// src/Controller/UsersController.php
public function beforeFilter(Event $event)
{
parent::beforeFilter($event);
// Permitir aos usurios se registrarem e efetuar logout.
// Voc no deve adicionar a ao de "login" a lista de permisses.
// Isto pode causar problemas com o funcionamento normal do AuthComponent.
$this->Auth->allow(['add', 'logout']);
}
public function login()
{
if ($this->request->is('post')) {
$user = $this->Auth->identify();
if ($user) {
$this->Auth->setUser($user);
return $this->redirect($this->Auth->redirectUrl());
}
$this->Flash->error(__('Usurio ou senha nvalido, tente novamente'));
}
}
public function logout()
{
return $this->redirect($this->Auth->logout());
}
O hashing da senha ainda no est feito, precisamos de uma classe a fim de manipular sua gerao. Crie o
arquivo src/Model/Entity/User.php e adicione a seguinte trecho:
// src/Model/Entity/User.php
namespace App\Model\Entity;
use Cake\Auth\DefaultPasswordHasher;
use Cake\ORM\Entity;
class User extends Entity
{
// Gera conjunto de todos os campos exceto o com a chave primria.
protected $_accessible = [
'*' => true,
'id' => false
];
// ...
protected function _setPassword($password)
{
return (new DefaultPasswordHasher)->hash($password);
}
92
// ...
}
Agora, a senha criptografada usando a classe DefaultPasswordHasher. Est faltando apenas o arquivo para exibio da tela de login. Abra o arquivo src/Template/Users/login.ctp e adicione as seguintes
linhas:
<!-- File: src/Template/Users/login.ctp -->
<div class="users form">
<?= $this->Flash->render('auth') ?>
<?= $this->Form->create() ?>
<fieldset>
<legend><?= __('Por favor informe seu usurio e senha') ?></legend>
<?= $this->Form->input('username') ?>
<?= $this->Form->input('password') ?>
</fieldset>
<?= $this->Form->button(__('Login')); ?>
<?= $this->Form->end() ?>
</div>
Agora voc pode registrar um novo usurio, acessando a URL /users/add e faa login com o usurio
recm-criado, indo para a URL /users/login. Alm disso, tente acessar qualquer outro URL que no
tenha sido explicitamente permitido, como /articles/add, voc vai ver que o aplicativo redireciona
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 login() chama a funo $this->Auth->identify() da AuthComponent, que funciona
sem qualquer outra configurao porque estamos seguindo convenes, como mencionado anteriormente.
Ou seja, ter uma tabela de usurios com um username e uma coluna de password, e usamos um form
para postar os dados do usurio para o controller. Esta 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 quando acessamos a URL /users/logout que ir redirecionar o usurio para a url
configurada em logoutUrl. Essa url acionada quando a funo AuthComponent::logout().
Alm disso, uma pequena mudana no ArticlesController necessrio para armazenar o usurio conectado
no momento como uma referncia para o artigo criado:
93
// src/Controller/ArticlesController.php
public function add()
{
$article = $this->Articles->newEntity();
if ($this->request->is('post')) {
$article = $this->Articles->patchEntity($article, $this->request->data);
// Adicione esta linha
$article->user_id = $this->Auth->user('id');
// Voc tambm pode fazer o seguinte
//$newData = ['user_id' => $this->Auth->user('id')];
//$article = $this->Articles->patchEntity($article, $newData);
if ($this->Articles->save($article)) {
$this->Flash->success(__('Seu artigo foi salvo.'));
return $this->redirect(['action' => 'index']);
}
$this->Flash->error(__('No foi possvel adicionar seu artigo.'));
}
$this->set('article', $article);
}
A funo user() fornecida pelo componente 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:
// src/Controller/AppController.php
public function initialize()
{
$this->loadComponent('Flash');
$this->loadComponent('Auth', [
'authorize' => ['Controller'], // Adicione est linha
'loginRedirect' => [
'controller' => 'Articles',
'action' => 'index'
],
'logoutRedirect' => [
'controller' => 'Pages',
'action' => 'display',
'home'
]
]);
}
public function isAuthorized($user)
{
// Admin pode acessar todas as actions
if (isset($user['role']) && $user['role'] === 'admin') {
return true;
94
}
// Bloqueia acesso por padro
return false;
}
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 (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 controller
para suprir essas regras extras. As regras que adicionaremos para o add de ArticlesController deve permitir ao autores criarem os posts mas evitar a edio de posts que no sejam deles. Abra o arquivo
src/Controller/ArticlesController.php e adicione o seguinte contedo:
// src/Controller/ArticlesController.php
public function isAuthorized($user)
{
// Todos os usurios registrados podem adicionar artigos
if ($this->request->action === 'add') {
return true;
}
// Apenas o proprietrio do artigo pode editar e exclu
if (in_array($this->request->action, ['edit', 'delete'])) {
$articleId = (int)$this->request->params['pass'][0];
if ($this->Articles->isOwnedBy($articleId, $user['id'])) {
return true;
}
}
return parent::isAuthorized($user);
}
Isso conclui ento nossa autorizao simples e nosso tutorial de autorizao. Para garantir o UsersController
voc pode seguir as mesmas tcnicas que usamos para ArticlesController, voc tambm pode ser mais
criativo e codificar algumas coisas mais gerais no AppController para suas prprias regras baseadas em
Tutorial - Criando um Blog - Autenticao e Autorizao
95
papis.
Se precisar de mais controle, ns sugerimos que leia o guia completo do Auth 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. Gerao de cdigo com o Bake Generating basic CRUD code
2. Authentication: User registration and login
96
CAPTULO 5
Contribuindo
Existem vrias maneiras de contribuir com o CakePHP. As sees abaixo iro abordar estas formas de
contribuio:
Documentao
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.
Tickets
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.
Cdigo
1
2
https://github.com/cakephp/docs
https://github.com/cakephp/docs
97
Padres de cdigo
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.
Guia de retrocompatibilidade
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.
https://github.com/cakephp/docs
https://github.com/cakephp/docs
5
https://github.com/cakephp/docs
4
98
Captulo 5. Contribuindo
CAPTULO 6
Instalao
O CakePHP rpido e fcil de instalar. Os requisitos mnimos so um servidor web e uma cpia do
CakePHP, s isso! Apesar deste manual focar principalmente na configurao do Apache (porqu ele
o mais simples de instalar e configurar), o CakePHP vai ser executado em uma srie de servidores web
como nginx, LightHTTPD, ou Microsoft IIS.
Requisitos
HTTP Server. Por exemplo: Apache. De preferncia com mod_rewrite ativo, mas no obrigatrio.
PHP 5.5.9 ou superior.
extenso mbstring
extenso intl
Nota: Tanto no XAMPP quanto no WAMP, as extenses mcrypt e mbstring so setadas por padro.
Se voc estiver usando o XAMPP, j tem a extenso intl inclusa, mas preciso descomentar a linha
extension=php_intl.dll no arquivo php.ini e ento, reiniciar o servidor atravs do painel de
controle do XAMPP.
Caso voc esteja usando o WAMP, a extenso intl est ativa por padro, mas no est funcional. Para
faz-la funcionar, voc deve ir pasta do php (que por padro ) C:\wamp\bin\php\php{version},
copiar todos os arquivos que se paream com icu***.dll e col-los no diretrio bin do apache
C:\wamp\bin\apache\apache{version}\bin. Reiniciando todos os servios a extenso j deve
ficar ok.
Apesar de um mecanismo de banco de dados no ser exigido, ns imaginamos que a maioria das aplicaes
ir utilizar um. O CakePHP suporta uma variedade de mecanismos de armazenamento de banco de dados:
MySQL (5.1.10 ou superior)
PostgreSQL
99
Instalando o CakePHP
O CakePHP utiliza Composer1 , uma ferramenta de gerenciamento de dependncias para PHP 5.3+, como o
mtodo suportado oficial para instalao.
Primeiramente, voc precisar baixar e instalar o Composer se no o fez anteriormente. Se voc tem cURL
instalada, to fcil quanto executar o seguinte:
curl -s https://getcomposer.org/installer | php
Uma vez que o Composer terminar de baixar o esqueleto da aplicao e o ncleo da biblioteca CakePHP,
voc deve ter uma aplicao funcional instalada via Composer. Esteja certo de manter os arquivos composer.json e composer.lock com o restante do seu cdigo fonte.
You can now visit the path to where you installed your CakePHP application and see the setup traffic lights.
http://getcomposer.org
https://getcomposer.org/download/
3
https://github.com/composer/windows-setup/releases/
4
https://github.com/composer/windows-setup
2
100
Captulo 6. Instalao
Onde <branch> o nome do branch que voc segue. Toda vez que voc executar php composer.phar
update voc receber as ltimas atualizaes do branch escolhido.
Permisses
O CakePHP utiliza o diretrio tmp para diversas operaes. Descrio de models, views armazenadas em
cache e informaes de sesso so apenas alguns exemplos. O diretrio logs utilizado para escrever
arquivos de log pelo mecanismo padro FileLog.
Como tal, certifique-se que os diretrios logs, tmp e todos os seus sub-diretrios em sua instalao
CakePHP so gravveis pelo usurio relacionado ao servidor web. O processo de instalao do Composer
faz tmp e seus sub-diretrios globalmente gravveis para obter as coisas funcionando rapidamente, mas
voc pode atualizar as permisses para melhor segurana e mant-los gravveis apenas para o usurio relacionado ao servidor web.
Um problema comum que os diretrios e sub-diretrios de logs e tmp devem ser gravveis tanto pelo
servidor quanto pelo usurio da linha de comando. Em um sistema UNIX, se seu usurio relacionado ao
servidor web diferente do seu usurio da linha de comando, voc pode executar somente uma vez os
seguintes comandos a partir do diretrio da sua aplicao para assegurar que as permisses sero configuradas corretamente:
HTTPDUSER=`ps
setfacl -R -m
setfacl -R -d
setfacl -R -m
setfacl -R -d
Servidor de Desenvolvimento
Uma instalao de desenvolvimento o mtodo mais rpido de configurar o CakePHP. Neste exemplo, ns
vamos utilizar o console CakePHP para executar o servidor integrado do PHP que vai tornar sua aplicao
disponvel em http://host:port. A partir do diretrio da aplicao, execute:
bin/cake server
Por padro, sem nenhum argumento fornecido, isso vai disponibilizar a sua aplicao em
http://localhost:8765/.
Se voc tem algo conflitante com localhost ou porta 8765, voc pode dizer ao console CakePHP para
executar o servidor web em um host e/ou porta especfica utilizando os seguintes argumentos:
bin/cake server -H 192.168.13.37 -p 5673
Permisses
101
Aviso: O servidor de desenvolvimento nunca deve ser usado em um ambiente de produo. Destina-se
apenas como um servidor de desenvolvimento bsico.
Se voc preferir usar um servidor web real, voc deve ser capaz de mover a instalao do CakePHP (incluindo os arquivos ocultos) para dentro do diretrio raiz do seu servidor web. Voc deve, ento, ser capaz
de apontar seu navegador para o diretrio que voc moveu os arquivos para dentro e ver a aplicao em ao.
Produo
Uma instalao de produo uma forma mais flexvel de configurar o CakePHP. Usar este mtodo permite
total domnio para agir como uma aplicao CakePHP singular. Este exemplo o ajudar a instalar o CakePHP
em qualquer lugar em seu sistema de arquivos e torn-lo disponvel em http://www.example.com. Note que
esta instalao pode exigir os direitos de alterar o DocumentRoot em servidores web Apache.
Depois de instalar a aplicao usando um dos mtodos acima no diretrio de sua escolha - vamos supor que
voc escolheu /cake_install - sua configurao de produo ser parecida com esta no sistema de arquivos:
/cake_install/
bin/
config/
logs/
plugins/
src/
tests/
tmp/
vendor/
webroot/ (esse diretrio definido como DocumentRoot)
.gitignore
.htaccess
.travis.yml
composer.json
index.php
phpunit.xml.dist
README.md
Desenvolvedores utilizando Apache devem definir a diretiva DocumentRoot pelo domnio para:
DocumentRoot /cake_install/webroot
Se o seu servidor web est configurado corretamente, agora voc deve encontrar sua aplicao CakePHP
acessvel em http://www.example.com.
Aquecendo
Tudo bem, vamos ver o CakePHP em ao. Dependendo de qual configurao voc usou, voc deve apontar
seu navegador para http://example.com/ ou http://localhost:8765/. Nesse ponto, voc ser apresentado
pgina home padro do CakePHP e uma mensagem que diz a voc o estado da sua conexo atual com o
banco de dados.
102
Captulo 6. Instalao
Parabns! Voc est pronto para create your first CakePHP application.
Reescrita de URL
Apache
Apesar do CakePHP ser construdo para trabalhar com mod_rewrite fora da caixa, e normalmente o faz, nos
atentamos que aluns usurios lutam para conseguir fazer tudo funcionar bem em seus sistemas.
Aqui esto algumas coisas que voc poderia tentar para conseguir tudo rodando corretamente. Primeiramente observe seu httpd.conf. (Tenha certeza que voc est editando o httpd.conf do sistema ao invs de um
usurio, ou site especfico.)
Esses arquivos podem variar entre diferentes distribuies e verses do Apache. Voc tambm pode
pesquisar em http://wiki.apache.org/httpd/DistrosDefaultLayout para maiores informaes.
1. Tenha certeza que a sobreescrita do .htaccess est permitida e que AllowOverride est definido para
All no correto DocumentRoot. Voc deve ver algo similar a:
# Cada diretrio ao qual o Apache tenha acesso pode ser configurado com respeito
# a quais servios e recursos esto permitidos e/ou desabilitados neste
# diretrio (e seus sub-diretrios).
#
# Primeiro, ns configuramos o "default" para ser um conjunto bem restrito de
# recursos.
<Directory />
Options FollowSymLinks
AllowOverride All
#
Order deny,allow
#
Deny from all
</Directory>
2. Certifique-se que o mod_rewrite est sendo carregado corretamente. Voc deve ver algo como:
LoadModule rewrite_module libexec/apache2/mod_rewrite.so
Em muitos sistemas estar comentado por padro, ento voc pode apenas remover os smbolos #.
Depois de fazer as mudanas, reinicie o Apache para certificar-se que as configuraes esto ativas.
Verifique se os seus arquivos .htaccess esto realmente nos diretrios corretos. Alguns sistemas operacionais tratam arquivos iniciados com . como ocultos e portanto, no os copia.
3. Certifique-se de sua cpia do CakePHP vir da seo de downloads do site ou do nosso repositrio Git,
e que foi descompactado corretamente, verificando os arquivos .htaccess.
O diretrio app do CakePHP (ser copiado para o diretrio mais alto de sua aplicao atravs do
bake):
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteRule
^$
webroot/
Reescrita de URL
[L]
103
RewriteRule
</IfModule>
(.*) webroot/$1
[L]
O diretrio webroot do CakePHP (ser copiado para a raz de sua aplicao atravs do bake):
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
Se o seu site CakePHP ainda possuir problemas com mod_rewrite, voc pode tentar modificar as
configuraes para Virtual Hosts. No Ubuntu, edita o arquivo /etc/apache2/sites-available/default (a
localizao depende da distribuio). Nesse arquivo, certifique-se que AllowOverride None seja
modificado para AllowOverride All, ento voc ter:
<Directory />
Options FollowSymLinks
AllowOverride All
</Directory>
<Directory /var/www>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order Allow,Deny
Allow from all
</Directory>
No Mac OSX, outra soluo usar a ferramenta virtualhostx5 para fazer um Virtual Host apontar para
o seu diretrio.
Para muitos servios de hospedagem (GoDaddy, land1), seu servidor web na verdade oferecido a
partir de um diretrio de usurio que j utiliza mod_rewrite. Se voc est instalando o CakePHP
em um diretrio de usurio (http://example.com/~username/cakephp/), ou qualquer outra estrutura
URL que j utilize mod_rewrite, voc precisar adicionar declaraes RewriteBase para os arquivos
.htaccess que o CakePHP utiliza. (.htaccess, webroot/.htaccess).
Isso pode ser adicionado na mesma seo com a diretiva RewriteEngine, por exemplo, seu arquivo
webroot/.htaccess ficaria como:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /path/to/app
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^ index.php [L]
</IfModule>
Os detalhes dessas mudanas vo depender da sua configurao, e podem incluir coisas adicionais
que no esto relacionadas ao CakePHP. Por favor, busque pela documentao online do Apache para
mais informaes.
4. (Opcional) Para melhorar a configurao de produo, voc deve prevenir contedos invidos de
serem analisados pelo CakePHP. Modifique seu webroot/.htaccess para algo como:
5
http://clickontyler.com/virtualhostx/
104
Captulo 6. Instalao
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /path/to/app/
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_URI} !^/(webroot/)?(img|css|js)/(.*)$
RewriteRule ^ index.php [L]
</IfModule>
Isto ir simplesmente prevenir contedo incorreto de ser enviado para o index.php e ento exibir sua
pgina de erro 404 do servidor web.
Adicionalmente voc pode criar uma pgina HTML de erro 404 correspondente, ou utilizar a padro
do CakePHP ao adicionar uma diretiva ErrorDocument:
ErrorDocument 404 /404-not-found
nginx
nginx no utiliza arquivos .htaccess como o Apache, ento necessrio criar as reescritas de URL na configurao de sites disponveis. Dependendo da sua configurao, voc precisar modificar isso, mas pelo
menos, voc vai precisar do PHP rodando como uma instncia FastCGI:
server {
listen
80;
server_name www.example.com;
rewrite ^(.*) http://example.com$1 permanent;
}
server {
listen
80;
server_name example.com;
# root directive should be global
root
/var/www/example.com/public/webroot/;
index index.php;
access_log /var/www/example.com/log/access.log;
error_log /var/www/example.com/log/error.log;
location / {
try_files $uri $uri/ /index.php?$args;
}
location ~ \.php$ {
try_files $uri =404;
include /etc/nginx/fastcgi_params;
fastcgi_pass
127.0.0.1:9000;
fastcgi_index
index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
Reescrita de URL
105
Uma vez que o arquivo web.config criado com as regras amigveis de reescrita do IIS, os links, CSS,
JavaScript, e roteamento do CakePHP agora devem funcionar corretamente.
http://www.microsoft.com/web/downloads/platform.aspx
http://www.iis.net/downloads/microsoft/url-rewrite
8
http://www.microsoft.com/en-us/download/details.aspx?id=5747
9
http://www.microsoft.com/en-us/download/details.aspx?id=7435
7
106
Captulo 6. Instalao
Reescrita de URL
107
108
Captulo 6. Instalao
CAPTULO 7
Configurao
https://github.com/cakephp/docs
109
110
Captulo 7. Configurao
CAPTULO 8
Roteamento
Connecting Routes
Using Named Routes
Filtros do Dispatcher
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.
1
2
https://github.com/cakephp/docs
https://github.com/cakephp/docs
111
112
Captulo 8. Roteamento
CAPTULO 9
Request
https://github.com/cakephp/docs
113
114
CAPTULO 10
Controllers (Controladores)
class Cake\Controller\Controller
Os controllers (controladores) 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 AppController, a qual por
sua vez estende a classe do core Controller. A classe AppController pode ser definida em
src/Controller/AppController.php e deve conter mtodos que so compartilhados entre todos os controllers de sua aplicao.
Os controllers fornecem uma srie de mtodos que lidam com requisies. Estas so chamados de actions.
Por padro, todos os mtodos pblicos em um controller so uma action e acessveis por uma URL. Uma
action responsvel por interpretar a requisio e criar a resposta. Normalmente as respostas so na forma
de uma view renderizada, mas tambm existem outras formas de criar respostas.
O App Controller
Como mencionado anteriormente, a classe AppController a me de todos os outros controllers da
sua aplicao. A prpria AppController estendida da classe Cake\Controller\Controller
includa no CakePHP. Assim sendo, AppController definida em src/Controller/AppController.php
como a seguir:
115
namespace App\Controller;
use Cake\Controller\Controller;
class AppController extends Controller
{
}
Os atributos e mtodos criados em seu AppController vo estar disponveis para todos os controllers
que a extendam. Components (sobre os quais voc ir aprender mais tarde) so a melhor alternativa para
cdigos usados por muitos (mas no necessariamente em todos) controllers.
Voc pode usar seu AppController para carregar components que sero usados em cada controller de
sua aplicao. O CakePHP oferece um mtodo initialize() que invocado ao final do construtor do
controller para esse tipo de uso:
namespace App\Controller;
use Cake\Controller\Controller;
class AppController extends Controller
{
public function initialize()
{
// Sempre habilite o CSRF component.
$this->loadComponent('Csrf');
}
}
Em adio ao mtodo initialize(), a antiga propriedade $components tambm vai permitir voc
declarar quais components devem ser carregados. Enquanto heranas objeto-orientadas normais so enquadradas, os components e helpers usados por um controller so especialmente tratados. Nestes casos, os
valores de propriedade do AppController so mesclados com arrays de classes controller filhas. Os
valores na classe filha iro sempre sobre-escrever aqueles na AppController.
Fluxo de requisies
Quando uma requisio feita para uma aplicao CakePHP, a classe Cake\Routing\Router e a classe
Cake\Routing\Dispatcher usam Connecting Routes para encontrar e criar a instncia correta do
controller. 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 Request
para mais informaes sobre o objeto de requisio do CakePHP.
116
117
$popular = $this->Recipes->find('popular');
if ($this->request->is('requested')) {
$this->response->body(json_encode($popular));
return $this->response;
}
$this->set('popular', $popular);
}
}
A action do controller acima um exemplo de como um mtodo pode ser usado com
Routing\RequestActionTrait::requestAction() e requisies normais.
Para que voc possa utilizar um controller de forma eficiente em sua prpria aplicao, ns iremos cobrir
alguns dos atributos e mtodos oferecidos pelo controller do core do CakePHP.
O mtodo Controller::set() tambm aceita um array associativo como primeiro parmetro. Isto
pode oferecer uma forma rpida para atribuir uma srie de informaes para a view:
$data = [
'color' => 'pink',
'type' => 'sugar',
'base_price' => 23.95
];
// Faa $color, $type, e $base_price
// disponveis na view:
$this->set($data);
118
119
}
}
Isto
renderizaria
o
arquivo
src/Template/Posts/my_action.ctp
src/Template/Posts/custom_file.ctp
ao
invs
de
Este mtodo ir retornar a instncia da resposta com cabealhos apropriados definidos. Voc deve retornar
a instncia da resposta da sua action para prevenir renderizao de view e deixar o dispatcher controlar o
redirecionamento corrente.
Voc tambm pode usar uma URL relativa ou absoluta como o parmetro $url:
return $this->redirect('/orders/thanks');
return $this->redirect('http://www.example.com');
121
Se voc est usando um provedor de tabelas que no os da ORM nativa voc pode ligar este sistema de
tabelas aos controllers do CakePHP conectando seus mtodos de factory:
// Em um mtodo do controller.
$this->modelFactory(
'ElasticIndex',
['ElasticIndexes', 'factory']
);
Depois de registrar uma tabela factory, voc pode usar o loadModel para carregar instncias:
// Em um mtodo do controller
$this->loadModel('Locations', 'ElasticIndex');
Nota: O TableRegistry da ORM nativa conectado por padro como o provedor de Tabelas.
Paginando um model
Cake\Controller\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()
O atributo paginate lhe oferece uma forma fcil de customizar como paginate() se comporta:
class ArticlesController extends AppController
{
public $paginate = [
'Articles' => [
'conditions' => ['published' => 1]
]
];
}
122
property Cake\Controller\Controller::$components
A propriedade $components em seus controllers permitem a voc configurar components. Components
configurados e suas dependncias sero criados pelo CakePHP para voc. Leia a seo Configuring Components para mais informaes. Como mencionado anteriormente, a propriedade $components ser
mesclada com a propriedade definida em cada classe parente do seu controller.
Cada uma dessas variveis so mescladas com seus valores herdados, portanto no necessrio (por exemplo) redeclarar o FormHelper, ou qualquer coisa declarada em seu AppController.
123
Components (Componentes)
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.
Configuring Components
Authentication
https://github.com/cakephp/docs
https://github.com/cakephp/docs
124
CookieComponent
Flash
Security
https://github.com/cakephp/docs
https://github.com/cakephp/docs
5
https://github.com/cakephp/docs
6
https://github.com/cakephp/docs
4
125
Pagination
Request Handling
7
8
https://github.com/cakephp/docs
https://github.com/cakephp/docs
126
CAPTULO 11
Views (Visualizao)
https://github.com/cakephp/docs
https://github.com/cakephp/docs
127
Temas
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github3 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.
Helpers (Facilitadores)
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.
Flash
class Cake\View\Helper\FlashHelper(View $view, array $config =[])
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
128
Form
class Cake\View\Helper\FormHelper(View $view, array $config =[])
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.
Html
class Cake\View\Helper\HtmlHelper(View $view, array $config =[])
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.
Number
class Cake\View\Helper\NumberHelper(View $view, array $config =[])
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github9 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.
Paginator
class Cake\View\Helper\PaginatorHelper(View $view, array $config =[])
7
https://github.com/cakephp/docs
https://github.com/cakephp/docs
9
https://github.com/cakephp/docs
8
129
PaginatorHelper Templates
RSS
class Cake\View\Helper\RssHelper(View $view, array $config =[])
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github11 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.
Session
class Cake\View\Helper\SessionHelper(View $view, array $config =[])
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github12 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.
Text
class Cake\View\Helper\TextHelper(View $view, array $config =[])
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github13 ou use o boto Improve This Doc
para propor suas mudanas diretamente.
10
https://github.com/cakephp/docs
https://github.com/cakephp/docs
12
https://github.com/cakephp/docs
13
https://github.com/cakephp/docs
11
130
Voc pode referenciar-se verso inglesa no menu de seleo superior para obter informaes sobre o tpico
desta pgina.
Time
class Cake\View\Helper\TimeHelper(View $view, array $config =[])
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github14 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.
Url
class Cake\View\Helper\UrlHelper(View $view, array $config =[])
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github15 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.
14
15
https://github.com/cakephp/docs
https://github.com/cakephp/docs
131
132
CAPTULO 12
Models (Modelos)
Models (Modelos) so as classes que servem como camada de negcio na sua aplicao. Isso significa que
eles devem ser responsveis pela gesto de quase tudo o que acontece em relao a seus dados, sua validade,
interaes e evoluo do fluxo de trabalho de informao no domnio do trabalho.
No CakePHP seu modelo de domnio da aplicao dividido em 2 tipos de objetos principais. Os primeiros
so repositories (repositrios) ou table objects (objetos de tabela). Estes objetos fornecem acesso a
colees de dados. Eles permitem a voc salvar novos registros, modificar/deletar os que j existem, definir
relacionamentos, e executar operaes em massa. O segundo tipo de objetos so as entities (entidades). Entities representam registros individuais e permitem a voc definir comportamento em nvel de linha/registro
e funcionalidades.
O ORM (MOR - Mapeamento Objeto-Relacional) nativo do CakePHP especializa-se em banco de dados
relacionais, mas pode ser extendido para suportar fontes de dados alternativas.
O ORM do Cakephp toma emprestadas ideias e conceitos dos padres ActiveRecord e Datamapper. Isso
permite criar uma implementao hbrida que combina aspectos de ambos padres para criar uma ORM
rpida e simples de utilizar.
Antes de ns comearmos explorando o ORM, tenha certeza que voc configure your database connections.
Nota: Se voc familiarizado com verses anteriores do CakePHP, voc deveria ler o Guia de atualizao
para o novo ORM para esclarecer diferenas importantes entre o CakePHP 3.0 e suas verses antigas.
Exemplo rpido
Para comear voc no precisa escrever cdigo. Se voc seguiu as convenes do CakePHP para suas tabelas
de banco de dados, voc pode simplesmente comear a usar o ORM. Por exemplo, se quisssemos carregar
alguns dados da nossa tabela articles poderamos fazer:
use Cake\ORM\TableRegistry;
$articles = TableRegistry::get('Articles');
$query = $articles->find();
133
Nota-se que ns no temos que criar qualquer cdigo ou definir qualquer configurao. As convenes do
CakePHP nos permitem pular alguns cdigos clich, e permitir que o framework insera classes bsicas enquanto sua aplicao no criou uma classe concreta. Se quisssemos customizar nossa classe ArticlesTable
adicionando algumas associaes ou definir alguns mtodos adicionais, deveriamos acrescentar o seguinte
a src/Model/Table/ArticlesTable.php aps a tag de abertura <?php:
namespace App\Model\Table;
use Cake\ORM\Table;
class ArticlesTable extends Table
{
}
Classes de tabela usam a verso CamelCased do nome da tabela com o sufixo Table como o nome
da classe. Uma vez que sua classe fora criada, voc recebe uma referncia para esta utilizando o
ORM\TableRegistry como antes:
use Cake\ORM\TableRegistry;
// Agora $articles uma instncia de nossa classe ArticlesTable.
$articles = TableRegistry::get('Articles');
Agora que temos uma classe de tabela concreta, ns provavelmente vamos querer usar uma classe de entidade concreta. As classes de entidade permitem definir mtodos de acesso, mtodos mutantes, definir
lgica personalizada para os registros individuais e muito mais. Vamos comear adicionando o seguinte
para src/Model/Entity/Article.php aps a tag de abertura <?php:
namespace App\Model\Entity;
use Cake\ORM\Entity;
class Article extends Entity
{
}
Entidades usam a verso singular CamelCase do nome da tabela como seu nome de classe por padro.
Agora que ns criamos nossa classe de entidade, quando carregarmos entidades do nosso banco de dados,
ns iremos receber instncias da nossa nova classe Article:
use Cake\ORM\TableRegistry;
// Agora uma instncia de ArticlesTable.
$articles = TableRegistry::get('Articles');
$query = $articles->find();
foreach ($query as $row) {
// Cada linha agora uma instncia de nossa classe Article.
134
echo $row->title;
}
CakePHP utiliza convenes de nomenclatura para ligar as classes de tabela e entidade juntas. Se voc
precisar customizar qual entidade uma tabela utiliza, voc pode usar o mtodo entityClass() para
definir nomes de classe especficos.
Veja os captulos em Objetos de tabela e Entities (Entidades) para mais informaes sobre como usar objetos
de tabela e entidades em sua aplicao.
Mais informao
O bsico sobre banco de dados
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.
Construtor de queries
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.
Objetos de tabela
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github3 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.
1
https://github.com/cakephp/docs
https://github.com/cakephp/docs
3
https://github.com/cakephp/docs
2
Mais informao
135
Entities (Entidades)
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.
Validando dados
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.
Salvando dados
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.
4
https://github.com/cakephp/docs
https://github.com/cakephp/docs
6
https://github.com/cakephp/docs
7
https://github.com/cakephp/docs
5
136
Mais informao
137
138
Deletando dados
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.
Behaviors (Comportamentos)
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github10 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.
CounterCache
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github11 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.
8
https://github.com/cakephp/docs
https://github.com/cakephp/docs
10
https://github.com/cakephp/docs
11
https://github.com/cakephp/docs
9
Mais informao
139
Timestamp
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github12 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.
Translate
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github13 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.
Tree
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github14 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.
Schema
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github15 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.
12
https://github.com/cakephp/docs
https://github.com/cakephp/docs
14
https://github.com/cakephp/docs
15
https://github.com/cakephp/docs
13
140
16
https://github.com/cakephp/docs
Mais informao
141
142
CAPTULO 13
Authentication
https://github.com/cakephp/docs
143
144
CAPTULO 14
Bake Console
O bake console do CakePHP outro empenho para voc ter o CakePHP configurado e funcionando rpido.
O bake console pode criar qualquer ingrediente bsico do CakePHP: models, behaviors, views, helpers,
components, test cases, fixtures e plugins. E ns no estamos apenas falando de classes esqueleto: O Bake
pode criar uma aplicao totalmente funcional em questo de minutos. De fato, o Bake um passo natural
a se dar uma vez que a aplicao tem seu alicerce construdo.
Instalao
Antes de tentar usar ou extender o bake, tenha certeza que ele est instalado em sua aplicao. O bake
distribudo como um plugin que voc pode instalar com o Composer:
composer require --dev cakephp/bake:~1.0
Isto ir instalar o bake como uma dependncia de desenvolvimento, sendo assim, no instalado quando em
um ambiente de produo. As sees a seguir cobrem o uso do bake com mais detalhes:
https://github.com/cakephp/docs
145
Extendendo o Bake
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.
https://github.com/cakephp/docs
146
CAPTULO 15
Caching
https://github.com/cakephp/docs
147
148
CAPTULO 16
Console e Shells
O CakePHP no oferece um framework apenas para desenvolvimento web, mas tambm um framework para
criao de aplicaes de console. Estas aplicaes so ideais para manipular variadas tarefas em segundo
plano como manuteno e complementao de trabalho fora do ciclo requisio-resposta. As aplicaes de
console do CakePHP permitem a voc reutilizar suas classes de aplicao a partir da linha de comando.
O CakePHP traz consigo algumas aplicaes de console nativas. Algumas dessas aplicaes so utilizadas
em conjunto com outros recursos do CakePHP (como i18n), e outros de uso geral para acelerao de trabalho.
O Console do CakePHP
Esta seo prov uma introduo linha de comando do CakePHP. Ferramentas de console so ideais para
uso em cron jobs, ou utilitrios baseados em linha de comando que no precisam ser acessveis por um
navegador web.
O PHP prov um cliente CLI que faz interface com o seu sistema de arquivos e aplicaes de forma muito
mais suave. O console do CakePHP prov um framework para criar scripts shell. O console utiliza uma
configurao tipo dispatcher para carregar uma shell ou tarefa, e prover seus parmetros.
Nota: Uma linha de comando (CLI) constutuda a partir do PHP deve estar disponvel no sistema se voc
planeja utilizr o Console.
Antes de entrar em detalhes, vamos ter certeza de que voc pode executar o console do CakePHP. Primeiro,
voc vai precisar executar um sistema shell. Os exemplos apresentados nesta seo sero em bash, mas
o Console do CakePHP compatvel com o Windows tambm. Este exemplo assume que o usurio est
conectado em um prompt do bash e est atualmente na raiz de uma aplicao CakePHP.
Aplicaes CakePHP possuem um diretrio Console que contm todas as shells e tarefas para uma aplicao. Ele tambm vem com um executvel:
$ cd /path/to/app
$ bin/cake
149
A primeira informao impressa refere-se a caminhos. Isso til se voc estiver executando o console a
partir de diferentes partes do sistema de arquivos.
150
}
}
As convenes para as classes de shell so de que o nome da classe deve corresponder ao nome do arquivo,
com o sufixo de Shell. No nosso shell criamos um mtodo main(). Este mtodo chamado quando um
shell chamado sem comandos adicionais. Vamos adicionar alguns comandos daqui a pouco, mas por agora
vamos executar a nossa shell. A partir do diretrio da aplicao, execute:
bin/cake hello
Como mencionado antes, o mtodo main() em shells um mtodo especial chamado sempre que no h
outros comandos ou argumentos dados para uma shell. Por nosso mtodo principal no ser muito interessante, vamos adicionar outro comando que faz algo:
namespace App\Shell;
use Cake\Console\Shell;
class HelloShell extends Shell
{
public function main()
{
$this->out('Hello world.');
}
public function heyThere($name = 'Anonymous')
{
$this->out('Hey there ' . $name);
}
}
Depois de salvar o arquivo, voc deve ser capaz de executar o seguinte comando e ver o seu nome impresso:
bin/cake hello hey_there your-name
Qualquer mtodo pblico no prefixado por um _ permitido para ser chamado a partir da linha de comando.
Como voc pode ver, os mtodos invocados a partir da linha de comando so transformados do argumento
prefixado para a forma correta do nome camel-cased (camelizada) na classe.
No nosso mtodo heyThere() podemos ver que os argumentos posicionais so providos para nossa
funo heyThere(). Argumentos posicionais tambm esto disponvels na propriedade args. Voc
pode acessar switches ou opes em aplicaes shell, estando disponveis em $this->params, mas ns
iremos cobrir isso daqui a pouco.
Quando utilizando um mtodo main() voc no estar liberado para utilizar argumentos posicionais. Isso
Criando uma Shell
151
se deve ao primeiro argumento posicional ou opo ser interpretado(a) como o nome do comando. Se voc
quer utilizar argumentos, voc deve usar mtodos diferentes de main().
A shell acima, ir preencher um user pelo seu username e exibir a informao armazenada no banco de
dados.
Tasks de Shell
Havero momentos construindo aplicaes mais avanadas de console que voc vai querer compor funcionalidades em classes reutilizveis que podem ser compartilhadas atravs de muitas shells. Tasks permitem que voc extraia comandos em classes. Por exemplo, o bake feito quase que completamente de
tasks. Voc define tasks para uma shell usando a propriedade $tasks:
class UserShell extends Shell
{
public $tasks = ['Template'];
}
Voc pode utilizar tasks de plugins utilizando o padro plugin syntax. Tasks so armazenadas sob
Shell/Task/ em arquivos nomeados depois de suas classes. Ento se ns estivssemos criando uma
nova task FileGenerator, voc deveria criar src/Shell/Task/FileGeneratorTask.php.
152
Cada task deve ao menos implementar um mtodo main(). O ShellDispatcher, vai chamar esse mtodo
quando a task invocada. Uma classe task se parece com:
namespace App\Shell\Task;
use Cake\Console\Shell;
class FileGeneratorTask extends Shell
{
public function main()
{
}
}
Uma shell tambm pode prover acesso a suas tasks como propriedades, que fazem tasks serem timas para
criar punhados de funcionalidade reutilizveis similares a Components (Componentes):
// Localizado em src/Shell/SeaShell.php
class SeaShell extends Shell
{
// Localizado em src/Shell/Task/SoundTask.php
public $tasks = ['Sound'];
public function main()
{
$this->Sound->main();
}
}
Nota: Para acessar tasks diretamente atravs da linha de comando, a task deve ser includa na propriedade
da classe shell $tasks. Portanto, esteja ciente que um mtodo chamado sound na classe SeaShell deve
sobrescrever a habilidade de acessar a funcionalidade na task Sound, especificada no array $tasks.
Carregar e retornar uma instncia ProjectTask. Voc pode carregar tasks de plugins usando:
$progressBar = $this->Tasks->load('ProgressBar.ProgressBar');
Tasks de Shell
153
O contedo acima mostra como voc pode chamar a shell schema para criar o schema de um plugin de
dentro da shell do prprio.
Criando Arquivos
Cake\Console\createFile($path, $contents)
Muitas aplicaes Shell auxiliam tarefas de desenvolvimento e implementao. Criar arquivos frequentemente importante nestes casos de uso. O CakePHP oferece uma forma fcil de criar um arquivo em um
determinado diretrio:
$this->createFile('bower.json', $stuff);
Se a Shell for interativa, um alerta vai ser gerado, e o usurio questionado se ele quer sobreescrever o
arquivo caso j exista. Se a propriedade de interao da shell for false, nenhuma questo ser disparada e
o arquivo ser simplesmente sobreescrito.
154
A Shell tambm inclui mtodos para limpar a sada de dados, criando linhas em branco, ou desenhando uma
linha de traos:
// Exibe 2 linhas novas
$this->out($this->nl(2));
// Limpa a tela do usurio
$this->clear();
// Desenha uma linha horizontal
$this->hr();
Por ltimo, voc pode atualizar a linha atual de texto na tela usando _io->overwrite():
$this->out('Counting down');
$this->out('10', 0);
for ($i = 9; $i > 0; $i--) {
sleep(1);
$this->_io->overwrite($i, 0, 2);
}
importante lembrar, que voc no pode sobreescrever texto uma vez que uma nova linha tenha sido exibida.
155
Voc pode controlar o nvel de sada das shells, ao usar as opes --quiet e --verbose. Estas opes
so adicionadas por padro, e permitem a voc controlar consistentemente nveis de sada dentro das suas
shells do CakePHP.
Isso deve ento permit-lo usar uma <flashy> tag na sada de sua shell, e se as cores
ansi estiverem habilitadas, o seguinte pode ser renderizado como texto magenta piscante
$this->out(<flashy>Whoooa</flashy> Something went wrong);. Quando definir
estilos voc pode usar as seguintes cores para os atributos text e background:
black
red
green
yellow
blue
magenta
156
cyan
white
Voc tambm pode usar as seguintes opes atravs de valores boleanos, defini-los com valor positivo os
habilita.
bold
underline
blink
reverse
Adicionar um estilo o torna disponvel para todas as instncias do ConsoleOutput, ento voc no tem que
redeclarar estilos para os objetos stdout e stderr respectivamente.
Desabilitando a colorizao
Mesmo que a colorizao seja incrvel, havero ocasies que voc querer desabilit-la, ou for-la:
$this->_io->outputAs(ConsoleOutput::RAW);
O citado ir colocar o objeto de sada em modo raw. Em modo raw, nenhum estilo aplicado. Existem trs
modos que voc pode usar.
ConsoleOutput::RAW - Sada raw, nenhum estilo ou formatao sero aplicados. Este um modo
indicado se voc estiver exibindo XML ou, quiser depurar porqu seu estilo no est funcionando.
ConsoleOutput::PLAIN - Sada de texto simples, tags conhecidas de estilo sero removidas da
sada.
ConsoleOutput::COLOR - Sada onde a cor removida.
Por padro em sistemas *nix objetos ConsoleOutput padronizam-se a a sada de cores. Em sistemas Windows, a sada simples padro a no ser que a varivel de ambiente ANSICON esteja presente.
157
que permitem ter diferentes interpretadores para subcomandos e tarefas. O ConsoleOptionParser implementa uma interface fluida e inclui mtodos para facilmente definir mltiplas opes/argumentos de uma
vez:
public function getOptionParser()
{
$parser = parent::getOptionParser();
// Configure parser
return $parser;
}
158
Cake\Console\ConsoleOptionParser::epilog($text = null)
Recebe ou define o eplogo para o interpretador de opes. O eplogo exibido depois da informao do
argumento e da opo. Ao instanciar tanto em array como em string, voc pode definir o valor do eplogo.
Instanciar sem argumentos vai retornar o valor atual:
// Define mltiplas linhas de uma vez
$parser->epilog(['line one', 'line two']);
// L o valor atual
$parser->epilog();
Adicionando argumentos
Cake\Console\ConsoleOptionParser::addArgument($name, $params =[])
Argumentos posicionais so frequentemente usados em ferramentas de linha de comando, e
ConsoleOptionParser permite definir argumentos bem como torn-los requirveis. Voc pode adicionar argumentos um por vez com $parser->addArgument(); ou mltiplos de uma vez com
$parser->addArguments();:
$parser->addArgument('model', ['help' => 'The model to bake']);
159
Assim como todos os mtodos de construo no ConsoleOptionParser, addArguments pode ser usado como
parte de um fluido mtodo encadeado.
Validando argumentos
Ao criar argumentos posicionais, voc pode usar a marcao required para indicar que um argumento
deve estar presente quando uma shell chamada. Adicionalmente voc pode usar o choices para forar
um argumento a ser de uma lista de escolhas vlidas:
$parser->addArgument('type', [
'help' => 'The type of node to interact with.',
'required' => true,
'choices' => ['aro', 'aco']
]);
O cdigo acima ir criar um argumento que requisitado e tem validao no input. Se o argumento est
tanto indefinodo, ou possui um valor incorreto, uma exceo ser lanada e a shell parar.
Adicionando opes
Cake\Console\ConsoleOptionParser::addOption($name, $options =[])
Opes so frequentemente usadas em ferramentas CLI. ConsoleOptionParser suporta a criao de
opes com verbose e aliases curtas, suprindo padres e criando ativadores boleanos. Opes so criadas
tanto com $parser->addOption() ou $parser->addOptions().:
$parser->addOption('connection', [
'short' => 'c',
'help' => 'connection',
'default' => 'default',
]);
O cdigo citado permite a voc usar tanto cake myshell --connection=other, cake myshell
--connection other, ou cake myshell -c other quando invocando a shell. Voc tambm
criar ativadores boleanos. Estes ativadores no consumem valores, e suas presenas apenas os habilitam nos
parmetros interpretados.:
$parser->addOption('no-commit', ['boolean' => true]);
Com essa opo, ao chamar uma shell como cake myshell --no-commit something o parmetro
no-commit deve ter um valor de true, e something deve ser tratado como um argumento posicional. As
opes nativas --help, --verbose, e --quiet usam essa funcionalidade.
Ao criar opes voc pode usar os seguintes argumentos para definir o seu comportamento:
short - A variao de letra nica para essa opo, deixe indefinido para none.
help - Texto de ajuda para essa opo. Usado ao gerar ajuda para a opo.
default - O valor padro para essa opo. Se no estiver definido o valor padro ser true.
boolean - A opo no usa valor, apenas um ativador boleano. Por padro false.
160
choices - Um array de escolhas vlidas para essa opo. Se deixado vazio, todos os valores so
considerados vlidos. Uma exceo ser lanada quando parse() encontrar um valor invlido.
Cake\Console\ConsoleOptionParser::addOptions(array $options)
Se voc tem um array com mltiplas opes, voc pode usar $parser->addOptions() para adicionlas de uma vez.:
$parser->addOptions([
'node' => ['short' => 'n', 'help' => 'The node to create'],
'parent' => ['short' => 'p', 'help' => 'The parent node']
]);
Assim como com todos os mtodos construtores, no ConsoleOptionParser, addOptions pode ser usado como
parte de um mtodo fluente encadeado.
Validando opes
Opes podem ser fornecidas com um conjunto de escolhas bem como argumentos posicionais podem ser.
Quando uma opo define escolhas, essas so as nicas opes vlidas para uma opo. Todos os outros
valores iro gerar um InvalidArgumentException:
$parser->addOption('accept', [
'help' => 'What version to accept.',
'choices' => ['working', 'theirs', 'mine']
]);
Desde que as opes boleanas estejam sempre definidas como true ou false, voc pode omitir mtodos
de verificao adicionais.
161
Adicionando subcomandos
Cake\Console\ConsoleOptionParser::addSubcommand($name, $options =[])
Aplicativos de console so muitas vezes feitas de subcomandos, e esses subcomandos podem exigir a anlise
de opes especiais e terem a sua prpria ajuda. Um perfeito exemplo disso bake. Bake feita de muitas
tarefas separadas e todas tm a sua prpria ajuda e opes. ConsoleOptionParser permite definir
subcomandos e fornecer comandos analisadores de opo especfica, de modo que a shell sabe como analisar
os comandos para as suas funes:
$parser->addSubcommand('model', [
'help' => 'Bake a model',
'parser' => $this->Model->getOptionParser()
]);
A descrio acima um exemplo de como voc poderia fornecer ajuda e um especializado interpretador de
opo para a tarefa de uma shell. Ao chamar a tarefa de getOptionParser() no temos de duplicar a
gerao do interpretador de opo, ou misturar preocupaes no nosso shell. Adicionar subcomandos desta
forma tem duas vantagens. Primeiro, ele permite que o seu shell documente facilmente seus subcomandos
na ajuda gerada. Ele tambm d fcil acesso ao subcomando help. Com o subcomando acima criado
voc poderia chamar cake myshell --help e ver a lista de subcomandos, e tambm executar o cake
myshell model --help para exibir a ajuda apenas o modelo de tarefa.
Nota: Uma vez que seu Shell define subcomandos, todos os subcomandos deve ser explicitamente
definidos.
Ao definir um subcomando, voc pode usar as seguintes opes:
help - Texto de ajuda para o subcomando.
parser - Um ConsoleOptionParser para o subcomando. Isso permite que voc crie mtodos analisadores de opo especfios. Quando a ajuda gerada por um subcomando, se um analisador est
presente ele vai ser usado. Voc tambm pode fornecer o analisador como uma matriz que seja compatvel com Cake\Console\ConsoleOptionParser::buildFromArray()
Adicionar subcomandos pode ser feito como parte de uma cadeia de mtodos fluente.
162
__("to the specified ACO action (and the ACO's children, if any).")
],
'arguments' => [
'aro' => ['help' => __('ARO to check.'), 'required' => true],
'aco' => ['help' => __('ACO to check.'), 'required' => true],
'action' => ['help' => __('Action to check')]
]
]
]);
Ambos devem gerar a ajuda para o bake. Se o shell suporta subcomandos voc pode obter ajuda para estes
de uma forma semelhante:
cake bake model --help
cake bake model -h
Isso deve fornecer a voc a ajuda especfica para a tarefa bake dos models.
163
O trecho acima deve retornar um documento XML com a ajuda gerada, opes, argumentos e subcomando
para o shell selecionado. Um documento XML de amostra seria algo como:
<?xml version="1.0"?>
<shell>
<command>bake fixture</command>
<description>Generate fixtures for use with the test suite. You can use
`bake fixture all` to bake all fixtures.</description>
<epilog>
Omitting all arguments and options will enter into an interactive
mode.
</epilog>
<subcommands/>
<options>
<option name="--help" short="-h" boolean="1">
<default/>
<choices/>
</option>
<option name="--verbose" short="-v" boolean="1">
<default/>
<choices/>
</option>
<option name="--quiet" short="-q" boolean="1">
<default/>
<choices/>
</option>
<option name="--count" short="-n" boolean="">
<default>10</default>
<choices/>
</option>
<option name="--connection" short="-c" boolean="">
<default>default</default>
<choices/>
</option>
<option name="--plugin" short="-p" boolean="">
<default/>
<choices/>
</option>
<option name="--records" short="-r" boolean="1">
<default/>
<choices/>
</option>
</options>
<arguments>
<argument name="name" help="Name of the fixture to bake.
164
Iste afirma que os IDs de mensagens geradas so vlidos e adequados para o domnio a partir do qual os
e-mails so enviados.
Mtodos enganchados
Cake\Console\ConsoleOptionParser::initialize()
Inicializa a Shell para atua como construtor de subclasses e permite configurao de tarefas antes de
desenvolver a execuo.
Cake\Console\ConsoleOptionParser::startup()
Inicia-se a Shell e exibe a mensagem de boas-vindas. Permite a verificao e configurao antes de
comandar ou da execuo principal.
Substitua este mtodo se voc quiser remover as informaes de boas-vindas, ou outra forma modificar o fluxo de pr-comando.
Mais tpicos
Shell Helpers
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.
1
https://github.com/cakephp/docs
165
Voc pode referenciar-se verso inglesa no menu de seleo superior para obter informaes sobre o tpico
desta pgina.
I18N Shell
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.
Completion Shell
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.
2
https://github.com/cakephp/docs
https://github.com/cakephp/docs
4
https://github.com/cakephp/docs
5
https://github.com/cakephp/docs
3
166
Voc pode referenciar-se verso inglesa no menu de seleo superior para obter informaes sobre o tpico
desta pgina.
Plugin Shell
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.
Routes Shell
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.
Upgrade Shell
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.
https://github.com/cakephp/docs
https://github.com/cakephp/docs
8
https://github.com/cakephp/docs
7
Mais tpicos
167
168
CAPTULO 17
Debugging
https://github.com/cakephp/docs
169
170
CAPTULO 18
Implantao
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.
Atualizar config/app.php
Atualizar o arquivo core.php, especificamente o valor do debug de extrema importncia. Tornar o debug
igual a false desabilita muitos recursos do processo de desenvolvimento que nunca devem ser expostos
ao mundo. Desabilitar o debug, altera as seguintes coisas:
Mensagens de depurao criadas com pr() e debug() sero desabilitadas.
O cache interno do CakePHP ser descartado aps 999 dias ao invs de ser a cada 10 segundos como
em desenvolvimento.
Views de erros sero menos informativas, retornando mensagens de erros genricas.
Erros do PHP no sero mostrados.
O rastreamento de stack traces (conjunto de excees) ser desabilitado.
Alm dos itens citados acima, muitos plugins e extenses usam o valor do debug para modificarem seus
comportamentos.
Por exemplo, voc pode setar uma varivel de ambiente em sua configurao do Apache:
SetEnv CAKEPHP_DEBUG 1
171
Checar a segurana
Se voc est jogando sua aplicao na selva, uma boa idia certificar-se que ela no possui vulnerabilidades
bvias:
Certifique-se de utilizar o Cross Site Request Forgery.
Voc pode querer habilitar o Security. Isso pode prevenir diversos tipos de adulterao de formulrios
e reduzir a possibilidade de overdose de requisies.
Certifique-se que seus models possuem as regras Validao de validao habilitadas.
Verifique se apenas o seu diretrio webroot visvel publicamente, e que seus segredos (como seu
app salt, e qualquer chave de segurana) so privados e nicos tambm.
Sabendo que manipulao de referncias estticas, como imagens, JavaScript e arquivos CSS, plugins,
atravs do Dispatcher incrivelmente ineficiente, fortemente recomendado referenci-los simbolicamente para produo. Por exemplo:
ln -s Plugin/YourPlugin/webroot/css/yourplugin.css webroot/css/yourplugin.css
172
CAPTULO 19
https://github.com/cakephp/docs
173
174
CAPTULO 20
https://github.com/cakephp/docs
175
176
CAPTULO 21
Sistema de eventos
https://github.com/cakephp/docs
177
178
CAPTULO 22
Internacionalizao e Localizao
https://github.com/cakephp/docs
179
180
CAPTULO 23
Logging
https://github.com/cakephp/docs
181
182
CAPTULO 24
https://github.com/cakephp/docs
183
184
CAPTULO 25
Pagination
https://github.com/cakephp/docs
185
186
CAPTULO 26
Plugins
https://github.com/cakephp/docs
187
188
CAPTULO 27
REST
https://github.com/cakephp/docs
189
190
CAPTULO 28
Segurana
Segurana
Choosing a Specific Crypto Implementation
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.
https://github.com/cakephp/docs
https://github.com/cakephp/docs
3
https://github.com/cakephp/docs
2
191
Voc pode referenciar-se verso inglesa no menu de seleo superior para obter informaes sobre o tpico
desta pgina.
Security
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.
https://github.com/cakephp/docs
192
CAPTULO 29
Sessions
https://github.com/cakephp/docs
193
194
CAPTULO 30
Testing
O CakePHP vem com suporte interno para testes e integrao para o PHPUnit1 . Em adio aos recursos
oferecidos pelo PHPUnit, o CakePHP oferece alguns recursos adicionais para fazer testes mais facilmente.
Esta seo abordar a instalao do PHPUnit, comeando com testes unitrios e como voc pode usar as
extenses que o CakePHP oferece.
Instalando o PHPUnit
O CakePHP usa o PHPUnit como framework de teste bsico. O PHPUnit um padro para testes unitrios
em PHP. Ele oferece um profundo e poderoso conjunto de recursos para voc ter certeza que o seu cdigo
faz o que voc acha que ele faz. O PHPUnit pode ser instalado usando o PHAR package2 ou Composer3 .
Isto adicionar a dependncia para a seo require-dev do seu composer.json, e depois instalar o
PHPUnit com qualquer outra dependncia.
Agora voc executa o PHPUnit usando:
$ vendor/bin/phpunit
http://phpunit.de
http://phpunit.de/#download
3
http://getcomposer.org
2
195
php phpunit.phar
Dica: Como convenincia voc pode deixar phpunit.phar disponivel globalmente em sistemas Unix ou
Linux com os comandos:
chmod +x phpunit.phar
sudo mv phpunit.phar /usr/local/bin/phpunit
phpunit --version
Por favor, consulte a documentao do PHPUnit para instrues sobre como instalar globalmente o PHPUnit
PHAR em sistemas Windows4 .
http://phpunit.de/manual/current/en/installation.html#installation.phar.windows
196
CAPTULO 31
Validao
https://github.com/cakephp/docs
197
198
CAPTULO 32
App Class
https://github.com/cakephp/docs
199
200
CAPTULO 33
Collections (Colees)
https://github.com/cakephp/docs
201
202
CAPTULO 34
https://github.com/cakephp/docs
203
204
CAPTULO 35
Hash
https://github.com/cakephp/docs
205
206
CAPTULO 36
Http Client
https://github.com/cakephp/docs
207
208
CAPTULO 37
Inflector
https://github.com/cakephp/docs
209
210
CAPTULO 38
Nmero
https://github.com/cakephp/docs
211
212
CAPTULO 39
Objetos de Registro
https://github.com/cakephp/docs
213
214
CAPTULO 40
Texto
https://github.com/cakephp/docs
215
216
CAPTULO 41
Tempo
https://github.com/cakephp/docs
217
218
CAPTULO 42
Xml
https://github.com/cakephp/docs
219
220
CAPTULO 43
Constantes e Funes
https://github.com/cakephp/docs
221
222
CAPTULO 44
Debug Kit
DebugKit um plugin suportado pelo time principal que oferece uma barra de ferramentas para ajudar a
fazer a depurao de aplicaes do CakePHP mais facilmente.
Instalao
Por padro o DebugKit instalado com com o esqueleto padro da aplicao. Se voc o removeu e gostaria
de reinstal-lo, voc pode faz-lo ao executar o seguinte comando a partir do diretrio raiz da aplicao
(onde o arquivo composer.json est localizado):
php composer.phar require --dev cakephp/debug_kit "~3.0"
Then, you need to enable the plugin by executing the following line:
bin/cake plugin load DebugKit
Armazenamento do DebugKit
Por padro, o DebugKit usa um pequeno banco de dados SQLite no diretrio /tmp de sua aplicao para
armazenar os dados do painel. Se voc quizesse que o DebugKit armazenasse seus dados em outro lugar,
voc deve definir uma conexo debug_kit.
223
Callbacks
Por padro objetos do painel possuem dois callbacks, permitindo-lhes acoplar-se na requisio atual. Painis
inscrevem-se aos eventos Controller.initialize e Controller.shutdown. Se o seu painel
precisa inscrever-se a eventos adicionais, voc pode usar o mtodo implementedEvents para definir
todos os eventos que o seu painel possa estar interessado.
Voc deveria estudar os painis nativos para absorver alguns exemplos de como construir painis.
Desenvolvendo seus prprios painis
225
Elementos do painel
Cada painel deve ter um elemento view que renderiza o contedo do mesmo. O nome do elemento deve
ser sublinhado e flexionado a partir do nome da classe. Por exemplo SessionPanel possui um elemento nomeado session_panel.ctp, e SqllogPanel possui um elemento nomeado sqllog_panel.ctp. Estes
elementos devem estar localizados na raiz do seu diretrio src/Template/Element.
Para usar um plugin ou painel da aplicao, atualize a configurao do DebugKit de sua aplicao para
incluir o painel:
Configure::write(
'DebugKit.panels',
array_merge(Configure::read('DebugKit.panels'), ['MyCustomPanel'])
);
O cdigo acima deve carregar todos os painis padro tanto como os outros painis customizados do
MyPlugin.
226
CAPTULO 45
Migrations
https://github.com/cakephp/docs
227
228
CAPTULO 46
Apndices
Os apndices contm informaes sobre os novos recursos introduzidos em cada verso e a forma de executar a migrao entre verses.
https://github.com/cakephp/docs
229
Esta pgina resume as alteraes do CakePHP 2.x e ir auxiliar na migrao do seu projeto para a verso 3.0,
e tambm ser uma referncia para atualiz-lo quanto s principais mudanas do branch 2.x. Certifique-se
de ler tambm as outras pginas nesse guia para conhecer todas as novas funcionalidades e mudanas na
API.
Requerimentos
O CakePHP 3.x suporta o PHP 5.4.16 e acima.
O CakePHP 3.x precisa da extenso mbstring.
O CakePHP 3.x precisa da extenso intl.
Aviso: O CakePHP 3.0 no ir funcionar se voc no atender aos requisitos acima.
Ferramenta de atualizao Enquanto este documento cobre todas as alteraes e melhorias feitas no
CakePHP 3.0, ns tambm criamos uma aplicao de console para ajudar voc a completar mais facilmente
algumas das alteraes mecnicas que consomem tempo. Voc pode pegar a ferramenta de atualizao no
github3 .
Layout do diretrio da aplicao O Layout do diretrio da aplicao mudou e agora segue o PSR-44 .
Voc deve usar o projeto do esqueleto da aplicao5 como um ponto de referncia quando atualizar sua
aplicao.
O CakePHP deve ser instalado via Composer Como o CakePHP no pode mais ser instalado facilmente
via PEAR, ou em um diretrio compartilhado, essas opes no so mais suportadas. Ao invs disso, voc
deve usar o Composer6 para instalar o CakePHP em sua aplicao.
2
https://github.com/cakephp/docs
https://github.com/cakephp/upgrade
4
http://www.php-fig.org/psr/psr-4/
5
https://github.com/cakephp/app
6
http://getcomposer.org
3
230
Namespaces Todas as classes do core do CakePHP agora usam namespaces e seguem as especificaes de autoload (auto-carregamento) do PSR-4. Por exemplo src/Cache/Cache.php tem o namespace
Cake\Cache\Cache. Constantes globais e mtodos de helpers como __() e debug() no usam
namespaces por questes de convenincia.
Constantes removidas As seguintes constantes obsoletas foram removidas:
IMAGES
CSS
JS
IMAGES_URL
JS_URL
CSS_URL
DEFAULT_LANGUAGE
Configurao As configuraes no CakePHP 3.0 esto significativamente diferentes que nas verses anteriores. Voc deve ler a documentao Configurao para ver como a configurao feita.
Voc no pode mais usar o App::build() para configurar caminhos adicionais de classes. Ao invs
disso, voc deve mapear caminhos adicionais usando o autoloader da sua aplicao. Veja a seo Caminhos
de Classes Adicionais para mais informaes.
Trs novas variveis de configurao fornecem o caminho de configurao para plugins, views
e arquivos de localizao. Voc pode adicionar vrios caminhos em App.paths.templates,
App.paths.plugins, App.paths.locales para configurar mltiplos caminhos para templates,
plugins e arquivos de localizao respectivamente.
A chave de configurao www_root mudou para wwwRoot devido a consistncia. Por favor, ajuste seu arquivo de configurao app.php assim como qualquer uso de Configure::read(App.wwwRoot).
Novo ORM O CakePHP 3.0 possui um novo ORM que foi refeito do zero. O novo ORM significativamente diferente e incompatvel com o anterior. Migrar para o novo ORM necessita de alteraes extensas
em qualquer aplicao que esteja sendo atualizada. Veja a nova documentao Models (Modelos) para
informaes de como usar o novo ORM.
Bsico
O LogError() foi removido, ele no tinha vantagens e era raramente ou mesmo, nunca usado.
As seguintes funes globais foram removidas: config(), cache(), clearCache(),
convertSlashes(), am(), fileExistsInPath(), sortByKey().
231
Debug
A funo Configure::write(debug, $bool) no suporta mais 0/1/2. Um boleano simples usado para mudar o modo de debug para ligado ou desligado.
Especificaes/Configuraes de objetos
Os objetos usados no CakePHP agora tem um sistema consistente de armazenamento/recuperao
de configurao-de-instncia.
Os cdigos que anteriormente acessavam, por exemplo
$object->settings, devem ser atualizados para usar $object->config() alternativamente.
Cache
Memcache foi removido, use Cake\Cache\Cache\Engine\Memcached alternativamente.
Cache engines so carregados sob demanda no primeiro uso.
Cake\Cache\Cache::engine() foi adicionado.
Cake\Cache\Cache::enabled() foi adicionado.
Cache.disable.
232
foi
renomeado
para
233
Console O executvel cake foi movido do diretrio app/Console para o diretrio bin dentro do
esqueleto da aplicao. Voc pode agora invocar o console do CakePHP com bin/cake.
TaskCollection Substitudo Essa classe foi renomeada para Cake\Console\TaskRegistry. Veja
a seo em Objetos de Registro para mais informaes sobre funcionalidades fornecidas pela nova classe.
Voc pode usar o cake upgrade rename_collections para ajuda ao atualizar seu cdigo. Tarefas
no tem mais acesso a callbacks, como nunca houve nenhum callback para se usar.
Shell
O Shell::__construct()
Cake\Console\ConsoleIo.
foi
alterado.
Ele
agora
usa
uma
instncia
de
ApiShell Removido O ApiShell foi removido pois ele no fornecia nenhum beneficio alm do prprio
arquivo fonte e da documentao/API7 online.
SchemaShell Removido O SchemaShell foi removido como ele nunca foi uma implementao completa
de migrao de banco de dados e surgiram ferramentas melhores como o Phinx8 . Ele foi substitudo pelo
CakePHP Migrations Plugin9 que funciona como um empacotamento entre o CakePHP e o Phinx10 .
7
http://api.cakephp.org/
https://phinx.org/
9
https://github.com/cakephp/migrations
10
https://phinx.org/
8
234
ExtractTask
O bin/cake i18n extract no inclui mais mensagens de validao sem traduo. Se voc
quiser mensagens de validao traduzidas voc deve encapsula-las com chamadas __() como qualquer
outro contedo.
BakeShell / TemplateTask
O Bake no faz mais parte do fonte do ncleo e suplantado pelo CakePHP Bake Plugin11
Os templates do Bake foram movidos para src/Template/Bake.
A sintaxe dos templates do Bake agora usam tags estilo erb (<% %>) para denotar lgica de template,
permitindo cdigo php ser tratado como texto plano.
O comando bake view foi renomeado para bake template.
Eventos O mtodo getEventManager(), foi removido de todos os objetos que continham. Um
mtodo eventManager() agora fornecido pelo EventManagerTrait. O EventManagerTrait
contm a lgica de instanciao e manuteno de uma referncia para um gerenciador local de eventos.
O subsistema Event teve um monte de funcionalidades opcionais removidas. Quando despachar eventos
voc no poder mais usar as seguintes opes:
passParams Essa opo est agora ativada sempre implicitamente. Voc no pode desliga-la.
break Essa opo foi removida. Voc deve agora parar os eventos.
breakOn Essa opo foi removida. Voc deve agora parar os eventos.
Log
As configuraes do Log agora no imutveis. Se voc precisa alterar a configurao voc deve
primeiro derrubar a configurao e ento recria-la. Isso previne problemas de sincronizao com
opes de configurao.
Os mecanismos de Log agora so carregados tardiamente aps a primeira escrita nos logs.
O Cake\Log\Log::engine() foi adicionado.
Os seguintes mtodos foram removidos de Cake\Log\Log :: defaultLevels(), enabled(),
enable(), disable().
Voc no pode mais criar nveis personalizados usando Log::levels().
Quando configurar os loggers voc deve usar levels ao invs de types.
Voc no pode mais especificar nveis personalizados de log. Voc deve usar o conjunto padro de
nveis de log. Voc deve usar escopos de log para criar arquivos de log personalizados ou manipulaes especficas para diferentes sees de sua aplicao. Usando um nvel de log no padro ir
lanar uma exceo.
11
https://github.com/cakephp/bake
235
O Cake\Log\LogTrait foi adicionado. Voc pode usar este trait em suas classes para adicionar
o mtodo log().
O escopo de log passado para Cake\Log\Log::write() agora encaminhado para o mtodo
write() dos mecanismos de log de maneira a fornecer um melhor contexto para os mecanismos.
Os mecanismos de Log agora so necessrios para implementar Psr\Log\LogInterface
invs do prprio LogInterface do Cake.
Em geral, se voc herdou o
Cake\Log\Engine\BaseEngine voc s precisa renomear o mtodo write() para
log().
O Cake\Log\Engine\FileLog agora grava arquivos em ROOT/logs no lugar de
ROOT/tmp/logs.
Roteamento
Parmetros Nomeados Os parmetros nomeados foram removidos no 3.0. Os parmetros nomeados
foram adicionados no 1.2.0 como uma verso bonita de parmetros de requisio. Enquanto o benefcio
visual discutvel, os problemas criados pelos parmetros nomeados no so.
Os parmetros nomeados necessitam manipulao especial no CakePHP assim como em qualquer biblioteca
PHP ou JavaScript que necessite interagir com eles, os parmetros nomeados no so implementados ou
entendidos por qualquer biblioteca exceto o CakePHP. A complexidade adicionada e o cdigo necessrio
para dar suporte aos parmetros nomeados no justificam a sua existncia, e eles foram removidos. No lugar
deles, voc deve agora usar o padro de parmetros de requisio (querystring) ou argumentos passados
configurados nas rotas. Por padro o Router ir tratar qualquer parmetro adicional ao Router::url()
como argumentos de requisio.
Como muitas aplicaes ainda precisaro analisar URLs contendo parmetros nomeados, o
Cake\Routing\Router::parseNamedParams() foi adicionado para permitir compatibilidade
com URLs existentes.
RequestActionTrait
O Cake\Routing\RequestActionTrait::requestAction() teve algumas de suas
opes extras alteradas:
o options[url] agora options[query].
o options[data] agora options[post].
os parmetros nomeados no so mais suportados.
Roteador
Os parmetros nomeados foram removidos, veja acima para mais informaes.
A opo full_base foi substituda com a opo _full.
A opo ext foi substituda com a opo _ext.
As opes _scheme, _port, _host, _base, _full, _ext foram adicionadas.
236
Use
Veja
Configurao
de
Filtros
do
Despachante
Mudaram Os
filtros
do
despachante
no so mais adicionados em sua aplicao usando o Configure.
Voc deve
agora anexa-los com Cake\Routing\DispatcherFactory.
Isso significa que
sua aplicao usava Dispatcher.filters,
voc deve usar agora o mtodo
Cake\Routing\DispatcherFactory::add().
Alm das mudanas de configurao, os filtros do despachante tiveram algumas convenes atualizadas e
novas funcionalidades. Veja a documentao em Filtros do Dispatcher para mais informaes.
237
FilterAssetFilter
Os itens de plugins e temas manipulados pelo AssetFilter no so mais lidos via include, ao invs
disso eles so tratados como arquivos de texto plano. Isso corrige um nmero de problemas com
bibliotecas javascript como TinyMCE e ambientes com short_tags ativadas.
O suporte para a configurao Asset.filter e ganchos foram removidos. Essa funcionalidade
pode ser facilmente substituda com um plugin ou filtro de despachante.
Rede
Requisio
O CakeRequest foi renomeada para Cake\Network\Request.
O Cake\Network\Request::port() foi adicionado.
O Cake\Network\Request::scheme() foi adicionado.
O Cake\Network\Request::cookie() foi adicionado.
O Cake\Network\Request::$trustProxy foi adicionado. Isso torna mais fcil colocar aplicaes CakePHP atrs de balanceadores de carga.
O Cake\Network\Request::$data no mais mesclado com a chave de dados prefixada, pois
esse prefixo foi removido.
O Cake\Network\Request::env() foi adicionado.
O Cake\Network\Request::acceptLanguage() mudou de um mtodo esttico para noesttico.
O detector de requisio para dispositivos mveis foi removido do ncleo. Agora o app template
adiciona detectores para dispositivos mveis usando a biblioteca MobileDetect.
O mtodo onlyAllow() foi renomeado para allowMethod() e no aceita mais argumentos
var. Todos os nomes de mtodos precisam ser passados como primeiro argumento, seja como string
ou como array de strings.
Resposta
O mapeamento do mimetype text/plain para extenso csv foi removido. Como consequncia o
Cake\Controller\Component\RequestHandlerComponent no define a extenso para
csv se o cabealho Accept tiver o mimetype text/plain que era um problema comum quando
recebia uma requisio XHR do jQuery.
Sesses A classe de sesso no mais esttica, agora a sesso (session) pode ser acessada atravs do objeto
de requisio (request). Veja a documentao em Sessions para ver como usar o objeto de sesso.
O Cake\Network\Session e classes de sesso relacionadas foram movidas para o namespace
Cake\Network.
O SessionHandlerInterface foi removido em favor ao fornecido pelo prprio PHP.
238
239
Controller
As propriedades $helpers e $components agora esto mescladas com todas classes pai, no
apenas a AppController e o plugin de AppController. As propriedades so mescladas de modo
diferente agora tambm. No lugar de todas as configuraes em todas as classes serem mescladas juntas, as configuraes definidas nas classes filho sero usadas. Isso quer dizer que se voc tem alguma
configuraes definida no seu AppController, e alguma configurao definida em uma a subclasse,
apenas a configurao na subclasse ser usada.
O Controller::httpCodes() foi removido, use o Cake\Network\Response::httpCodes()
no lugar.
O
Controller::disableCache()
foi
Cake\Network\Response::disableCache() no lugar.
removido,
use
O Controller::flash() foi removido. Esse mtodo era raramente usado em aplicaes reais e
no tinha mais propsito algum.
O Controller::validate() e Controller::validationErrors() foram removidos.
Eles eram restos dos dias do 1.x onde as preocupaes com os models + controllers eram muito mais
entrelaados.
O Controller::loadModel() agora carrega uma tabela de objetos.
A propriedade Controller::$scaffold foi removida. O scaffolding dinmico foi removido do
ncleo do CakePHP. Um plugin de scaffolding melhorado, chamado CRUD, pode ser encontrado em:
https://github.com/FriendsOfCake/crud
A propriedade Controller::$ext foi removida. Voc deve agora estender e sobrescrever a propriedade View::$_ext se voc deseja usar uma extenso de arquivo de viso no padro.
A propriedade Controller::$methods foi removida.
Voc deve usar o
Controller::isAction() para determinar quando ou no um nome de mtodo uma
ao. Essa mudana foi feita para permitir personalizaes mais fceis do que vai contar ou no
como uma ao.
A propriedade Controller::$Components foi removida e substituda pelo _components.
Se voc precisar carregar componentes em tempo de execuo voc deve usar o
$this->loadComponent() em seu controller.
A assinatura do Cake\Controller\Controller::redirect() mudou para
Controller::redirect(string|array $url, int $status = null).
O terceiro argumento $exit foi removido. O mtodo no pode mais enviar resposta e sair do script, no
lugar ele retorna uma instncia de Response com os cabealhos apropriados definidos.
As propriedades mgicas base, webroot, here, data, action, e params foram removidas.
Voc deve acessar todas essas propriedades em $this->request no lugar.
Mtodos de controlar prefixados com sublinhado como _someMethod() no so mais tratados
como mtodos privados. Use as palavras chaves de visibilidade apropriadas no lugar. Somente mtodos pblicos podem ser usados como ao de controllers.
240
Scaffold Removido O scaffolding dinmico no CakePHP foi removido do ncleo do CakePHP. Ele no
era usado com frequncia, e no era voltado para uso em produo. Um plugin melhorado de scaffolding,
chamado CRUD, pode ser encontrado em: https://github.com/FriendsOfCake/crud
ComponentCollection
Substitudo Essa
classe
foi
renomeada
para
Cake\Controller\ComponentRegistry. Veja a seo em Objetos de Registro para mais informaes sobre as funcionalidades fornecidas pela nova classe. Voc pode usar o cake upgrade
rename_collections para ajudar voc a atualizar o seu cdigo.
Components
A propriedade _Collection agora _registry.
Cake\Controller\ComponentRegistry agora.
Todos components devem agora usar o mtodo config() para obter/definir configuraes.
A configurao padro para components deve ser definido na propriedade $_defaultConfig.
Essa propriedade automaticamente mesclada com qualquer configurao fornecida pelo construtor.
Opes de configurao no so mais definidas como propriedades pblicas.
O mtodo Component::initialize() no mais um event listener (ouvinte de eventos). Ao invs disso, ele um gancho ps-construtor como o Table::initialize() e
Controller::initialize(). O novo mtodo Component::beforeFilter() ligado
ao mesmo evento que o Component::initialize() costumava ser. O mtodo de inicializao
deve ter a seguinte assinatura initialize(array $config).
Controller\Components
CookieComponent
Ele usa o Cake\Network\Request::cookie() para ler os dados de cookies, isso facilita os
testes, e permite o ControllerTestCase definir os cookies.
Os Cookies encriptados pelas verses anteriores do CakePHP usando o mtodo cipher(), agora
no podem ser lidos, pois o Security::cipher() foi removido. Voc precisar reencriptar os
cookies com o mtodo rijndael() ou aes() antes de atualizar.
O CookieComponent::type() foi removido e substitudo com dados de configurao acessados
atravs de config().
O write() no aceita mais os parmetros encryption ou expires. Os dois agora so gerenciados atravs de dados de configurao. Veja CookieComponent para mais informaes.
O caminho padro para os cookies agora o caminho base da aplicao, ao invs de /.
AuthComponent
241
O Default agora o hasher de senhas padro usado pelas classes de autenticao. Ele usa exclusivamente o algoritmo de hash bcrypt. Se voc desejar continuar usando o hash SHA1 usado no 2.x,
use passwordHasher => Weak nas configuraes de seu autenticador.
O novo FallbackPasswordHasher foi adicionado para ajudar os usurios migrar senhas antigas
de um algoritmo para o outro. Veja a documentao do AuthComponent para mais informaes.
A classe BlowfishAuthenticate foi removida. Apenas use FormAuthenticate.
A classe BlowfishPasswordHasher foi removida. Use o DefaultPasswordHasher no
lugar.
O mtodo loggedIn() foi removido. Use o user() no lugar.
As opes de configurao no so mais definidas como propriedades pblicas.
Os mtodos allow() e deny() no aceitam mais var args. Todos os nomes de mtodos precisam
ser passados como primeiro argumento, seja como string ou array de strings.
O mtodo login() foi removido e substitudo por setUser(). Para logar um usurio agora voc
deve chamar identify() que retorna as informaes do usurio caso identificado com sucesso e
ento usar setUser() para salvar as informaes na sesso de maneira persistente entre as requisies.
O BaseAuthenticate::_password() foi removido. Use a classe PasswordHasher no
lugar.
O BaseAuthenticate::logout() foi removido.
O AuthComponent agora dispara dois eventos Auth.afterIdentify e Auth.logout
aps um usurio ser identificado e antes de um usurio ser deslogado respectivamente. Voc
pode definir funes de callback para esses eventos retornando um array mapeado no mtodo
implementedEvents() de sua classe de autenticao.
Classes relacionadas a ACL foram movidas para um plugin separado. Hashers de senha, fornecedores de
Autenticao e Autorizao foram movidos para o namespace \Cake\Auth. Voc DEVE mover seus
fornecedores e hashers para o namespace App\Auth tambm.
RequestHandlerComponent
Os seguintes mtodos foram removidos do componente RequestHandler:
isAjax(),
isFlash(), isSSL(), isPut(), isPost(), isGet(), isDelete(). Use o mtodo
Cake\Network\Request::is() no lugar com o argumento relevante.
O
RequestHandler::setContent()
Cake\Network\Response::type() no lugar.
foi
removido,
use
O
RequestHandler::getReferer()
Cake\Network\Request::referer() no lugar.
foi
removido,
use
removido,
use
O
RequestHandler::getClientIP()
Cake\Network\Request::clientIp() no lugar.
foi
242
foi
removido,
use
(gerenciador
de
conexo)
foi
movido
para
namespace
243
sourceList
getSourceName
loadDataSource
enumConnectionObjects
O Database\ConnectionManager::config() foi adicionado e agora o nico jeito de configurar conexes.
O Database\ConnectionManager::get()
getDataSource().
foi
adicionado.
Ele
substitui
Behaviors
Os mtodos de comportamentos (behaviors) prefixados com sublinhado como _someMethod() no
so mais tratados como mtodos privados. Use as palavras chaves de visibilidade.
TreeBehavior O TreeBehavior foi completamente reescrito para usar o novo ORM. Embora ele funcione
do mesmo modo que no 2.x, alguns mtodos foram renomeados ou removidos:
TreeBehavior::children() agora uma busca personalizada find(children).
TreeBehavior::generateTreeList()
find(treeList).
agora
uma
busca
personalizada
assertEqual($is,
245
246
XmlView
A Cake\View\XmlView agora suporta a varivel de viso _xmlOptions. Isso permite a voc
configurar as opes usadas quando gerar XML.
View\Helper
A propriedade $settings agora chamada $_config e deve ser acessada atravs do mtodo
config().
As opes de configurao no so mais definidas como propriedades pblicas.
O Helper::clean() foi removido. Ele nunca foi robusto o suficiente para prevenir completamente XSS. Ao invs disso voc deve escapar o contedo com h ou ou usar uma biblioteca dedicada
como o htmlPurifier.
O Helper::output() foi removido. Esse mtodo estava obsoleto no 2.x.
Os mtodos Helper::webroot(),
Helper::url(),
Helper::assetUrl(),
Helper::assetTimestamp()
foram
movidos
para
o
novo
ajudante
Cake\View\Helper\UrlHelper.
O Helper::url() est agora disponvel como
Cake\View\Helper\UrlHelper::build().
Os Assessores Mgicos a propriedades obsoletas foram removidos. A seguinte propriedade agora
deve ser acessada a partir do objeto de requisio:
base
here
webroot
data
action
params
Helpers A classe Helper teve os seguintes mtodos removidos:
Helper::setEntity()
Helper::entity()
Helper::model()
Helper::field()
Helper::value()
Helper::_name()
Helper::_initInputField()
Helper::_selectedArray()
247
Esses mtodos eram partes usadas apenas pelo FormHelper, e parte de uma funcionalidade de persistncia
de campos que se mostrou problemtica com o tempo. O FormHelper no precisa mais destes mtodos e a
complexidades que eles provm no mais necessria.
Os seguintes mtodos foram removidos:
Helper::_parseAttributes()
Helper::_formatAttribute()
Esses mtodos podem agora ser encontrados na classe StringTemplate que os helpers usam com frequncia. Veja o StringTemplateTrait para um jeito fcil de integrar os templates de string em seus
prprios helpers.
FormHelper O FormHelper foi completamente reescrito para o 3.0. Ele teve algumas grandes mudanas:
O FormHelper trabalha junto com o novo ORM. Mas tambm possui um sistema extensvel para
integrar com outros ORMs e fontes de dados.
O FormHelper possui um sistema de widgets extensvel que permite a voc criar novos widgets de
entrada personalizados e expandir facilmente aqueles inclusos no framework.
Os Templates de String so a fundao deste ajudante. Ao invs de encher de arrays por toda parte,
a maioria do HTML que o FormHelper gera pode ser personalizado em um lugar central usando
conjuntos de templates.
Alm dessas grandes mudanas, foram feitas algumas mudanas menores que causaram rompendo algumas
coisas da verso anterior. Essas mudanas devem simplificar o HTML que o FormHelper gera e reduzir os
problemas que as pessoas tinham no passado:
O prefixo data[ foi removido de todas as entradas geradas. O prefixo no tem mais propsito.
Os vrios mtodos de entradas independentes, como text(), select() e outros, no geram mais
atributos id.
A opo inputDefaults foi removida de create().
As opes default e onsubmit do create() foram removidas. No lugar voc deve usar
JavaScript event binding ou definir todos os cdigos js necessrios para o onsubmit.
O end() no gerar mais botes. Voc deve criar botes com button() ou submit().
O FormHelper::tagIsInvalid() foi removido. Use isFieldError() no lugar.
O FormHelper::inputDefaults() foi removido.
definir/expandir os templates que o FormHelper usa.
248
As opes separator, between, e legend foram removidas do radio(). Voc pode usar
templates para mudar o HTML envoltrio agora.
O parmetro format24Hours foi removido de hour(). Ele foi substitudo pela opo format.
Os parmetros minYear e maxYear foram removidos do year(). Ambos podem ser fornecidos
como opes.
Os parmetros dateFormat e timeFormat foram removidos do datetime(). Voc pode usar
o template para definir a ordem que as entradas devem ser exibidas.
O submit() teve as opes div, before e after removidas. Voc pode personalizar o template
submitContainer para modificar esse contedo.
O mtodo inputs() no aceita mais legend e fieldset no parmetro $fields, voc
deve usar o parmetro $options. Ele tambm exige que o parmetro $fields seja um array.
O parmetro $blacklist foi removido, a funcionalidade foi substituda pela especificao de
field => false no parmetro $fields.
O parmetro inline foi removido do mtodo postLink(). Voc deve usar a opo block no lugar.
Definindo block => true ir emular o comportamento anterior.
O parmetro timeFormat para hour(), time() e dateTime() agora 24 por padro, em
cumprimento ao ISO 8601.
O argumento $confirmMessage de Cake\View\Helper\FormHelper::postLink() foi
removido. Voc deve usar agora a chave confirm no $options para especificar a mensagem.
As entradas do tipo Checkbox e radio so agora renderizadas dentro de elementos do tipo label por
padro. Isso ajuda a aumentar a compatibilidade com bibliotecas CSS populares como Bootstrap12 e
Foundation13 .
As tags de template agora so todas camelBacked (primeira letra minscula e inicio de novas palavras
em maisculo). As tags pr-3.0 formstart, formend, hiddenblock e inputsubmit so
agora formStart, formEnd, hiddenBlock e inputSubmit. Certifique-se de altera-las se
elas estiverem personalizando sua aplicao.
recomendado que voc revise a documentao Form para mais detalhes sobre como usar o FormHelper
no 3.0.
HtmlHelper
O HtmlHelper::useTag() foi removido, use tag() no lugar.
O HtmlHelper::loadConfig() foi removido. As tags podem ser personalizadas usando
templates() ou as configuraes de templates.
O segundo parmetro $options para HtmlHelper::css() agora sempre ir exigir um array.
O primeiro parmetro $data para HtmlHelper::style() agora sempre ir exigir um array.
12
13
http://getbootstrap.com/
http://foundation.zurb.com/
249
O parmetro inline foi removido dos mtodos meta(), css(), script() e scriptBlock(). Ao invs
disso, voc deve usar a opo block. Definindo block => true ir emular o comportamento
anterior.
O HtmlHelper::meta() agora exige que o $type seja uma string. Opes adicionais podem
ser passadas como $options.
O HtmlHelper::nestedList() agora exige que o $options seja um array. O quarto argumento para o tipo tag foi removido e incluido no array $options.
O argumento $confirmMessage de Cake\View\Helper\HtmlHelper::link() foi removido. Voc deve usar agora a chave confirm no $options para especificar a menssagem.
PaginatorHelper
O link() foi removido. Ele no era mais usado internamente pelo ajudante. Ele era pouco usado
em cdigos de usurios e no se encaixava mais nos objetivos do ajudante.
O next() no tem mais as opes class ou tag. Ele no tem mais argumentos desabilitados. Ao
invs disso so usados templates.
O prev() no tem mais as opes class ou tag. Ele no tem mais argumentos desabilitados. Ao
invs disso so usados templates.
O first() no tem mais as opes after, ellipsis, separator, class ou tag.
O last() no tem mais as opes after, ellipsis, separator, class ou tag.
O numbers() no tem mais as opes separator, tag, currentTag, currentClass, class, tag e
ellipsis. Essas opes so agora facilitadas pelos templates. Ele tambm exige que agora o parmetro
$options seja um array.
250
NumberHelper
O NumberHelper::format() agora exige que $options seja um array.
SessionHelper
O SessionHelper est obsoleto. Voc pode usar $this->request->session() diretamente, e a funcionalidade de mensagens flash foi movida para Flash.
JsHelper
O JsHelper e todos motores associados foram removidos. Ele podia gerar somente um subconjunto
muito pequeno de cdigos JavaScript para biblioteca selecionada e consequentemente tentar gerar
todo cdigo JavaScript usando apenas o ajudante se tornava um impedimento com frequncia.
recomendado usar diretamente sua biblioteca JavaScript preferida.
CacheHelper Removido O CacheHelper foi removido. A funcionalidade de cache que ele fornecia no
era padro, limitada e incompatvel com layouts no-HTML e views de dados. Essas limitaes significavam que uma reconstruo completa era necessria. O ESI (Edge Side Includes) se tornou uma maneira
padronizada para implementar a funcionalidade que o CacheHelper costumava fornecer. Entretanto, implementando Edge Side Includes14 em PHP tem vrias limitaes e casos. Ao invs de construir uma soluo
ruim, recomendado que os desenvolvedores que precisem de cache de resposta completa use o Varnish15
ou Squid16 no lugar.
I18n O subsistema de internacionalizao foi completamente reescrito. Em geral, voc pode esperar o
mesmo comportamento que nas verses anteriores, especialmente se voc est usando a famlia de funes
__().
Internamente, a classe I18n usa Aura\Intl, e mtodos apropriados so expostos para dar acesso a
funes especficas da biblioteca. Por esta razo a maior parte dos mtodos dentro de I18n foram removidos ou renomeados.
Devido ao uso do ext/intl, a classe L10n foi removida completamente. Ela fornecia dados incompletos
e desatualizados em comparao com os dados disponveis na classe Locale do PHP.
O idioma padro da aplicao no ser mais alterado automaticamente pelos idiomas aceitos pelo navegador
nem por ter o valor Config.language definido na sesso do navegador. Voc pode, entretanto, usar um
filtro no despachante para trocar o idioma automaticamente a partir do cabealho Accept-Language
enviado pelo navegador:
// No config/bootstrap.php
DispatcherFactory::addFilter('LocaleSelector');
No h nenhum substituto incluso para selecionar automaticamente o idioma a partir de um valor configurado na sesso do usurio.
14
http://en.wikipedia.org/wiki/Edge_Side_Includes
http://varnish-cache.org
16
http://squid-cache.org
15
251
A funo padro para formatao de mensagens traduzidas no mais a sprintf, mas a mais avanada
e funcional classe MessageFormatter. Em geral voc pode reescrever os espaos reservados nas mensagens como segue:
// Antes:
__('Hoje um dia %s na %s', 'Ensolarado', 'Espanha');
// Depois:
__('Hoje um dia {0} na {1}', 'Ensolarado', 'Espanha');
Voc pode evitar ter de reescrever suas mensagens usando o antigo formatador sprintf:
I18n::defaultFormatter('sprintf');
Adicionalmente, o valor Config.language foi removido e ele no pode mais ser usado para controlar o
idioma atual da aplicao. Ao invs disso, voc pode usar a classe I18n:
// Antes
Configure::write('Config.language', 'fr_FR');
// Agora
I18n::locale('en_US');
para
Como agora o CakePHP requer a extenso mbstring, a classe Multibyte foi removida.
As mensagens de erro por todo o CakePHP no passam mais atravs das funes de internacionalizao. Isso foi feito para simplificar o ncleo do CakePHP e reduzir a sobrecarga. As mensagens
apresentadas aos desenvolvedores so raramente, isso quando, so de fato traduzidas - de modo que
essa sobrecarga adicional trs pouco beneficio.
Localizao
Agora o construtor de Cake\I18n\L10n recebe uma instncia de Cake\Network\Request
como argumento.
Testes
O TestShell foi removido. O CakePHP, o esqueleto da aplicao e novos plugins cozinhados,
todos usam o phpunit para rodar os testes.
O webrunner (webroot/test.php) foi removido. A adoo do CLI aumentou grandemente desde o
release inicial do 2.x. Adicionalmente, os CLI de execuo oferecem integrao superior com IDEs
e outras ferramentas automticas.
252
Se voc sentir necessidade de um jeito de executar os testes a partir de um navegador, voc deve
verificar o VisualPHPUnit17 . Ele oferece muitas funcionalidades adicionais que o antigo webrunner.
O ControllerTestCase est obsoleto e ser removido no CakePHP 3.0.0. Ao invs disso, voc
deve usar a nova funcionalidade Controller Integration Testing.
As Fixtures devem agora ser referenciadas usando sua forma no plural:
// No lugar de
$fixtures = ['app.artigo'];
// Voc deve usar
$fixtures = ['app.artigos'];
Utilitrios
Classe Set Removida A classe Set foi removida, agora voc deve usar a classe Hash no lugar dela.
Pastas & Arquivos As classes de pastas e arquivos foram renomeadas:
O Cake\Utility\File foi renomeado para Cake\Filesystem\File
O Cake\Utility\Folder foi renomeado para Cake\Filesystem\Folder
Inflexo
O valor padro para o argumento $replacement do Cake\Utility\Inflector::slug()
foi alterado do sublinhado (_) para o trao (-). Usando traos para separar palavras nas URLs a
escolha popular e tambm recomendada pelo Google.
As transliteraes para Cake\Utility\Inflector::slug() foram alteradas. Se voc usa
transliteraes personalizadas voc ter que atualizar seu cdigo. No lugar de expresses regulares,
as transliteraes usam simples substituies de string. Isso rendeu melhorias de performance significativas:
// No lugar de
Inflector::rules('transliteration', [
'/|/' => 'ae',
'//' => 'aa'
]);
// Voc deve usar
Inflector::rules('transliteration', [
'' => 'ae',
'' => 'ae',
'' => 'aa'
]);
17
https://github.com/NSinopoli/VisualPHPUnit
253
Os conjuntos distintos de regras de no-inflexes e irregulares para pluralizao e singularizao foram removidos. No lugar agora temos uma lista comum para cada. Quando usar
Cake\Utility\Inflector::rules() com o tipo singular e plural voc no poder mais
usar chaves como uninflected e irregular no array de argumentos $rules.
Voc pode adicionar / sobrescrever a lista de regras de no-inflexionados e irregulares usando
Cake\Utility\Inflector::rules() com valores uninflected e irregular para o argumento $type.
Sanitize
A classe Sanitize foi removida.
Segurana
O Security::cipher() foi removido. Ele era inseguro e promovia prticas ruins de criptografia.
Voc deve usar o Security::encrypt() no lugar.
O valor de configurao Security.cipherSeed no mais necessrio. Com a remoo de
Security::cipher() ele no tem utilidade.
A retrocompatibilidade do Cake\Utility\Security::rijndael() para valores encriptados antes do CakePHP 2.3.1 foi removido.
Voc deve reencriptar os valores usando
Security::encrypt() e uma verso recente do CakePHP 2.x antes de migrar.
A habilidade para gerar um hash do tipo blowfish foi removido. Voc no pode mais usar
o tipo blowfish em Security::hash(). Deve ser usado apenas o password_hash() do
PHP e password_verify() para gerar e verificar hashes blowfish. A compabilidade da biblioteca
ircmaxell/password-compat18 que instalado junto com o CakePHP fornece essas funes para verses de PHP menor que 5.5.
O OpenSSL usado agora no lugar do mcrypt ao encriptar/desencriptar dados. Esse alterao fornece
uma melhor performance e deixa o CakePHP a prova de futuros abandonos de suporte das distribuies ao mcrypt.
O Security::rijndael() est obsoleto e apenas disponvel quando se usa o mcrypt.
Aviso: Dados encriptados com Security::encrypt() em verses anteriores no so compatveis com a
implementao openssl. Voc deve definir a implementao como mcrypt quando fizer atualizao.
Data e Hora
O CakeTime foi renomeado para Cake\I18n\Time.
O CakeTime::serverOffset() foi removido. Ele provia prticas incorretas de operaes com
tempo.
O CakeTime::niceShort() foi removido.
O CakeTime::convert() foi removido.
18
https://packagist.org/packages/ircmaxell/password-compat
254
Nmeros A biblioteca Number foi reescrita para usar internamente a classe NumberFormatter.
O CakeNumber foi renomeada para Cake\I18n\Number.
O Number::format() agora exige que o $options seja um array.
O Number::addFormat() foi removido.
O Number::fromReadableSize() foi movido para Cake\Utility\Text::parseFileSize().
Validao
A faixa de valores para Validation::range() agora inclusiva se $lower e $upper forem
fornecidos.
O Validation::ssn() foi removido.
Xml
O Xml::build() agora exige que o $options seja um array.
255
O Xml::build() no aceita mais uma URL. Se voc precisar criar um documento XML a partir
de uma URL, use o
Guia de atualizao para o novo ORM
Informaes Gerais
Processo de desenvolvimento no CakePHP
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github20 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.
Glossrio
Nota: A documentao no atualmente suportada pela lingua portuguesa nesta pgina.
Por favor, sinta-se a vontade para nos enviar um pull request no Github21 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 array An array of attributes that are passed to Router::url(). They typically look like:
['controller' => 'Posts', 'action' => 'view', 5]
HTML attributes An array of key => values that are composed into HTML attributes. For example:
19
https://github.com/cakephp/docs
https://github.com/cakephp/docs
21
https://github.com/cakephp/docs
20
256
// Given
['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
['checked' => true]
// Would generate
checked="checked"
plugin syntax Plugin syntax refers to the dot separated class name indicating classes are part of a plugin:
// The plugin is "DebugKit", and the class name is "Toolbar".
'DebugKit.Toolbar'
// The plugin is "AcmeCorp/Tools", and the class name is "Toolbar".
'AcmeCorp/Tools.Toolbar'
dot notation Dot notation defines an array path, by separating nested levels with . For example:
Cache.default.engine
CSRF Cross Site Request Forgery. Prevents replay attacks, double submissions and forged requests from
other domains.
CDN Content Delivery Network. A 3rd party vendor you can pay to help distribute your content to data
centers around the world. This helps put your static assets closer to geographically distributed users.
routes.php A file in config directory 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.
PaaS Platform as a Service. Platform as a Service providers will provide cloud based hosting, database
and caching resources. Some popular providers include Heroku, EngineYard and PagodaBox
DSN Data Source Name. A connection string format that is formed like a URI. CakePHP supports DSNs
for Cache, Database, Log and Email connections.
Informaes Gerais
257
258
c
Cake\Console, 149
Cake\Controller, 115
Cake\View\Helper, 131
259
260
ndice
Symbols
() (Cake\Console\ method), 154
:action, 111
:controller, 111
:plugin, 111
$this->request, 113
CDN, 257
components (Cake\Controller\Controller property),
122
ConsoleOptionParser (classe em Cake\Console), 157
Controller (classe em Cake\Controller), 115
CSRF, 257
C
Cake\Console (namespace), 149
Cake\Controller (namespace), 115
Cake\View\Helper (namespace), 128131
I
initialize()
(Cake\Console\ConsoleOptionParser
method), 165
261
L
loadComponent()
(Cake\Controller\Controller
method), 122
loadModel() (Cake\Controller\Controller method),
121
N
NumberHelper (classe em Cake\View\Helper), 129
P
PaaS, 257
paginate() (Cake\Controller\Controller method), 122
PaginatorHelper (classe em Cake\View\Helper), 129
plugin syntax, 257
R
redirect() (Cake\Controller\Controller method), 120
render() (Cake\Controller\Controller method), 119
routes.php, 257
routing array, 256
RssHelper (classe em Cake\View\Helper), 130
S
SessionHelper (classe em Cake\View\Helper), 130
set() (Cake\Controller\Controller method), 118
setAction() (Cake\Controller\Controller method),
121
startup()
(Cake\Console\ConsoleOptionParser
method), 165
T
TextHelper (classe em Cake\View\Helper), 130
TimeHelper (classe em Cake\View\Helper), 131
trailing star, 111
U
UrlHelper (classe em Cake\View\Helper), 131
262
ndice