Apostila Curso Cakephp 2km

Embed Size (px)

Citation preview

  • 7/21/2019 Apostila Curso Cakephp 2km

    1/226

  • 7/21/2019 Apostila Curso Cakephp 2km

    2/226

    Nota de copyright

    As informaes contidas neste documento esto sujeitas a alteraes sem prvio aviso. As empresas, os

    nomes de pessoas e os dados aqui mencionados so fictcios, salvo indicao em contrrio.

    Nenhuma parte deste documento pode ser reproduzida ou transmitida de qualquer forma ou meio, eletrnico

    ou mecnico, para qualquer propsito, sem a permisso expressa, por escrito, da 2km interativa!.

    2011 2km interativa!. Todos os direitos reservados.

    CakePHPTM marca registrada da Cake Software Foundation, Inc.

  • 7/21/2019 Apostila Curso Cakephp 2km

    3/226

  • 7/21/2019 Apostila Curso Cakephp 2km

    4/226

    I - Introduo 6

    II - Sobre o CakePHP 6

    III - Vantagens do CakePHP 6

    1 - Instalao 8

    1.1 - Requisitos para Utilizao do CakePHP 8

    1.2 - Configurando o Apache 8

    1.2.1 - Configurando o mod_rewrite 8

    1.2.2 - Configurando um endereo por meio de alias 8

    1.2.3 - Configurando um endereo usando virtual host 9

    1.2.4 - Configurando o mod_userdir 10

    1.2.5 - Comparando as configuraes do Apache 10

    1.3 - Instalando o CakePHP 11

    1.4 - Estrutura de diretrios 11

    1.5 - Arquivos de configurao do CakePHP 12

    1.5.1 - O arquivo de configurao database.php 12

    1.5.2 - O arquivo de configurao core.php 13

    1.5.3 - O arquivo de configurao bootstrap.php 14

    1.6 - Instalao Avanada do CakePHP 15

    2 - Desenvolvendo com o CakePHP 16

    2.1 - Convenes no CakePHP 16

    2.1.1 - Convenes para nome de arquivos e nome de classes 16

    2.1.2 - Convenes para a camada de modelo e banco de dados 17

    2.1.3 - Convenes para a camada de controle 17

    2.1.4 - Convenes para a camada de viso 18

    2.1.5 - Todas as Convenes 19

    2.2 - Constantes 19

    2.3 - A Arquitetura MVC 21

    2.3.1 - A camada de modelo 22

    2.3.2 - A camada de controle 43

    2.3.3 - A camada de viso 49

    2.4 - Usando o bake 53

    2.4.1 - Criando um novo projeto 54

    2.4.2 - Gerando o arquivo de configurao do banco de dados 54

    Contedo

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    1 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    5/226

    2.4.3 - Gerando as classes de modelo 572.4.4 - Gerando as classes de controle 81

    2.4.5 - Gerando as pginas da viso 97

    3 - Aperfeioando sua Aplicao 92

    3.1 - Rotas 92

    3.1.1 - Rota Administrativa 92

    3.1.2 - Criando suas Prprias Rotas 93

    3.1.3 - Usando Rotas com Prefixo 94

    3.1.4 - Entendendo as Rotas Reversas 94

    3.2 - Vendors 94

    3.3 - DRY 95

    3.4 - Behavior 96

    3.4.1 - ACL 96

    3.4.2 - Containable 97

    3.4.3 - Translate 99

    3.4.4 - Tree 99

    3.5 - Components 102

    3.5.1 - ACL 102

    3.5.2 - Authentication 103

    3.5.3 - Cookies 109

    3.5.4 - Email 110

    3.5.5 - Request Handling 111

    3.5.6 - Security Component 114

    3.5.7 - Sessions 114

    3.6 - Helpers 115

    3.6.1 - AJAX 115

    3.6.2 - Cache 116

    3.6.3 - Form 117

    3.6.4 - HTML 122

    3.6.5 - Javascript 126

    3.6.6 - Number 128

    3.6.7 - Paginator 130

    3.6.8 - RSS 131

    3.6.9 - Session 133

    3.6.10 - Text 133

    3.6.11 - Time 1353.6.12 - XML 137

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    2 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    6/226

    3.7 - Plugins 138

    3.7.1 - Criando um Plugin 138

    3.7.2 - Camada de Controle 138

    3.7.3 - Camada de Modelo 139

    3.7.4 - Camada de Viso 139

    3.7.5 - Components, Helpers e Behaviors 139

    3.7.6 - Imagens, CSS, Javascript 139

    3.8 - Core Utility Libraries 139

    3.8.1 - Inflector 139

    3.8.2 - Strings 140

    3.8.3 - XML 140

    3.8.4 - Set 141

    3.8.5 - Cache 158

    3.8.6 - HTTPSocket 159

    3.9 - Debugging 160

    3.9.1 - debug 160

    3.9.2 - Debugger::dump 161

    3.9.3 - Debugger::log 161

    3.9.4 - Debugger::trace 161

    3.9.5 - Debugger::excerpt 162

    3.9.6 - Debugger::exportVar 162

    3.9.7 - Debugger::invoke 162

    3.10 - Logging 162

    4 - Localizao e Internacionalizao 162

    4.1 - Localizao (l10n) 162

    4.1.1 - Extraindo o arquivo POT dos arquivos do projeto 163

    4.2 - Internacionalizao (i18n) 166

    4.2.1 - Utilizando o behavior Translate 166

    5 - Segurana 171

    5.1 - Componente de Segurana 171

    5.1.1 - Mtodos do componente de Segurana 172

    5.1.2 - Uso do componente de segurana 172

    5.1.3 - Sistema bsico de autenticao HTTP 173

    5.2 - Data Sanitization 174

    5.2.1 - Paranoid 1745.2.2 - html 174

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    3 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    7/226

    5.2.3 - escape 175

    5.2.4 - clean 175

    6 - Integrando Aplicaes 175

    6.1 - Web Services 175

    6.1.1 - Utilizando um Web Service REST 176

    6.1.2 - Criando um Web Service REST 177

    6.2 - Data Sources 180

    6.2.1 - Utilizando um Data Source LDAP 181

    6.2.2 Criando um Data Source 183

    7 - Customizando Componentes 185

    7.1 - Behaviors 185

    7.1.1 - Criando Behaviors 185

    7.2 - Components 187

    7.3 - Helpers 188

    8 - Ajax no CakePHP 190

    8.1 - O Helper Js 190

    8.1.1 - Utilizando o mecanismo padro de Javascript (jQuery) 190

    8.1.2 - Trabalhando com scripts no bu!er 190

    8.1.3 - Mtodos 191

    8.1.3.1 - link 191

    8.1.3.2 - e!ect 192

    8.1.3.3 - object 192

    8.1.3.4 - submit 192

    8.1.3.5 - drag & drop 192

    8.1.3.6 - slider 194

    8.1.3.7 - sortable 194

    9 - Ajax no CakePHP com a jQuery 195

    9.1 - Fazendo o download do helper 195

    9.2 - Configurando o helper 196

    9.2.1 - Link AJAX 196

    9.2.2 - Envio de formulrio por AJAX 196

    10 - Testes 197

    10.1 - Preparando o Ambiente 197

    10.1.1 - Instalando o SimpleTest 197

    10.1.2 - Executando o teste de casos Core 19710.2 - Preparando os dados 197

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    4 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    8/226

    10.2.1 - Sobre fixtures 197

    10.2.2 - Criando fixtures 198

    10.2.3 - Importando informaes de tabelas e seus registros 199

    10.3 - Criando os testes 201

    10.4 - Testando as classes de modelos 201

    10.4.1 - Criando um teste 201

    10.4.2 - Criando um mtodo de teste 202

    10.5 - Testando as Classes de Controles 203

    10.5.1 - Criando um teste 203

    10.5.2 - O mtodo testAction 205

    10.5.3 - Pitfalls 205

    10.6 - Testando Helpers 206

    10.6.1 - Criando teste de Helpers 206

    10.7 - Testando Componentes 207

    10.7.1 - Iniciando o Componente 207

    10.7.2 - Criando o mtodo de teste 208

    10.8 - Testando a classe de viso (Web Testing) 208

    10.8.1 - Sobre o CakeWebTestCase 208

    10.8.2 - Criando um teste 208

    10.8.3 - Testando uma pgina 209

    10.9 - Testando pluggins 209

    10.10 - Gerando Relatrios 210

    10.11 - Agrupando Testes 212

    11 - O Console do CakePHP 212

    11.1 - Conhecendo os shells padres 213

    11.1.1 - api 213

    11.1.2 - bake 214

    11.1.2.1 - Customizando o bake 215

    11.1.3 - console 215

    11.1.4 - i18n 217

    11.1.5 - schema 217

    11.1.6 - testsuite 220

    11.2 - Criando shells e tasks 221

    11.2.1 - Criando um shell customizado 221

    11.2.2 - Criando uma task 222

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    5 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    9/226

    Introduo

    Desenvolver um sistema com qualidade, dentro do prazo e custo estipulados um desafio que as empresas dedesenvolvimento de softwaresempre buscaram atender. Uma soluo conhecida para este problema areusabilidade.

    Esta consiste em reaproveitar partes do sistema, que j existem e desta forma obter maior produtividade e

    qualidade no desenvolvimento. O ganho de qualidade acontece em virtude da reutilizao de partes que jforam testadas previamente em outros trechos do software, ou at mesmo em outras aplicaes. O aumentoda produtividade decorre do reaproveitamento de partes j existentes.

    A reusabilidade pode ser feita atravs de cpia de cdigo-fonte, o que no recomendado, pois replicar ocdigo-fonte pode implicar em problemas de manuteno. Por meio de classes, componentes e herana,podendo chegar a um nvel mais alto que so os frameworks.

    Um framework uma infra-estrutura ou esqueleto de uma famlia de aplicaes projetado para ser reutilizado.Basicamente, aplicaes especficas so construdas especializando as classes do frameworkpara fornecer aimplementao de alguns mtodos e, assim a aplicao implementa somente as funcionalidades especficas(DEUTSCH, 1989).

    As vantagens do uso de frameworksnos projetos, de acordo com Assis (2003) e Sauv (2004) so:

    Reduo do tempo de codificao: muitas funcionalidades necessrias j esto disponveis noframework;Solues bem testadas por outras pessoas: Os frameworksso utilizados por muitas pessoas, istogarante um alto nvel de maturidade ao se descobrir erros e adicionar novas funcionalidades;Programadores implementam somente o que necessrio: no preciso que se codifique todo osoftware, pois se utiliza os componentes que j esto prontos;Reduo de erros: os frameworksdiminuem o nmero de linhas de codificao, desta forma, reduzemtambm a possibilidade de erros comuns.

    importante destacar a diferena de um frameworkpara uma biblioteca de classes, dentre as diferenas a demaior destaque a forma como o fluxo de execuo controlado. Quando se utiliza uma biblioteca declasses, o programador que define como vai ser a execuo dos comandos. Diferentemente das bibliotecas,os frameworksinvertem este controle de execuo, sendo eles os responsveis por controlar o fluxo da

    execuo.

    Sobre o CakePHP

    CakePHP um frameworkpara desenvolvimento gil, escrito na linguagem PHP. Ele usa padres de projetosconhecidos, como ORM e MVC; utiliza tambm o paradigma das convenes no lugar do uso de configuraes.Este frameworkbusca a reduo do custo de desenvolvimento atravs da diminuio do nmero de linhas decdigo-fonte.

    Ele um softwarelivre, licenciado sob a licena MIT - http://www.opensource.org/licenses/mit-license.php.

    Vantagens do CakePHP

    Dentre os diversos recursos que agregam valor ao utilizar o CakePHP, podemos citar:

    Softwarelivre com uma comunidade crescente e ativa.Tem uma licena flexvel (MIT).Compatvel com PHP 4 e 5.Facilidade de gerar a codificao do CRUD.Sca!olding- gerao de telas dinmicas (on the fly).Gerao de cdigo-fonteArquitetura MVCUso de URLs amigveisValidao embutidaTemplates rpidos e flexiveis, utilizando sintaxe PHP

    Desenvolvimento de viewscom helpersDiversos componentes disponveis

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    6 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    10/226

    Lista de controle de acessos (ACL)Proteo contra dados maliciosos (Data Sanitization)Ferramentas para cachingInternacionalizao e LocalizaoFunciona em qualquer servidor webrodando PHP.E o principal: devolve ao programador a diverso de programar.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    7 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    11/226

    1 - Instalao

    1.1 - Requisitos para Utilizao do CakePHP

    O frameworkCakePHP funciona em qualquer servidor web que seja capaz de executar scriptsem linguagemPHP 4 ou superior.

    Servidor web: Apache 2.0, LightHTTP, IIS. Sendo recomendado a utilizao do apache com o mdulomod_rewrite.PHP 5.2.6 ou superior. O CakePHP tambm tem suporte para verso 4 PHP.Banco de Dados suportados pelo CakePHP:

    MySQL (4 ou superior)PostgreSQLFirebirdMicrosoft SQL ServerOracleSQLiteODBCADOdb

    1.2 - Configurando o Apache

    O servidor web Apache um softwarelivre mantido pela organizao Apache Foundation. O servidor Apache o servidor mais utilizado para hospedar pginas na internet.

    O CakePHP pode ser configurado de diversas maneiras no servidor Apache, este captulo ir apresentar asdiferentes formas de configurao, destacando seus prs e contras.

    O arquivo de configurao do Apache o httpd.conf. Este arquivo encontrado nos sistemas *nix dentro dodiretrio /etc/apache2/. No windows o arquivo ser encontrado dentro do diretrio "conf", geralmentelocalizado no diretrio de instalao do Apache.

    1.2.1 - Configurando o mod_rewrite

    Este mdulo utilizado para criar endereos (URLs) mais amigveis, evitando endereos longos com diversos&. Por exemplo:

    Nota

    O endereo: http://www.dominio.com.br/index.php?nome=teste&data=20081110. Utilizando areescrita de URL poderia ser escrito assim: http://www.dominio.com.br/teste/20081110

    Para habilitar o mdulo rewriteno servidor apache basta descomentar* a seguinte linha:

    #LoadModule rewrite_module modules/mod_rewrite.so

    Observao: O caminho do mdulo pode alterar dependendo da instalao do Apache ou do sistemaoperacional.

    Nota

    *comentrios no arquivo de configurao so as linhas que comeam com #

    1.2.2 - Configurando um endereo por meio de alias

    As configuraes de aliasno apache so utilizadas para gerar endereos como:

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    8 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    12/226

    http://dominio/nome_do_alias

    Para criar um aliasno apache necessrio editar o arquivo httpd.conf inserindo as seguintes linhas:

    Alias /projetos /projetos/cakephp/

    Options Indexes FollowSymLinksAllowOverride AllOrder allow,denyAllow from All

    A primeira linha indica o nome do alias, sendo este nome utilizado no endereo aps o domnio. A seguir inserido o endereo fsico do site.

    As prximas linhas passam algumas configuraes do aliaspara o apache. Sendo importante observar quepara o mdulo rewritefuncionar neste alias necessrio deixar a opo AllowOverridecom o valor All.

    Neste exemplo foi configurado um aliaschamado projetos; isto significa, que ao fazer uma requisio noendereo: http://localhost/projetos, o servidor Apache envia a pgina principal (index) de projetos encontradano diretrio /projetos/cakephp/. Alm disto, este aliasest com a opo de reescrever a url ativada (mdulorewrite + allowOverride All), sendo assim o servidor procura a existncia do arquivo .htaccess no diretriosolicitado e executa as regras escritas nele.

    1.2.3 - Configurando um endereo usando virtual host

    O recurso de hostvirtual utilizado para configurar diversos endereos em uma mesma mquina, com um oumais endereos IPs.

    O uso do virtual hostna mquina de desenvolvimento aconselhvel, pois simula o ambiente de produo epode reduzir problemas com alguma configurao adicional do mod_rewrite.

    Para habilitar e configurar o hostvirtual necessrio seguir os seguintes passos:

    Abrir o arquivo httpd.conf e descomentar a linha:

    #LoadModule vhost_alias_module libexec/apache2/mod_vhost_alias.so

    1.

    No arquivo httpd.conf, descomentar tambm a linha:

    #Include /private/etc/apache2/extra/httpd-vhosts.conf

    2.

    Editar o arquivo extra/httpd-vhosts.conf

    NameVirtualHost *

    ServerName projetos DocumentRoot /projetos/cakephp/ ErrorLog /var/log/apache2/projetos-error_log CustomLog /var/log/apache2/projetos-access_log combined Options Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all

    3.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    9 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    13/226

    ServerName localhost DocumentRoot /projetos/sistemaslegados/ ErrorLog /var/log/apache2/sistemaslegados-error_log CustomLog /var/log/apache2/sistemaslegados-access_log combined

    Options Indexes FollowSymLinks AllowOverride All Order allow,deny Allow from all

    Listagem 1 - Configurao do arquivo httpd-vhosts.conf

    Editar o arquivo hosts:

    Caminho no *nix: /etc/hosts

    Caminho no windows: C:\Windows\system32\drivers\etc\hosts

    127.0.0.1 localhost127.0.0.1 projetos

    Listagem 2 - Configurao do arquivo hosts

    4.

    Reiniciar o servidor Apache5.

    A configurao mostrada acima cria dois hostsvirtuais - localhost e projetos. Ao acessar http://localhost/no browser, o servidor apache ir direcionar para o contedo da pasta: /projetos/sistemaslegados/. Aoacessar http://projetos/, o Apache direciona para o contedo da pasta: /projetos/cakephp/.

    O virtual hostpode ter configurao de logindependente para cada host, sendo que os arquivos responsveisem armazenar a informao do logpodem ser indicados pelos parmetros: ErrorLoge CustomLog

    1.2.4 - Configurando o mod_userdir

    O mdulo de usurio habilita cada usurio do sistema operacional a ter seu prprio site. Ao utilizar estemdulo o endereo do site fica assim: http://dominio/~usuarioDoSistema/

    Para habilitar este mdulo basta descomentar a linha:

    #LoadModule userdir_module libexec/apache2/mod_userdir.so

    Listagem 3 - Configurao do mdulo userdir_moduleno arquivo httpd.conf

    1.2.5 - Comparando as configuraes do Apache

    Os desenvolvedores do CakePHP recomendam o uso do mdulo rewrite. Este mdulo procura sempre umarquivo chamado .htaccesse verifica suas regras.

    No CakePHP existem trs arquivos .htaccessque ficam localizados nos diretrios:

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

    Dependendo da configurao do Apache utilizada necessrio editar estes trs arquivos .htaccess.

    No caso de utilizar a configurao de sua aplicao com uso de alias, deve-se adicionar a seguinte linha emseu .htaccess:

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    10 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    14/226

    RewriteEngine on RewriteBase /NOME_DO_ALIAS/

    #Por exemplo: RewriteBase /projetos/ RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L]

    Listagem 4 - Configurao do .htaccessutilizando alias

    No mdulo userdirtorna-se necessrio editar o arquivo .htaccessna seguinte linha:

    RewriteBase /~NOME_DO_USUARIO/

    Listagem 5 - Configurao do .htaccessutilizando mod_userdir

    A configurao por meio de hostvirtual dispensa a configurao dos arquivos .htaccess, porm seus hostsvirtuais no so acessveis para outros computadores da rede.

    1.3 - Instalando o CakePHP

    O primeiro passo para a instalao do framework fazer o seu downloadno seguinte endereo:

    Na pgina principal do projeto existe um link para a ltima verso estvel:

    http://www.cakephp.com.br

    Aps o downloaddos fontes, necessrio descompactar o arquivo na pasta desejada.

    O servidor web deve ser configurado para o diretrio onde o CakePHP foi extrado. Por exemplo:

    O CakePHP est na pasta: C:\projetos\cakephp\

    Sendo o contedo de C:\projetos\cakephp\as pastas app, cakee vendors.

    O servidor web deve ser configurado para o diretrio: C:\projetos\cakephp\

    Nota

    A verso do framework CakePHP utilizada neste material a verso estvel 1.3.10.

    1.4 - Estrutura de diretrios

    Aps descompactar o arquivo baixado pelo site do CakePHP, a seguinte estrutura encontrada:

    Diretrio Descrio

    /app/ Aqui ficam os arquivos da aplicao que ser desenvolvida.

    /app/config/ Onde ficam os arquivos de configurao.

    O arquivo de configurao de banco de dados (database.php) se encontra aqui.

    /app/controllers As classes da camada de controle devem ser escritas neste diretrio.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    11 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    15/226

    Diretrio Descrio

    /app/libs Contm as bibliotecas primrias que no vieram de terceiros ou empresasexternas. Isto permite que voc separe suas bibliotecas internas das biliotecas defornecedores.

    /app/locale Contm os arquivos com as strings para a internacionalizao.

    /app/models As classes da camada de modelo devem ser escritas neste diretrio.

    /app/views Os arquivos da camada de viso devem ser escritas neste diretrio.

    /cake/ Os arquivos do frameworkficam neste diretrio.

    O desenvolvedor no deve alterar o contedo desta pasta, somente se souber oque est fazendo.

    /app/webroot/ Todas as requisies so direcionadas para este diretrio, que contm o arquivoindex.php (o Dispatcher) que trata quais arquivos so necessrios para atendercada requisio.

    As pastas deste diretrio servem como abrigo para arquivos css, imagens,javascripts e qualquer outro arquivo que precisa estar disponvel para arequisio.

    Tabela 1 - Estrutura de diretrios do CakePHP

    1.5 - Arquivos de configurao do CakePHP

    O CakePHP possui poucos arquivos de configurao, devido sua arquitetura baseada em convenes.

    1.5.1 - O arquivo de configurao ddaattaabbaassee..pphhpp

    Para iniciar o desenvolvimento de uma aplicao, necessrio apenas configurar o banco de dados por meiodo arquivo: diretrio_do_cake/conf/database.php.

    O banco de dados configurado pelo array: $default, que ilustrado abaixo.

    var $default = array( 'driver' => 'mysql',

    'persistent' => false, 'host' => 'localhost', 'login' => 'cakephpuser', 'password' => 'c4k3roxx!', 'database' => 'my_cakephp_project', 'prefix' => '' );

    Listagem 6 - Configurao do arquivo database.php

    Segue abaixo a listagem de configuraes do array de conexo com o banco de dados.

    Chave Descrio

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    12 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    16/226

    Chave Descrio

    driver Define qual driver de banco de dados ser usado na aplicao, sendo possvelescolher as opes:mysql, postgres, sqlite, pear-nomeDoDriver, adodb-nomeDoDriver, mssql, oracle, or odbc.

    persistent Define se a conexo ao banco de dados deve ser feita de forma persistente ouno.

    host O endereo do computador onde o SGBD est instalado.

    login Usurio que possui acesso ao banco de dados.

    password Senha do usurio para acesso ao banco de dados.

    database Nome do banco de dados que ser utilizado.

    prefix Chave opcional que, deve ser configurada caso as tabelas do banco de dadosutilizem algum prefixo.

    port Chave opcional, porta TCP para conexo com o banco de dados.

    encoding Tipo de caracteres que sero utilizados na conexo, por default a maioria dosbancos de dados utilizam UTF-8.

    schema Usado apenas pelo PostgreSQL para definir qual esquema usar.

    Tabela 2 - Chaves disponveis para a configurao com o banco de dados no arquivo database.php

    1.5.2 - O arquivo de configurao ccoorree..pphhpp

    O arquivo core.phppossui as configuraes bsicas do framework. Confira abaixo as suas opes deconfigurao:

    Varivel Descrio

    debug Configura o nvel de mensagens de debug que ser mostrado na tela.

    0= Modo sem nenhuma mensagem, para uso do sistema em produo.1= Mostra mensagens de erros e advertncias.2= Mostra mensagens de erros, advertncias e comandos SQL.3= Mostra mensagens de erros, advertncias, comandos SQL e variveis docontrole.

    App.baseUrl Descomente esta linha caso deseje utilizar o CakePHP sem o mod_rewrite. importante apagar todos os arquivos .htaccessNo IIS pode ser necessrio colocar uma ? concatenada, como demonstrado abaixo:Configure::write('App.baseUrl', env('SCRIPT_NAME')."?");

    Routing.prefixes Descomente a linha para utilizar as rotas administrativas.

    Por default o nome da rota administrativa admin, podendo ser alterada paraqualquer outra palavra.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    13 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    17/226

    Cache.disable Quando definido como true, o cacheser desabilitado para toda a aplicao.

    Cache.check Quando o valor verdadeiro, o recurso de cachena viso habilitado.Para usar cacheainda necessrio configurar as classes de controle.

    Session.save Configura de qual forma as sesses sero armazenadas.

    php= usa o padro do PHP.cake= os dados de sesso so armazenados no diretrio /app/tmpdatabase= os dados sero armazenado em uma tabela do banco de dados, parautilizar este recurso necessrio criar a tabela. O script SQL para criao encontrado em: /app/config/sql/sessions.sql.

    Session.table Nome da tabela que o CakePHP utilizar para gravar informaes da sesso.

    Session.database Nome do banco de dados usado para gravar informaes da sesso.

    Session.cookie Nome do cookieusado para as sesses.

    Session.timeout Tempo de durao de uma sesso (em segundos).Este valor depende da configurao do Security.level.

    Session.start O frameworkinicia uma sesso automaticamente quando este parmetro verdadeiro.

    Session.checkAgent Quando esta configurao falsa o CakePHP no verifica a varivel$_SERVER["HTTP_USER_AGENT"], ou seja no existe uma verificao se a requisioesta sendo feita pelo mesmo agente (mesmo navegador).

    Security.level Nvel de segurana do CakePHP. O valor definido em 'Session.timeout' multiplicado pelo peso do nvel de segurana definido abaixo:

    Valores vlidos:'high' = x 10'medium' = x 100'low' = x 300

    Os valores 'high' e 'medium' tambm habilitam a configurao de sesso do php:

    session.referer_check

    O ID da sesso do CakePHP recriado entre as requisies, quando 'Security.level' 'high'.

    Security.salt Uma string aleatria, usada para a tabela hashde segurana.

    Security.cipherSeed Uma string numrica (somente dgitos) utilizada para criptografar/descriptografarstrings.

    Acl.classname,Acl.database

    Constantes utilizadas pelo recurso de Access Control List(ACL, ou lista de controlede acessos).

    Tabela 3 - Configuraes do frameworkno arquivo core.php

    1.5.3 - O arquivo de configurao bboooottssttrraapp..pphhppEste arquivo de configurao pode ser utilizado para:

    Registrar constantes globaisCriar funes utilitriasDefinir caminhos adicionais para as classes de modelo, classes de controle e pginas da viso

    O arquivo bootstrap.php carregado na inicializao da aplicao.

    Um exemplo prtico de uma funo que pode ser codificada no bootstrap.phpseria a funo abaixo, queimprime o contedo do array passado como parmetro e logo depois executa o die(), que interrompe aexecuo do script. Este um mtodo que pode auxiliar no debugda aplicao.

    /*

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    14 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    18/226

    * Funo para imprimir o contedo passado como parmetro e terminar a execuo doscript*/function prd($message){ die(pr($message));}

    Listagem 7 - Funo que pode ser codificada no arquivo bootstrap.php

    Nota

    A funo pr()no cake um aliaspara a funo print_r()nativa do PHP.

    1.6 - Instalao Avanada do CakePHP

    A instalao avanada do CakePHP consiste em separar o frameworkda aplicao, desta forma possvel teruma nica instalao do CakePHP para diversas aplicaes.

    O primeiro passo mover a pasta do framework: /CAMINHO_DO_CAKE/cakepara o diretrio desejado. Porexemplo: C:\cake\, desta forma a pasta ficaria C:\cake\cake\(arquivos e pastas do framework).

    Nos sistemas *nix recomendado usar a pasta /usr/lib/, logo, deve-se criar o diretrio /usr/lib/cakeemover a pasta cake para o novo diretrio, desta forma ficaria: /usr/lib/cake/cake/(arquivos e pastas doframework)

    Como a pasta do frameworkfoi movida para outro local, o CakePHP precisa ser configurado com o novoendereo. Para isto precisamos editar a seguinte linha do arquivo

    /CAMINHO_DO_CAKE/app/webroot/index.php:

    if (!defined('CAKE_CORE_INCLUDE_PATH')) {define('CAKE_CORE_INCLUDE_PATH', ROOT);

    }

    Listagem 8 - Configurao original do caminho para o frameworkno arquivo/CAMINHO_DO_CAKE/app/webroot/index.php

    Deixando desta forma:

    //WINDOWSif (!defined('CAKE_CORE_INCLUDE_PATH')) {

    define('CAKE_CORE_INCLUDE_PATH', 'C:'.DS.'cake');}/*---------------------------------------------------------------------------------*/

    //*nixif (!defined('CAKE_CORE_INCLUDE_PATH')) {define('CAKE_CORE_INCLUDE_PATH', DS.'usr'.DS.'lib'.DS.'cake');

    }

    Listagem 9 - Configurao alterada do caminho para o frameworkno arquivo/CAMINHO_DO_CAKE/app/webroot/index.php

    Pronto!!! A aplicao est funcionando separada do framework.

    Outra opo seria separar a pasta webrootda sua aplicao. As aplicaes, no ambiente de produo, devemser configuradas desta forma.

    Neste caso necessrio configurar as seguintes linhas do arquivo

    /CAMINHO_DO_CAKE/app/webroot/index.php:

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    15 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    19/226

    //Caminho para sua aplicaoif (!defined('ROOT')) {

    define('ROOT', dirname(dirname(dirname(__FILE__))));}//nome da pasta da sua aplicaoif (!defined('APP_DIR')) {

    define('APP_DIR', basename(dirname(dirname(__FILE__))));}

    Listagem 10 - Configurao original do arquivo /CAMINHO_DO_CAKE/app/webroot/index.php

    Como exemplo real vamos sugerir a seguinte configurao, para um sistema de bookmarks:

    Biblioteca do framework: /usr/lib/cake/A aplicao: /home/usuario/bookmarks/O webroot: /var/www/htdocs/(Este diretrio deve ser o Document Rootda configurao do Apache)

    A configurao necessria seria:

    //Caminho para sua aplicao

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

    }//nome da pasta da sua aplicaoif (!defined('APP_DIR')) {

    define('APP_DIR', 'bookmarks');}//caminho da biblioteca do frameworkif (!defined('CAKE_CORE_INCLUDE_PATH')) {

    define('CAKE_CORE_INCLUDE_PATH', DS."usr".DS."lib".DS."cake");}

    Listagem 11 - Configurao alterada do arquivo /CAMINHO_DO_CAKE/app/webroot/index.php

    2 - Desenvolvendo com o CakePHP

    O CakePHP utiliza o paradigma de desenho de softwareda Conveno ao invs da Configurao (em inglsConvention over Configurationou simplesmente Coding by convention). Este paradigma procura diminuir onmero de decises que os desenvolvedores precisam tomar, ganhando em simplicidade, mas nonecessariamente perdendo flexibilidade.

    2.1 - Convenes no CakePHP

    Apesar de tomar um pouco de tempo para aprender as convenes do CakePHP, voc ganha tempo em umlongo processo: seguindo as convenes, voc ganha funcionalidades gratuitamente e livra-se de madrugadasde manuteno de arquivos de configurao. Convenes tambm fazem com que o sistema fiqueuniformemente desenvolvido, permitindo que outros desenvolvedores o ajudem mais facilmente.

    As convenes no CakePHP tm sido produzidas por anos de experincia em desenvolvimento web e boasprticas. Apesar de sugerimos que voc use essas convenes enquanto desenvolve em CakePHP, devemosmencionar que muitos desses princpios so facilmente sobrescritos - algo que especialmente acontecequando trabalha-se com sistemas legados.

    2.1.1 - Convenes para nome de arquivos e nome de classes

    Na maioria das vezes, o nome dos arquivos utiliza underscores, enquanto o nome das classes utiliza o padroCamelCase, ou seja, a primeira letra de cada palavra em maisculo. A classe LinksUteisController pode ser

    encontrada no arquivo links_uteis_controller.php, por exemplo.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    16 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    20/226

    Em alguns casos o nome da classe e o seu tipo no fazem parte do nome do arquivo. A classeCookieComponent pode ser encontrada no arquivo cookie.phpe a classe SecurityComponent pode serencontrada no arquivo security.php

    2.1.2 - Convenes para a camada de modelo e banco de dados

    Os nomes dos arquivos devem ser singular e separados por um underscorecaso tenha mais de uma palavra.Ex.: usuario.php, saida_produto.php.

    Os nomes das classes de modelo devem ser singular e CamelCased. Ex.: Usuario, SaidaProduto.

    As tabelas de banco de dados devem estar no plural e com underscorecaso tenha mais de uma palavra. Ex.:usuarios, saida_produtos.

    A chave primria deve ter o nome id. Chaves estrangeiras devem ter o nome da tabela relacionada no singulare acrescentar no final _id. Logo se grupos tm usurios, na tabela usuarios deve existir o campo grupo_id.

    Tabelas de ligao, utilizadas em relacionamento de N-M, devem possuir o nome das duas tabelas ligadas noplural separadas por underscoree em ordem alfabtica. Ex.: usuarios HABTM produtos -> produtos_usuarios

    2.1.3 - Convenes para a camada de controle

    Os arquivos da camada de controle devem seguir o padro:

    Os nomes das classes de controle so no plural, CamelCased e sempre terminam em 'Controller'. Ex:UsuariosController, FuncionariosController e TerceirosController so alguns exemplos de controllers.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    17 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    21/226

    Nota

    O primeiro mtodo que voc deve escrever em uma clase de controle o mtodo index().Quando algum requisita um controllersem ao, o comportamento padro renderizar omtodo index()do controller. Por exemplo, a requisio parahttp://www.exemplo.com.br/usuariosmapeia para a chamada do mtodo index()doUsuariosController, assim como http://www.exemplo.com.br/usuarios/viewmapeia para achamada do mtodo view()no UsuariosController.

    Voc tambm pode alterar a visibilidade dos mtodos da classe de controle, para isto, basta colocar umunderscorena frente do nome dos mtodos. Se o mtodo da classe de controle estiver com underscorenafrente, o mtodo no ser disponibilizado para acesso webatravs do Dispatcher, mas estar disponvel parauso interno. Por exemplo:

    Listagem 12 - Exemplo de um mtodo privado

    Apesar da pgina http://www.dominio.com.br/noticias/ultimas/possa ser acessada pelo usurionormalmente, algum que tente acessar a pginahttp://www.dominio.com.br/noticias/_ultimasNoticias/receber um erro porque o mtodo precedido de um underscore.

    Como voc acabou de ver, controllersde uma nica palavra so mapeados facilmente para uma URL simplesem letras minsculas. Por exemplo, a classe UsuariosController (que seria definida em um arquivo de nome

    usuarios_controller.php) acessada a partir da URL http://www.dominio.com.br/usuarios.

    Controllersde com muitas palavras so mapeados para URLs em camelBackedmantendo a forma plural. Porexemplo, UsuariosLegadosController ( usuarios_legados_controller.php) seria mapeado parahttp://www.dominio.com.br/usuariosLegadose SistemasExternosController

    ( sistemas_externos_controller.php) seria mapeado parahttp://www.dominio.com.br/sistemasExternos.

    2.1.4 - Convenes para a camada de viso

    Os arquivos da camada de viso devem ser nomeados depois dos mtodos dos controllers. Os arquivos dacamada de viso devem ser escritos com underscores. O mtodo getReady() da classe PeopleController irprocurar pela viso /app/views/people/get_ready.ctp.

    O modelo bsico /app/views/nome_do_controller/nome_da_funcao_com_underscore.ctp.

    Nomeando os pedaos da aplicao usando as convenes do CakePHP, voc ganha funcionalidades sem luta esem amarras de configurao. Aqui o exemplo final que vincula as associaes:

    Tabela no banco de dados: 'people'Classe do Modelo: 'Person', encontrada em /app/models/person.php

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    18 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    22/226

    Classe do Controlador: 'PeopleController', encontrado em /app/controllers/people_controller.phpTemplate da Viso: encontrado em /app/views/people/index.ctp

    Usando estas convenes, CakePHP sabe que a requisio para http://www.exemplo.com.br/people/ mapeiapara a chamada do mtodo index() do PeopleController, onde o modelo Person automaticamentedisponibilizado (e automaticamente associado tabela 'people' no banco de dados), e renderiza isso para oarquivo. Nenhuma destas relaes foram configuradas por qualquer meio que no seja atravs da criao declasses e arquivos que voc precise criar em algum lugar.

    2.1.5 - Todas as Convenes

    Local Regra Exemplo

    Banco dedados

    Nome das tabelas: plural, minsculo. usuarios, posts, artigos

    Banco dedados

    Chave primria: nome id, tipo int, auto_increment id int(11)

    Banco dedados

    Nome dos campos: minsculo, usando underscore. nome, rua, data_de_nascimento

    Banco dedados

    Chave estrangeira: nome da tabela relacionada no singular,acrescentando underscoree id.

    cliente_id,grupo_id

    Banco dedados

    Relacionamento N-M (HABTM), regra para a tabela deligao: nome das tabelas em ordem alfabtica, separadaspor underscore.

    produto_usuario, grupo_usuario

    Modelo Nome do arquivo: singular e CamelCase usuario.php, grupo.php,cliente.php

    Modelo Nome da classe: singular e CamelCase Usuario, Grupo

    Controle Nome do arquivo: plural, underscorese terminado comController

    usuarios_controller.php,grupos_controller.php

    Controle Nome da classe: plural, CamelCase e terminado com

    Controller

    UsuariosController,

    GruposControllerViso Local do arquivo: dentro da pasta views/nome_do_controle/ views/usuarios/, views/grupos/

    Viso Nome do arquivo: deve ter o nome da ao do controle, comunderscores.

    views/usuarios/index.ctp,views/grupos/add.ctp

    Tabela 4 - Lista de todas as convenes do CakePHP

    2.2 - Constantes

    As constantes listadas abaixo so utilizadas no CakePHP:

    Constante Descrio

    APP Diretrio raiz.

    APP_PATH Diretrio app.

    CACHE Diretrio dos arquivos de cache.

    CAKE Diretrio do cake.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    19 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    23/226

    Constante Descrio

    COMPONENTS Diretrio components.

    CONFIGS Diretrio dos arquivos de configurao.

    CONTROLLER_TESTS Diretrio de testes do controlador.

    CONTROLLERS Diretrio dos controllers.

    CSS Diretrio dos arquivos CSS.

    ELEMENTS Diretrio dos elements.

    HELPER_TESTS Diretrio de testes do helper.

    HELPERS Diretrio helpers.

    IMAGES Diretrio das imagens.

    INFLECTIONS Diretrio inflections (geralmente dentro do diretrio de configurao).

    JS Diretrio dos arquivos JavaScript (no webroot).

    LAYOUTS Diretrio layouts.

    LIB_TESTS Diretrio de testes da biblioteca do CakePHP.

    LIBS Diretrio das bibliotecas do CakePHP.

    LOG_ERROR Constante de Erro. Utilizada para diferenciar erro de log e debug. Atualmente oPHP suporta LOG_DEBUG.

    LOGS Diretrio logs (no app).

    MODEL_TESTS Diretrio de testes do modelo.

    MODELS Diretrio models.

    SCRIPTS Diretrio de scripts do Cake.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    20 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    24/226

    Constante Descrio

    TESTS Diretrio de testes (pai dos diretrios de teste modelos, controles, etc.)

    TMP Diretrio tmp.

    VENDORS Diretrio vendors.

    VIEWS Diretrio views.

    WWW_ROOT Caminho completo para o webroot.

    Tabela 5 - Lista das constantes no CakePHP

    2.3 - A Arquitetura MVC

    A medida que os softwaresforam ficando maiores e mais complexos, tornou-se necessrio organizar ocdigo-fonte de forma a facilitar o seu entendimento.

    Uma soluo criada para este problema foi a diviso da aplicao em 3 camadas com funcionalidades distintas,est soluo denominada arquitetura MVC (Model - View - Controller).

    Basicamente a arquitetura MVC separa o desenvolvimento da aplicao em:

    Camada de Modelo: parte da programao destinada ao tratamento dos dados.Camada de Controle: responsvel pelas regras de negcioCamada de Viso: responsvel pelo o que apresentado para o cliente

    A seguir, apresentado o fluxo de execuo de uma requisio feita ao CakePHP.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    21 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    25/226

    Imagem 1 - Fluxo da execuo de uma requisio no CakePHP

    Os passos da requisio podem ser descritos da seguinte forma:

    O cliente* faz uma requisio ao endereo http://www.exemplo.com.br/clientes/indexO servidor de pgina encaminha a requisio para o Dispatcher.O Dispatcher verifica as regras de rotas.O frameworkexecuta o controllere a ao informados na requisio.Durante a execuo da ao do controllerso feitas requisies a camada de modelo.Ao final da execuo uma view renderizada.

    Nota

    O cliente quem faz a requisio, ele pode ser um browser, um computador, etc.

    2.3.1 - A camada de modelo

    Essa camada responsvel por representar dados. Ela utilizada para fornecer acesso aos dados, que podemestar armazenados em um banco de dados, um arquivo texto, um arquivo CSV, dentre outras possibilidades.De forma mais usual, geralmente um modelo especfico representa uma tabela de um banco de dados.

    Assim como podemos fazer relacionamentos entre tabelas em um banco de dados, um modelo tambm pode

    estabelecer esses relacionamentos entre modelos. Existem quatro tipos de relacionamento entre modelos:hasOne, hasMany, belongsTo ou hasAndBelongsToMany. Esses relacionamentos sero vistos com mais detalhe

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    22 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    26/226

    no tpico 2.3.1.2 - Associando os modelos. Como exemplo prtico de relacionamento entre modelospodemos citar a tabela Marca de Carro que possui relacionamento do tipo HasMany com a tabela Carros.

    Em programao orientada a objeto podemos dizer que um modelo um objeto que representa algo darealidade. Em outras palavras, um modelo pode ser a representao de uma televiso ou uma cama ouqualquer outro objeto. Para se definir um modelo no CakePHP deve se fazer o seguinte:

    Como se pode ver, neste exemplo, a classe Cliente herda da classe AppModel que por sua vez herda da classeModel. A princpio a classe AppModel est vazia. Ela existe para que seja possvel gerar determinadoscomportamentos comuns a todos os modelos.

    2.3.1.1 - Atributos dos modelos

    2.3.1.1.1 - useDbConfig

    A propriedade useDbConfigdefine, atravs de uma string, o nome da conexo com o banco de dados. Porpadro a conexo que o CakePHP usa definida no arquivo app/config/database.php e tem o valor default. necessrio criar o array no arquivo database.phpcom os dados da conexo. Veja o exemplo a seguir:

    Listagem 13 - Cdigo no arquivo app/config/database.php

  • 7/21/2019 Apostila Curso Cakephp 2km

    27/226

    }?>

    Listagem 14 - Cdigo no arquivo do modelo

    Importante

    Se voc estiver utilizando dois ou mais bancos de dados na sua aplicao, certifique-se deutilizar contas de usurios diferentes para cada banco, pois no PHP se voc utiliza a mesmaconta para acessar bancos diferentes no mesmo servidor o PHP ir reutilizar a conexo.

    2.3.1.1.2 - useTable

    Este atributo define o nome da tabela que o modelo utilizar, somente existir a necessidade de atribuir umvalor, caso no esteja sendo utilizada as convenes. Se o modelo no necessitar usar tabela alguma, pode-seutilizar essa propriedade com o valor false.

    Listagem 15 - Exemplo de um model que no utiliza tabela

    Listagem 16 - Exemplo de um model que utiliza tabela

    2.3.1.1.3 - tablePrefix

    Este atributo utilizado para definir o prefixo de alguma tabela. Por padro nenhum prefixo definido.Pode-se tambm definir o prefixo no arquivo app/config/database.php, entretanto se for usadotablePrefix no model, essas definies sobrescrevem as definies definidas no

    app/config/database.php.

    Listagem 17 - Exemplo de uso da tablePrefix:

    2.3.1.1.4 - primaryKey

    Usualmente toda tabela possui o campo id definido como chave primria. Entretanto, existem casos onde atabela pode no possuir um campo id, ou pretende-se usar outro campo como chave primria. Neste casousamos o atributo primaryKey para definir qual campo funcionar dessa forma.

  • 7/21/2019 Apostila Curso Cakephp 2km

    28/226

    }?>

    Listagem 18 - Exemplo de uso da primaryKey:

    2.3.1.1.5 - displayField

    O displayField define qual campo da tabela ser usado como rrulo (label). Esse rtulo usado quando seutiliza sca!olding e find('list'). Por padro a camada de modelo usa os campos name ou title. No se pode usarmais que um valor para displayField. Portanto, no funcionar utilizar var $displayField = array('valor1','valor2').

    Listagem 19 - Exemplo de uso da displayField:

    2.3.1.1.6 - recursive

    Recursive utilizado quando o modelo possui relacionamento com outros modelos. Atravs dessa propriedadepode-se definir at onde o modelo deve trazer os relacionamentos quando existem chamadas para as funesfind e read.

    Como exemplo prtico, imagine uma aplicao onde uma universidade possui diversos cursos, estes pussuemdisciplinas, que tm professores. Logo, Universidade HasMany Curso; Curso HasMany Disciplina; DisciplinaHasMany Artigo. Ao fazer uma busca na entidade Curso ($this->Curso->Find()), a busca pode se comportardas seguintes formas:

    Profundidade Descrio

    -1 Cake procura somente os cursos.

    0 Cake procura por cursos e a universidade ao qual os cursos pertencem.

    1 Cake procura por cursos, universidades e disciplinas associados.

    2 Cake procura por cursos, universidade, disciplinas associados e os professoresassociados aos produtos.

    Tabela 6 - Valores possveis para a varivel recursive

    2.3.1.1.7 - order

    Define qual a ordem que os resultados das pesquisas feitas com find vo retornar. Pode ter o valor ASC, DESC,pode-se tambm ordenar por um campo, ou por um Modelo.campo. possvel ainda utilizar um array commais de um critrio de ordenao.

    var $order = "nome";var $order = "Cliente.nome";var $order = "Cliente.nome asc";var $order = "Cliente.nome ASC";

    var $order = "Cliente.nome DESC";

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    25 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    29/226

    var $order = array("Cliente.nome" => "asc", "Cliente.email" => "DESC")

    Listagem 20 - Exemplos de uso de order

    2.3.1.1.8 - data

    Neste atributo armazenado todos os dados retornados em uma pesquisa. Esses dados so armazenados emforma de arrays multidimensionais, que possuem os nomes dos campos como ndices dos arrays.

    2.3.1.1.9 - _schema

    Este atributo armazena informaes dos campos das tabelas do banco de dados. Cada campo armazena o seunome, o tipo de dado que ele armazena (boolean, string, datetime, dentre outros), se permite valor null, ovalor padro que o campo recebe e o tamanho.

    pr($this->Model->schema());//retornavar $_schema = array(

    'Nome' => array('type' => 'string', 'length' => 30),'Email' => array('type' => 'string', 'length' => 30),'Tel' => array('type' => 'int', 'length' => 10),'Comentrio' => array('type' => 'text')

    );

    Listagem 21 - Exemplos de uso de _schema:

    2.3.1.1.10 - validate

    Atravs deste atributo possvel ao modelo fazer validaes antes de armazenar os dados no banco de dadosou onde estes dados forem armazenados.

  • 7/21/2019 Apostila Curso Cakephp 2km

    30/226

    Chave Descrio

    Rule Regra de validao do campo

    Required O campo precisa ter dados

    allowEmpty O campo aceita valor vazio

    on Define em qual lugar a validao deve ser feita. 'on'=>'create' ou 'on'=>'update'

    message Define a mensagem que ser apresentada, caso o campo no passe na validao

    Tabela 7 - Parmetros do validate

    Regras padres de validao do CakePHP

    Regra Validao

    alphaNumericPara o campo ser vlido ele deve conter apenas caracteres alfanumricos.

    array('login' => array('rule' => 'alphaNumeric'));

    betweenO campo pode ter qualquer caracter, mas o tamanho do contedo do campo estar entre afaixa determinada.

    array('senha' => array('rule' => array('between',6,8)));

    blankO campo deve estar em branco.

    array('id' => array('rule' => 'blank', 'on'=>'create'));

    booleanO campo deve ser um boleano vlido.

    array('flag' => array('rule' => 'boolean'));

    ccO campo deve ser um carto de crdito.

    array('cartao' => array('rule' => array('cc',array('visa','maestro'))));

    comparison

    Compara um valor inteiro, a comparao pode ser maior que (>), menor que (=), menor ou igual( array('rule' => array('comparison','>',20)));

    dateO campo precisa ser uma data vlida.

    array('data_inicio' => array('rule' => 'date'));

    decimalO campo precisa ser um nmero decimal.

    array('preco' => array('rule' => array('decimal',2)));

    emailO campo precisa ser um email.

    array('email' => array('rule' => 'email'));

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    27 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    31/226

    Regra Validao

    equalToO campo precisa ser igual ao valor informado.

    array('nome' => array('rule' => array('equalTo','jos')));

    extension O arquivo precisa ser da extenso especificada.array('arquivo' => array('rule' => array('extension',array('jpg','gif'))));

    fileO campo precisa ser um arquivo (upload).

    array('documento' => array('rule' => 'file'));

    ipO campo precisa ser um ip (verso 4).

    array('client_ip' => array('rule' => 'ip'));

    isUniqueO campo deve ser nico no banco de dados.

    array('flag' => array('rule' => 'isUnique'));

    minLengthO campo precisa ter o tamanho mnimo informado.

    array('senha' => array('rule' => array('minLength',8)));

    maxLengthO campo precisa ter o tamanho mximo informado.

    array('nome' => array('rule' => array('maxLength',32)));

    moneyO campo precisa ser um valor financeiro.

    array('valor_da_compra' => array('rule' => 'money'));

    Multiple

    Verifica campos select multiple.

    array('tags' => array('rule' => array('multiple', array('in'=>array('teste', outro teste),'min'=>1, 'max'=>3))));

    inListO campo precisa estar na lista informada.

    array('grupos' => array('rule' => array('inList', array('Admin','Usuario'))));

    numericO campo precisa ser um nmero vlido.

    array('valor' => array('rule' => 'numeric'));

    notEmptyO campo no pode ser vazio.

    array('texto' => array('rule' => 'notEmpty'));

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    28 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    32/226

    Regra Validao

    phone

    O campo precisa ser um nmero de telefone vlido. Para telefones fora do padro americano possvel informar uma expresso regular no segundo parmetro.

    array('telefone' => array('rule' => array('phone',null,'us')));

    postal

    O campo precisa ser um cep vlida. Para ceps fora do padro americano possvel informaruma expresso regular no segundo parmetro.

    array('cep' => array('rule' => array('postal',null,'us')));

    rangeO campo precisa ser um valor entre os dois valores informados.

    array('numero' => array('rule' => array('range',0,10)));

    ssn

    O campo precisa ser um nmero do seguro social. Para nmeros fora do padro americano possvel informar uma expresso regular no segundo parmetro.

    array('flag' => array('rule' => array('ssn',null,'us')));

    urlO campo precisa ser uma url vlida.

    array('flag' => array('rule' => 'url'));

    Tabela 8 - Regras padres de validao do CakePHP

    2.3.1.1.10.1 - Validao Avanada

    Usando uma regra customizada.

    var $validate = array('login' => array(

    'rule' => array('custom', '/^[a-z0-9]{3,}$/i'),'message' => 'Somente letras e nmeros so aceitos, mnimo de 3

    caracteres')

    );

    Listagem 23 - Exemplo de uma regra customizada utilizando expresso regular

    var $validate = array(

    'codigoPromocional' => array('rule' => array('limiteDeUso', 250),'message' => 'Cdigo informado foi usado mais vezes do que o

    permitido.')

    );function limiteDeUso($data, $limite){

    $contador = $this->find('count', array('conditions' => $data, 'recursive' =>-1));

    return $contador < $limite;}

    Listagem 24 - Exemplo de uma regra customizada utilizando uma funo prpria

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    29 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    33/226

    var $validate = array('login' => array(

    'alphanumeric' => array('rule' => 'alphaNumeric','message' => 'Somente alfanumricos so aceitos'

    ),'between' => array(

    'rule' => array('between', 4,8),'message' => 'O campo deve possuir entre 4 e 8 caracteres'

    ),'isUnique' => array(

    'rule' => array('isUnique'),'message' => 'O login j existe em nossa base de dados'

    ),)

    );

    Listagem 25 - Usando mais de uma validao no mesmo campo

    2.3.1.1.11 - name

    Este atributo permite que o cdigo do CakePHP na camada de modelo seja compatvel com o php4. Portanto, recomendvel sempre utilizar esta declarao j que pode ocorrer da aplicao ter que mudar para umservidor que utiliza o php nessa verso.

    Listagem 26 - Exemplo de uso de name:

    2.3.1.1.12 - cacheQueries

    Se atribudo true para essa propriedade, os dados retornados pelo model so armazenados em cache. Essesdados ficam em cache durante a requisio.

    2.3.1.2 - Associando os modelos

    2.3.1.2.1 - hasOne

    Esse tipo de relacionamento usado quando uma tabela pode possuir apenas um resultado relacionado em

    outra tabela. Por exemplo, em uma aplicao de comunidade virtual onde se tem uma tabela de Usurio eoutra de Perfil do Usurio. Cada usurio pode ter apenas um perfil. Neste caso o relacionamento entre a tabelaUsurio e Perfil de Usurio do tipo hasOne.

    Para que esse relacionamento funcione corretamente, deve-se definir uma chave estrangeira na tabela Perfil deUsurio. Por conveno do CakePHP a chave estrangeira, neste exemplo, deveria se chamar usuario_id.

    Depois de estruturado corretamente o banco de dados, deve-se definir o tipo de relacionamento no modeloUsurio, que dever ser salvo no arquivo app/models/usuario.php.

  • 7/21/2019 Apostila Curso Cakephp 2km

    34/226

    ?>

    Listagem 27 - Exemplo de uso do hasOne

    O exemplo acima a forma mais simples de se estabelecer o relacionamento do tipo hasOne. Existem casosonde necessrio ter mais controle sobre o relacionamento estabelecido. Veja o exemplo seguinte:

    Listagem 28 - Exemplo de uso avanado do hasOne

    O array das associaes do tipo hasOne podem conter as seguintes chaves:

    Chave Descrio

    classNameO nome da classe utilizada pelo modelo relacionado. Se o relacionamento como modelo Perfil, o nome de className dever ser Perfil.

    foreignKey O nome da chave estrangeira contida no modelo relacionado. Se a chaveestrangeira na tabela Perfil usuario_id, ento este dever ser o nome contidoem foreignKey.

    conditionsEm conditions pode-se introduzir fragmentos da query para filtrar os dados nomodelo relacionado. bom utilizar o nome do modelo antes do nome do campo.Exemplo: 'Perfil.publicado = 1'

    fieldsPode-se definir quais campos da tabela sero recuperadas. Por padro todos oscampos so recuperados.

    dependent

    Se dependentcontiver o valor truee for chamado o mtodo delete()com oparmetro cascade, ento todos os dados relacionados sero apagados.Exemplo: Se for apagar um usurio dessa forma, o seu respectivo perfil serapagado tambm.

    Tabela 9 - Chaves da associao hasOne

    2.3.1.2.2 - hasMany

    Seguindo nosso exemplo, o Usurio de nossa comunidade virtual pode ter diversos artigos. Portanto a tabelaUsurio estabelece um relacionamento do tipo hasMany com a tabela Artigos.

    Neste caso a chave estrangeira dever se encontrar na tabela Artigos. Seguindo o padro do CakePHP o nomeda chave estrangeira dever ser Artigo.usuario_id.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    31 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    35/226

    Listagem 29 - Exemplo de uso de hasMany

    Listagem 30 - Exemplo avanado de uso de hasMany

    O array das associaes do tipo hasMany podem conter as seguintes chaves:

    Chave Descrio

    className O nome da classe que est associada ao modelo atual. Se Usurio possui muitosArtigos, o nome de className dever ser Artigo.

    foreignKey O nome da chave estrangeira contida no modelo relacionado. Se a chaveestrangeira na tabela Artigo usuario_id, ento este dever ser o nome contidoem foreignKey.

    conditions Em conditions pode-se introduzir fragmentos da query para filtrar os dados nomodelo. bom utilizar o nome do modelo antes do nome do campo. Exemplo:'Artigo.publicado = 1'

    fields Pode-se definir quais campos da tabela sero recuperadas. Por padro todos oscampos so recuperados.

    order Fragemento de cdigo que permite definir o tipo de ordenao dos resultados.

    limit O nmero mximo de resultados retornados.

    o!set O nmero de linhas associadas que devem ser excluidas do resultado.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    32 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    36/226

    Chave Descrio

    dependent Se for associado o valor true possibilita apagar os resultados em cascata. Ouseja, as linhas gravadas em outras tabelas que possuem relacionamento com atabela deste modelo tambm sero apagadas.

    exclusive Se for associado o valor true ao apagar o registro ir ser invocado o mtododeleteAll(). Existe ganho de performance, mas em certas ocasies no a formaideal a ser utilizada.

    finderQuery Pode-se fazer uma query inteira usando esta chave. Utilizado quando necessrio obter resultados muito especficos.

    Tabela 10 - Chaves da associao hasMany

    2.3.1.2.3 - belongsTo

    Depois de estabelecido o relacionamento do tipo HasOne ou HasMany podemos estabelecer o relacionamentobelongsTo na tabela relacionada. Esse passo pode ser importante se pretendemos recuperar dados a partir dosregistros da tabela que relacionada tabela que estabeleceu o hasOne ou HasMany. Seguindo o exemploexposto em hasOne, a tabela Perfil do Usurio pertence a tabela Usurio. Ou seja, um perfil inscrito na tabelaPerfil do Usurio pertence a um usurio pertencente tabela Usurio.

    No banco de dados deve-se seguir a mesma conveno usada no hasOne e hasMany. Ou seja, a chaveestrangeira dever estar na tabela que ir estabelecer o relacionamento belongsTo.

    Listagem 31 - Exemplo de uso de belongsTo

    Listagem 32 - Exemplo avanado de uso de belongsTo

    O array das associaes do tipo belongsTo podem conter as seguintes chaves:

    Chave Descrio

    className O nome da classe que est associada ao modelo atual. Se Perfil pertence classeUsurio, o nome de className dever ser Usurio.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    33 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    37/226

    Chave Descrio

    foreignKey O nome da chave estrangeira contida no modelo atual. Se a chave estrangeira natabela Perfil usuario_id, ento este dever ser o nome contido em foreignKey.

    conditions Em conditions pode-se introduzir fragmentos da query para filtrar os dados no

    modelo. bom utilizar o nome do modelo antes do nome do campo. Exemplo:'Perfil.publicado = 1'

    fields Pode-se definir quais campos da tabela sero recuperadas. Por padro todos oscampos so recuperados.

    counterCache Se estiver associado o valor true ir aumentar ou diminuir o valor em[singular_model_name]_countquando se for salvar ou apagar um registro. Ovalor desse campo representa o nmero de registros relacionados. Se umUsurio possui 10 amigos, ento Usuario.amigo_count = 10.

    Tabela 11 - Chaves da associao belongsTo

    2.3.1.2.4 - hasAndBelongsToMany (HABTM)

    Quando um modelo pode ter diversos resultados associados de outro modelo e vice-versa necessrio utilizaro relacionamento do tipo hasAndBelongsToMany. Neste caso, ser necessrio criar uma tabela intermediriana estrutura do banco de dados. O nome dessa nova tabela dever conter o nome das duas tabelasrelacionadas em ordem alfabtica e separadas por underscore(_). Dever existir dois campos nessa tabela dotipo inteiro. Esses campos devero ser as chaves estrangeiras das duas tabelas. recomendvel adicionartambm um campo id para esta tabela, assim mantm-se o padro nesta tabela igual o padro de todas.

    O nome das chaves estrangeiras deve seguir o padro do CakePHP. Em nosso exemplo, um usurio podepertencer em diversas comunidades. E, ao mesmo tempo, uma comunidade pode possuir diversos usurios.

    Ento o nome da nossa tabela seria comunidades_usuarios e o nome dos campos na tabela intermediria seriarespectivamente id, comunidade_id e usuario_id.

    Depois de criado toda a estrutura de banco de dados, passamos para o cdigo no modelo.

  • 7/21/2019 Apostila Curso Cakephp 2km

    38/226

    );}?>

    Listagem 33 - Exemplo de hasAndBelongsToMany

    O array das associaes do tipo hasAndBelongsToMany podem conter as seguintes chaves:

    Chave Descrio

    className O nome da classe que est associada ao modelo atual. Se Comunidade estrelacionada classe Usurio, o nome de className dever ser Usurio.

    joinTable O nome da tabela intermediria que possui as chaves estrangeiras.

    with O nome do modelo utilizado para fazer a juno entre os modelos. Por padro oCakePHP j cria este modelo automaticamente. Neste caso, o nome seriaComunidadeUsuario. Caso se deseja utilizar outro modelo para desempenhareste papel, pode-se colocar nesta chave o nome deste modelo.

    foreignKey O nome da chave estrangeira contida no modelo atual. Torna-se til quando sepretende estabelecer mais de um relacionamento HABTM no mesmo modelo.

    associationforeignKey O nome da chave estrangeira contida no modelo relacionado. Torna-se tilquando se pretende estabelecer mais de um relacionamento HABTM no mesmomodelo.

    unique Se associado o valor truea essa chave o CakePHP ir apagar os

    relacionamentos entre os dados antes de inserir novamente em uma chamada deupdate.

    conditions Em conditions pode-se introduzir fragmentos da query para filtrar os dados nomodelo. bom utilizar o nome do modelo antes do nome do campo. Exemplo:'Comunidade.ativa = 1'

    fields Pode-se definir quais campos da tabela sero recuperadas. Por padro todos oscampos so recuperados.

    order Fragemento de cdigo que permite definir o tipo de ordenao dos resultados.

    limit O nmero mximo de resultados retornados.

    o!set O nmero de linhas associadas que devem ser excluidas do resultado.

    finderQuery,deleteQuery, insertQuery

    Pode-se fazer uma query inteira usando esta chave. Essa query pode ser debusca, deleo ou insero. Utilizado quando necessrio obter resultadosmuito especficos.

    Tabela 12 - Chaves da associao hasAndBelongsToMany

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    35 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    39/226

    2.3.1.3 - Recuperando dados

    2.3.1.3.1 - find

    find($type, $params)

    $type - pode receber os valores 'all', 'first', 'list', 'neighbors', 'count' ou 'threaded'. O valor padro utilizado o'first'.

    $params - trata-se de um array que pode possuir os seguintes parmetros:

    Listagem 34 - Parmetros do array $params

    Se estiver sendo usado $type do tipo list, o campo $key no array $params ir definir o ndice e o valor.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    36 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    40/226

    Listagem 35 - Exemplos do $typelist

    2.3.1.3.2 - findBy

    findBy(string $value)

    Atravs deste mtodo possvel procurar por certo campo da tabela. Para isso basta adicionar o nome do

    campo no formato CamelCaselogo aps o findBy. O parmetro $value deve ser uma stringcom o critrio dabusca.

    2.3.1.3.3 - findAllBy

    findAllBy(string $value)

    Atravs deste mtodo possvel procurar por certo campo da tabela. Para isso basta adicionar o nome do

    campo no formato CamelCaselogo aps o findAllBy. O parmetro $value deve ser uma stringcom o critrio dabusca.

    2.3.1.3.4 - query

    Atravs desse mtodo do Modelo possvel fazer requisies ao banco de dados de forma customizada. Nestecaso recomendvel utilizar a biblioteca Sanitize para prevenir ataques do tipo injection e cross-site scripting.

    2.3.1.3.5 - field

    field(string $name, array $conditions = null, string $order = null)

    Esse mtodo retorna um nico resultado do campo especificada pelo parmetro $name. Se for passado algumacondio em conditionsser retornado o primeiro resultado filtrado pela condio. Pode-se utilizar $orderpara definir o tipo de ordenao do resultado. Se for setado o id no modelo, retornado o resultado do idescolhido. Se nenhum resultado seja trazido, esse mtodo retorna false.

    2.3.1.3.6 - Construindo condies complexas

    Existem casos onde ser necessrio recuperar dados com condies mais complexas. Muitas vezes o uso de

    arrayspode ajudar a simplificar e facilitar a manipulao dos dados.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    37 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    41/226

  • 7/21/2019 Apostila Curso Cakephp 2km

    42/226

    //Condio BETWEEN$condicoes = array('Comentario.id BETWEEN ? AND ?' => array(23,54));$this->Comentario->find('all', array('conditions'=> $condicoes));

    //Usando GROUP BY$condicoes = array('fields' => array('Produto.tipo','MIN(Produto.preco) as preco'),'group' => 'Produto.tipo');

    $this->Produto->find('all', $condicoes);

    //Condio complexa$condicoes = array(

    'OR' => array(array('Categoria.nome' => 'Eletrodomsticos'),array('Categoria.nome' => 'Informtica')

    ),'AND' => array(

    array('OR'=>array(array('Categoria.ativa' => 'true')),'NOT'=>array(array('Categirua.ativa'=> 'inativa'))

    ))

    );$this->Categoria->find('all', array('conditions'=> $condicoes));

    ?>

    2.3.1.4 - Salvando dados

    2.3.1.4.1 - save

    save(array $data = null, boolean $validate = true, array $fieldList = array())

    $data: array contendo os dados a serem salvos, tendo como ndice os nomes dos campos onde estes dadosdevero ser salvos.

    $boolean: se for atribuido o valor true, o mtodo save ir validar os dados antes de salv-lo. As regras devalidao podem ser montadas no array $validate no prprio Modelo.

    $fieldList: os campos onde os dados devero ser salvos.

    Este mtodo possui uma sintaxe alternativa:

    save(array $data = null, array $params = array())

    No parmetro $params possvel passar as seguintes opes:

    validate: true ou falsefieldList: array com o nome dos campos onde os dados sero salvoscallbacks: true, false, after ou before

    Depois que os dados foram salvos, pode-se acessar o valor do id pode ser recuperado no atributo $id doobjeto do modelo.

    2.3.1.4.2 - saveAll

    saveAll(array $data = null, array $options = array())

    Esse mtodo pode ser utilizado para salvar dados de um modelo ou, alm de salvar os dados do modelo,

    gravar os dados nos seus modelos relacionados.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    39 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    43/226

    No parmetro $optionspode ser usado os seguintes opes:

    Chave Descrio

    validate

    Se atribuido falseno ocorre validao. Se atribudo true, cada registro validado antes de serem salvos. Se atribudo firsttodos os dados so validadosantes de ser salvo. Se for atribudo onlyos dados so apenas validados e no

    salvos.

    atomicSe for atribudo trueo CakePHP ir tentar salvar todos os registros em umatransao nica. Se o banco de dados no der suporte a transao nica, deverser usado false. O valor padro true.

    fieldList array com o nome dos campos onde os dados sero salvos

    Tabela 13 - Chaves do parmetro $options

    2.3.1.4.3 - create

    create(array $data = array())

    Esse mtodo utilizado para gravar um novo registro. Se, ao pedir para criar um novo registro com essemtodo, o modelo estiver com o parmetro $data populado com dados, ento estes sero utilizados para criaro novo registro.

    2.3.1.4.4 - saveField

    saveField(string $fieldName, string $fieldValue, $validate = false)

    Esse mtodo do modelo utilizado para salvar uma linha em um nico campo do banco de dados. Para utilizar

    esse mtodo necessrio antes atribuir o ID ao modelo. O parmetro fieldName deve conter apenas o nomedo campo do banco de dados. Veja a seguir um exemplo de uso de saveField:

    Listagem 36 - Exemplo de uso do mtodo saveField()

    2.3.1.4.5 - updateAll

    updateAll(array $fields, array $conditions)

    Atualiza diversos registros em uma s operao. Os registros a serem atualizados devero ser identicados noparmetro $conditionse os seus valores no parmetro $fields.

    Listagem 37 - Exemplo de uso do mtodo updateAll()

    2.3.1.4.6 - counterCache

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    40 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    44/226

    Este mtodo ajuda a ter um contador dos registros de modelos relacionados ao modelo atual. O nome docampo ser o nome do modelo seguido de underscore(_) seguido de count. Por exemplo, se voc possui umatabela chamada BlogComentarios e outra chamada Blog. Neste caso, deveria-se criar um campo na tabela Blogdeveria ser criado um campo do tipo inteiro com o nome blog_comentario_count. Uma vez que o campo tenhasido inserido na tabela ento pode-se utilizar o counterCacheno array $belongsTo e atribuir o valor true. Vejao exemplo a seguir:

    Listagem 38 - Exemplo de uso do atributo counterCache

    2.3.1.5 - Apagando dados

    2.3.1.5.1 - del

    delete(int $id = null, boolean $cascade = true);

    Apaga o registro identificado pelo parmetro $id. Por padro apaga os registros relacionados a ele. Se umacategoria de produto for apagada, por padro o CakePHP ir apagar todos os produtos relacionados essacategoria.

    2.3.1.5.2 - deleteAll

    deleteAll(mixed $conditions, $cascade = true, $callbacks = false)

    Funciona igual a del e remove. A nica diferena que pode-se estabelecer condies, no formato defragmentos de uma query, no parmetro $conditions.

    2.3.1.6 - Callbacks

    2.3.1.6.1 - beforeFind

    beforeFind(mixed $queryData)

    Esse callback chamado antes que alguma operao de find seja chamada. O parmetro $queryDatacontminformaes sobre a queryatual (condies, campos, etc.). Se este mtodo retornar falsea operao de buscano ir ocorrer.

    2.3.1.6.2 - afterFind

    afterFind(array $results, bool $primary)

    Esse callback utilizado para introduzir lgica aps uma operao de find. importante para tratar dadoscomo alterar datas ou valores retornados pela busca. Os resultados da busca podem ser acessados atravs doparmetro $results. Este mtodof dever retornar o resultado da busca com os valores alterados.

    Se o parmetro $primaryfor false o resultado da busca vai ser armazenado no array results de formadiferente. Veja a diferena a seguir:

  • 7/21/2019 Apostila Curso Cakephp 2km

    45/226

    0 => array('NomeDoModelo' => array(

    'campo1' => 'valor1','campo2' => 'valor2'

    ))

    );

    // Resultados retornados com o parmetro $primary = false$results = array(

    'campo_1' => 'valor1','campo_2' => 'valor2'

    );?>

    Listagem 39 - Exemplo de uso do parmetro $primary

    2.3.1.6.3 - beforeValidate

    beforeValidate()

    Esse callback utilizado para alterar alguma validao ou inserir lgica antes da validao ocorrer. Se essecallbackretornar falsea validao no ir ocorrer.

    2.3.1.6.4 - beforeSave

    beforeSave()

    Esse callback utilizado para inserir lgica antes do dados serem salvos e logo aps os dados seremvalidados. importante para alterar algum formato de data que precise ser armazenado de forma diferente nobanco de dados. Veja o exemplo a seguir:

    Listagem 40 - Exemplo de uso do mtodo beforeSave()

    2.3.1.6.5 - afterSave

    afterSave(boolean $created)

    Callbackutilizado para inserir lgica depois que um registro foi salvo. O parmetro $createdir ser truese umnovo registro foi criado, ser false se tiver ocorrido uma operao de atualizao.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    42 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    46/226

    2.3.1.6.6 - beforeDelete

    beforeDelete()

    Se for necessrio inserir alguma lgica antes de apagar um registro, esta deve ser posta neste callback. Eladever retornar o valor truese pretende-se que a deleo ocorra e falseem caso contrrio.

    2.3.1.6.7 - afterDelete

    afterDelete()

    Se for necessrio inserir qualquer lgica depois de apagar um registro, esta lgica deve ser inserida nessecallback.

    2.3.1.6.8 - onError

    onError()

    Se algum erro ocorrer esse callback chamado.

    2.3.2 - A camada de controle

    A camada de controle usada para gerenciar a lgica da sua aplicao. Na maioria das vezes um controle irgerenciar a lgica de um modelo. O nome dos controles devero ser compostos pelo nome do modelo noplural seguidos de underscore(_) e a palavra "controller". Os arquivos de controle devem ser salvos dentro dodiretrio app/controllers/.

    Todo controle herda da classe appControllerque por sua vez herda da classe Controller. A classeappControllerencontra-se no arquivo app/app_controller.php. Os mtodos criados nesta classe ficamdisponveis para todos os controles da aplicao. A classe Controller, por sua vez, uma biblioteca padro doCakePHP.

    Cada mtodo de um controller tido como uma ao. As aes so usadas para gerar as telas na camada deViso. O usurio final escreve na url o seguinte caminho: nomeDoModelo/Ao/Parmetro1/Parmetro2...

    Assim o dispatcherdo CakePHP pega essa url e traduz em utilizar o mtodo do controle, passando osdeterminados parmetros.

    Listagem 41 - Exemplo de um arquivo de controle

    2.3.2.1 - Atributos da camada de Controle

    2.3.2.2.1 - name

    Este parmetro deve se usado para garantir que a aplicao seja compatvel com php verso 4. O valor de

    $namedeve ser igual ao nome do controle.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    43 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    47/226

    Listagem 42 - Exemplo de declarao de name

    2.3.2.2.2 - components

    Esse atributo utilizado quando se precisa usar um componente no controle. Os componentes so bibliotecasdo CakePHP que trazem funcionalidades camada de controle.

    2.3.2.2.3 - helpers

    Esse atributo utilizado quando se precisa usar um helper no controle. Geralmente helpers so bibliotecas doCakePHP que trazem funcionalidades na camada de viso. Embora sua importncia resida na camada de viso,eles devem ser importados na camada de controle.

    2.3.2.2.4 - uses

    As vezes existe a necessidade de se usar outros modelos que no aquele relacionado com o controller. Nestescasos, necessrio utilizar esse atributo para selecionar um ou mais modelos diferentes.

    2.3.2.2.5 - layout

    Esse atributo utilizado para selecionar qual view(tela de apresentao gerada na camada de viso) serutilizada. Neste caso, o CakePHP ir procurar no diretrio /app/views/layoutspelo arquivo atribudo a esseatributo. O nome que deve ser atribuido a layoutdever ser o nome do arquivo menos a sua extenso, no caso

    .ctp. Caso no seja utilizado esse atributo, o CakePHP ir procurar por /app/views/layouts/default.ctp.

    2.3.2.2.6 - params

    $this->params

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    44 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    48/226

    Esse atributo fornece acesso aos parametros da requisio atual. muito utilizado para obter informaessobre informaes que foram enviadas atravs dos mtodos POSTou GET.

    Parmetro Descrio

    form Qualquer dado postado via mtodo POST em qualquer formulrio armazenadoaqui. Inclui dados encontrados tambm em $_FILES.

    admin Se contiver o valor 1 a ao atual foi feita atravs da rota admin.

    bare Armazena o valor 1 se o layout estiver vazio, caso contrrio guarda o valor 0.

    isAjax Se a requisio atual do tipo Ajax, armazenado o valor 1. Caso contrrio armazenado o valor 0. Essa varivel s utilizada quando o componenteRequestHandler utilizado no controller.

    controller Armazena o nome do controller utilizado pela requisio atual.

    action Armazena o nome da ao utilizada pela requisio atual.

    pass Armazena a string com as variveis passadas via GET.

    url Armazena a url atual que est sendo utilizada. composto de um array, onde aurl fica armazenada na chave 'url' e as variveis enviadas via GET ficamarmazenadas nas chaves 'var1', 'var2', e assim por diante.

    data Utilizado para manipular os dados enviados via POST pelo formulrio deFormHelper.

    prefix Armazena o valor do prefixo utilizado na rota. Um exemplo de prefixo o'admin'.

    named Armazena qualquer parmetro enviado na url no formato chave:valor. Essesdados so armazendos em um array, podendo ser enviados diversos parmetros.

    Tabela 14 - Chaves do atributo $params

    2.3.2.2.7 - data

    $this->data

    Armazena os dados enviadas da camada de viso para a camada de controle atravs do FormHelper.

  • 7/21/2019 Apostila Curso Cakephp 2km

    49/226

    }}

    }?>

    2.3.2.2 - Mtodos da camada de Controle

    2.3.2.2.1 - set

    set(string $var, mixed $value)

    Atravs desse mtodo possvel enviar dados para a camada de viso. Tambm possvel passar um arraycomo parmetro. Por exemplo: $this->set($nomes).

    Importante

    Para alterar o ttulo da pgina na viso, voc deve definir o valor da varivel title_for_layout:

    $this->set('title_for_layout', 'Ttulo da pgina');

    2.3.2.2.2 - render

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

    Esse mtodo sempre chamado no fim de todo mtodo de um controle. Atravs dele definido qual arquivode viso ser embutido dentro do layout. Se renderno utilizado explicitamene no mtdo do controle, entoo controle ir procurar por uma tela com mesmo nome da ao do controle. Por exemplo, no mtodo list docontrole usuario o render por padro iria procurar pelo arquivo /app/views/usuario/list.ctp.

    possvel especificar outra viso atravs de $action.

    Se $this->autoRenderestiver atribudo com o valor false, no fim do controle no ir ser executado essemtodo. Se pretende-se ler um elemento, deve-se escrever o seguinte cdigo: $this->render('/elements/ajax'), que ir procurar pelo arquivo app/views/elements/ajax.ctp.

    2.3.2.2.3 - redirect

    redirect(string $url, integer $status, boolean $exit)

    Utilizado para redirecionar o usurio para outra view. O parmetro $urldeve conter um caminho relativo nopadro de url do CakePHP. O parmetro $statuspermite definir o estado da requisio HTTP. Pode-se, porexemplo, atribuir o valor 404, que corresponde a erro na busca do arquivo. Se for atribudo o valor falseaoparmetro exit, o mtodo no vai executar a funo exit()aps executada.

  • 7/21/2019 Apostila Curso Cakephp 2km

    50/226

    }?>

    2.3.2.2.4 - flash

    flash(string $message, string $url, integer $pause)

    O mtodo flash similar ao redirect. A nica diferena a possibilidade de mostrar uma mensagem ao usurioantes dele ser redirecionado pgina. No parmetro $messagedeve-se atribuir a mensagem que deseja-semostrar ao usurio antes que este seja redirecionado para a urldefinida no parmetro $url. No parmetro$pausedefine-se o tempo (em segundos) de exposio da mensagem.

    2.3.2.2.5 - referer

    Retorna a url que foi utilizada para chegar requisio atual. Veja o exemplo a seguir:

    2.3.2.2.6 - disableCache

    Utilizado para determinar ao browserdo usurio no fazer cache.

    2.3.2.2.7 - postConditions

    postConditions(array $data, mixed $op, string $bool, boolean $exclusive)

    Transforma os dados postados em critrios de busca para o modelo. Pode-se utilizar o FormHelperpara geraro formulrio que ir fornecer os dados. Veja o exemplo a seguir:

  • 7/21/2019 Apostila Curso Cakephp 2km

    51/226

    $dados=$this->Canal->find('all',$this->postConditions($this->data));$this->set('canal', $dados);

    }}

    }?>

    2.3.2.2.8 - paginate

    Esse mtodo utilizado para gerar paginao dos resultados. Pode-se utilizar as chaves conditions, fields,order, limit. Da mesma forma como se faz no mtodo find.

    2.3.2.2.9 - requestAction

    requestAction(string $url, array $options)

    Esse mtodo utilizado para acessar uma ao de qualquer controle e retornar dados dessa ao. No

    parmetro urldeve-se fornecer um caminho no padro do cake: nomeDoControle/nomeDaAo/parmetros.O parmetro $options utilizado para passar dados extras ao controle. Se nesse parmetro for passado ovalor returno resultado ser a renderizao da viso relacionada ao controle procurado pela $url.

    2.3.2.3 - Callbacks

    2.3.2.3.1 - beforeFilter

    Esta funo executada antes de qualquer ao do controller. importante utiliz-la para inspecionar aexistncia de alguma varivel de sesso ou verificar se o usurio possui permisses de acesso.

    2.3.2.3.2 - beforeRender

    Esta funo executada depois da ao do controllere antes da viso ser renderizada.

    2.3.2.3.3 - afterFilter

    Este callback chamado depois que uma ao no controller executada.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    48 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    52/226

    2.3.2.3.4 - afterRender

    Chamada depois que uma ao renderizada.

    2.3.2.3.5 - _beforeSca!old

    _beforeSca!old($method)

    Este callback utilizado quando est sendo feito uso do sca!old. O parmetro $methoddeve conter o nomeda ao que ser executada.

    2.3.2.3.6 - _afterSca!oldSave

    _afterSca!oldSave($method)

    Callbackigual ao_beforeSca!old, entretanto executado depois de uma ao de edio ou update realizadapor sca!old. O parmetro $methoddeve conter o valor editou update.

    2.3.2.3.7 - _afterSca!oldSaveError

    _afterSca!oldSaveError($method)

    Callbackigual ao_afterSca!oldSave, entretanto executado quando ocorre algum erro na tentativa de edioou atualizao. O parmetro $methoddeve conter o valor editou update.

    2.3.2.3.8 - _sca!oldError

    _sca!oldError($method)

    Essa funo chamada quando ocorre algum erro em uma ao feita via sca!old. O parmetro $methoddeveconter o nome da ao.

    2.3.3 - A camada de visoEssa camada responsvel de gerar a interface com o cliente. Na maioria das vezes o resultado dessa camadaser um arquivo de extenso XHTML, mas possvel tambm gerar aruivos de RSS. possvel gerar tambmarquivos de extenso CSV.

    Os arquivos da viso so salvos com a extenso .ctp e escritos em php. A extenso ctp quer dizer CakePhpTemplate. Esses arquivos possuem toda a lgica para receber os dados enviados pela camada de controle eapresent-los para o usurio.

    Os arquivos de viso so salvos no diretrio app/views, dentro de uma pasta com o nome do controle que estrelacionado. O nome do arquivo deve ser o nome da ao que a viso vai apresentar com extenso .ctp. Porexemplo, O arquivo de viso da ao de adicionar um produto do controle produto deve ser salvo no seguintearquivo app/views/produto/adicionar.ctp

    A camada de viso composto de trs partes distintas: layout, elementse helpers.

    Layoutsso arquivos de viso que iro abrigar diversos arquivos da aplicao. A maioria dos arquivos de visoso renderizadas dentro de um arquivo de layout.

    Elementsso pequenos pedaos de cdigo que podem ser reusados em diversos lugares da aplicao.Geralmente so renderizados dentro de uma view.

    Helpersfornecem lgica para os arquivos de viso. Atravs de helperso CakePHP fornece formas fceis de seconstruir formulrios, aplicaes Ajax, paginao, RSS, dentre diversas outras funcionalidades.

    2.3.3.1 - Layouts

    O layoutcontm cdigo de apresentao que abriga os arquivos de viso. Tudo que se deseja ver em umaviso deve ser posto dentro de um arquivo de layout.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    49 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    53/226

    Os arquivos de layoutesto disponveis dentro do diretrio /app/views/layouts. Por padro o CakePHP irprocurar pelo arquivo /app/views/layouts/default.ctppara renderizar os arquivos de viso dentro destearquivo. Entretanto, possvel sobrescrever esse arquivo.

    Um arquivo de layoutdeve conter uma regio destinada para carregar os arquivos de viso. Isto feito atravsda varivel $content_for_layout. Pode-se tambm definir o ttulo da tela atravs da funo$this->set('title_for_layout','Ttulo da pgina'). Para incorporar arquivos de javascript externosao arquivo de layout, deve-se utilizar a varivel $scripts_for_layout.

    Ao invs de definir o ttulo da viso em layout possvel definir no prprio arquivo de controle atravs davarivel $this->layout. O mesmo ocorre com o ttulo, que pode ser definido com$this->set('title_for_layout','Ttulo da pgina');no arquivo de controle para definir o ttulo datela. Para ver um exemplo de arquivo de layout abra o arquivo /app/views/layouts/default.ctpdoCakePHP.

    Listagem 43 - Exemplo de uso de $this->set('title_for_layout','Ttulo da pgina')e $this->layoutnoarquivo de controle

    Alm do layoutpadro que o defaulto CakePHP tambm fornece o ajaxque adequado para renderizar telascom recursos ajaxe o layoute o flashque til quando ir se lidar com mensagens enviadas via mtodo flash.

    2.3.3.2 - Elements

    Muitas aplicaes possuem partes da apresentao que precisam ser repetidas em diversas partes. Para issoexiste o element. Geralmente essas partes da apresentao podem ser um menu, formulrios de login, caixasde ajuda, dentre diversos outros exemplos. Um elemento pode ser visto como um mini-arquivo de viso que embutido dentro de um arquivo de viso, layoutse mesmo dentro de outro arquivo element.

    Arquivos desse tipo so salvos dentro do diretrio /app/views/elements/e utilizam a extenso .ctp.

    Listagem 44 - Exemplo de como importar um Element

    2.3.3.2.1 - Passando variveis dentro de um elemento

    possvel passar dados para um elemento atravs do segundo parmetro.

    Neste exemplo, dentro de element, a varivel $mensagem ficaria disponvel com o valor "nononoo nononoon".Alm de dados, a funo elementtambm fornece as opes cachee plugin.

  • 7/21/2019 Apostila Curso Cakephp 2km

    54/226

    $this->element('caixaDeMensagem',array(

    "mensagem" => "nononoo nononoon""mensagem2" => "outra varivel""cache" => "+2 days""plugin" => ""

    )

    );?>

    2.3.3.2.2 - Fazendo o cachede elementos

    Se o parmetro cacheestiver atribudo com o valor true, ser feito cache de um dia. Pode-se tambm definirvalores diferentes deste valor padro.

    2.3.3.2.3 - Requiso de elementos atravs de um plugin

    Para utilizar um elementdentro de um plugin, basta utilizar o parmetro pluginno mtodo element.

    2.3.3.3 - Themes

    Usando Themes possvel alterar o visual da aplicao de forma fcil e prtica. Para usar temas necessrioutilizar no controllera classe ThemeViewno lugar da classe de viso padro. Depois, atravs da varivel$theme possvel definir o tema que ser utilizado.

    Tambm possvel trocar os temas dentro das funes de callback: beforeFiltere beforeRender.

    Curso de CakePHP da 2km interativa! | www.2km.com.br

    51 of 223

  • 7/21/2019 Apostila Curso Cakephp 2km

    55/226

    Os temas so salvos dentro do diretrio /app/views/themed/, da mesma forma que acontece com os arquivosda view, cada tema deve estar dentro de uma pasta que, por sua vez, deve ter o nome do tema. Em nossoexemplo passado, o arquivo de tema seria salvo dentro do diretrio /app/views/themed/exemplo/.

    Se fosse um arquivo do tipo edit, este arquivo teria que ser salvo no seguinte caminho: /app/views/themed/exemplo/edit.ctp.

    Se o tema no for achado dentro do diretrio app/views/themes, o CakePHP ir procurar em app/viewsum

    arquivo substitui