Programação para WEB <ul><ul><li>Regis Pires Magalhães </li></ul></ul><ul><ul><li>[email_address] </li></ul></ul>O Framewo...
Framework <ul><li>Oferece uma arquitetura que pode ser usada em várias aplicações. </li></ul><ul><li>Toda aplicação tem um...
Publicações sobre CakePHP <ul><li>CakePHP in Action - The Official Guide </li></ul><ul><ul><li>Duane O'Brien </li></ul></u...
Publicações sobre CakePHP <ul><li>Frameworks para Desenvolvimento em PHP </li></ul><ul><ul><li>Elton Luís Minetto </li></u...
Histórico <ul><li>Em 2005, Michal Tatarynowicz escreveu uma pequena versão de um framework para aplicações rápidas em PHP....
Características <ul><li>Baseado no framework Ruby on Rails: </li></ul><ul><ul><li>Convenção sobre Configuração; </li></ul>...
Características <ul><li>Ativo </li></ul><ul><li>Comunidade amigável e extensa </li></ul><ul><li>Licença bastante flexível ...
Comparativo com outros frameworks <ul><li>Estrutura MVC mais eficiente que Symfony e Zend, além de ocupar pouco espaço no ...
Arquitetura MVC
Arquitetura MVC <ul><li>Modelos para toda a interação com banco de dados; </li></ul><ul><li>Visões para todas as apresenta...
MVC – Vantagens  <ul><li>Tarefas repetitivas podem ser separadas, facilitando a manutenção, entendimento, alterações, desc...
Testando o PHP via console <ul><li>php -v </li></ul>
Instalando o CakePHP <ul><li>Baixe o CakePHP em: </li></ul><ul><ul><li>http://cakephp.org/downloads  </li></ul></ul><ul><l...
Geração de código com Bake <ul><li>Entre no diretório do projeto: </li></ul><ul><ul><li>cd xampplitehtdocsprojeto-cake </l...
Bake Welcome to CakePHP v1.2.0.6311 beta Console -------------------------------------------------------------- App : app ...
Estrutura de Diretórios <ul><li>app  – nossa aplicação fica aqui. </li></ul><ul><li>cake  – o framework fica aqui. Não mex...
Estrutura de Diretórios <ul><li>No diretório App temos : </li></ul><ul><ul><li>config : Arquivos de configuração </li></ul...
Configurando o CakePHP <ul><li>Teste a aplicação. </li></ul><ul><li>Algumas observações aparecerão e deverão ser seguidas:...
Configurações da base de dados <ul><li>driver </li></ul><ul><ul><li>Nome do driver da base de dados para esta configuração...
Base de Dados usando MySQL <?php class   DATABASE_CONFIG   { var   $default   =   array ( 'driver'   =>   'mysql' , 'persi...
Base de Dados usando MySQLi <?php class   DATABASE_CONFIG   { var   $default   =   array ( 'driver'   =>   'mysqli' , 'per...
Olá, Mundo!!! <?php   class   HelloController   extends   AppController   { var   $uses   =   array ();   var   $autoRende...
Olá, Mundo!!! <?php   class   HelloController   extends   AppController   { var   $uses   =   array ();   function   index...
Envio de dados do controlador para a visão <?php  class   HelloController   extends   AppController   { var   $uses   =   ...
Método set <ul><li>O método set usado nos controladores serve para enviar dados do controlador para a visão. </li></ul><ul...
Layouts <ul><li>Layout padrão: </li></ul><ul><ul><li>cake/libs/view/layouts/default.ctp </li></ul></ul><ul><li>Layout pers...
Fluxo de funcionamento do CakePHP
Configuração <ul><li>app/config/core.php </li></ul><ul><ul><li>debug  </li></ul></ul><ul><ul><ul><li>0 = Modo de Produção....
Paginação <ul><li>Padrão: 20 itens por página </li></ul><ul><li>Configuração no controller: </li></ul><ul><li>var   $pagin...
Paginação <ul><li>Uso: </li></ul><ul><ul><li>$filmes   =   $this ->paginate(); </li></ul></ul><ul><ul><li>$this ->set( 'fi...
Paginação < table > < tr >   < th > <?php   echo   $paginator ->sort( 'ID' ,   'id' );   ?> </ th >   < th > <?php   echo ...
Paginação <!-- Shows the next and previous links --> <?php echo   $paginator ->prev( '« Previous ' ,   null,   null,   arr...
Paginação <ul><li>O contador pode ser personalizado: </li></ul><?php echo   $paginator ->counter( array ( 'format'   =>   ...
Validação <?php class   User   extends   AppModel   { var   $name   =   'User' ; var   $validate   =   array ( 'login'   =...
Validação <?php class   Genero   extends   AppModel   { var   $name   =   'Genero' ; var   $useTable   =   'generos' ; var...
Validação <?php class  Filme  extends  AppModel   { var  $name   =   'Filme' ; var  $useTable   =   'filmes' ; var  $valid...
Validação <?php class   User   extends   AppModel   { var   $name   =   'User' ; var   $validate   =   array ( 'login'   =...
Validação <ul><li>alphaNumeric  </li></ul><ul><li>between  </li></ul><ul><li>blank  </li></ul><ul><li>cc  </li></ul><ul><l...
Associações <ul><li>$belongsTo </li></ul><ul><li>$hasOne </li></ul><ul><li>$hasMany </li></ul><ul><li>$hasAndBelongsToMany...
Associações <?php class   User   extends   AppModel   { var   $name   =   'User' ; var   $hasOne   =   'Profile' ; var   $...
Associações <?php class   Filme   extends   AppModel   { var   $name   =   'Filme' ; var   $useTable   =   'filmes' ; // ....
Associações $generos   =   $this ->Filme->Genero->find( 'list' , array ( 'order'   =>   'Genero.descricao' )); $this ->set...
Rotas <ul><li>Definições de rota dizem ao CakePHP como mapear URLs para ações de controladores. </li></ul><ul><li>Comporta...
Definição de Rotas <ul><li>Arquivo: </li></ul><ul><ul><li>/app/config/routes.php </li></ul></ul><ul><li>Exemplo: </li></ul...
Flash <ul><li>Usado para comunicação entre ações. </li></ul><ul><li>Contém uma string contendo informação ou erro. </li></...
Logging <ul><li>Usar: </li></ul><ul><li>$this ->log( &quot;Ops, algo não deu certo!&quot; ); </li></ul><ul><li>$this ->log...
Model <ul><li>Normalmente representam tabelas no banco de dados, mas também podem ser entradas LDAP, feeds RSS, arquivos n...
Model <?php class   Pessoa   extends   AppModel   { } ?> app/models/pessoa.php
Personalização de plurais <ul><li>Pode-se ajustar a pluralização no arquivo: </li></ul><ul><ul><li>/app/config/inflections...
Controller <?php class   PessoasController   extends   AppController   { var   $scaffold ; } ?> app/controllers/pessoas_co...
View <ul><li>Obtém dados do controller e os usa para gerar a apresentação para o cliente. </li></ul><ul><li>Views são norm...
Layouts <ul><li>Por padrão, cada visão gerada pelo controlador é colocada dentro de um layout. </li></ul>
Helpers de Visão <ul><li>Ajudam na lógica de apresentação. </li></ul><ul><li>Compartilhados entre várias visões. </li></ul>
$html->link <?php   echo   $html ->link( 'Filmes' , array ( 'controller' => 'filmes', 'action' => 'index' ));   ?> <?php  ...
Compartilhamento de Código <ul><li>Controladores, Helpers e Modelos possuem uma super-classe que permitem o compartilhamen...
Controller - Callbacks <ul><li>Controladores possuem  callbacks . </li></ul><ul><li>E o que são  callbacks ? </li></ul><ul...
Controller - Callbacks <ul><li>Callbacks disponíveis nos controladores: </li></ul><ul><ul><li>beforeFilter()  - executado ...
Model – Callbacks  <ul><li>beforeFind() </li></ul><ul><li>afterFind() </li></ul><ul><li>beforeValidate() </li></ul><ul><li...
Autenticação <ul><li>Criar tabela usuarios </li></ul><ul><ul><li>Campo email - varchar(100) </li></ul></ul><ul><ul><li>Cam...
Autenticação <ul><li>AppController </li></ul><?php class   AppController   extends   Controller   { var   $components   = ...
Autenticação <ul><li>Criar ações login e logout no controlador de usuários: </li></ul><?php class   UsuariosController   e...
Autenticação <ul><li>Criar visão de login (/app/views/usuarios/login.ctp) </li></ul>< div  class = &quot;login&quot; > < h...
Autenticação <ul><li>No Layout </li></ul><ul><ul><li>Item de Menu: </li></ul></ul><ul><li><?php   echo   $html ->link( 'Sa...
Permissões de Acesso <ul><li>ACL – Access Control Lists </li></ul><ul><li>ARO – Access Request Objects </li></ul><ul><ul><...
AROs $aro   =   new   Aro(); $aro ->create( $user_id ,   $parent_id ,   $alias ); $aro ->create( 0 , null,  'Presidents' )...
ACOs $aco   =   new   Aco(); $aco ->create( $id ,   $parent ,   $alias ); $aco ->create( 1 ,   null,   'Electric Guitar' )...
ACL <?php class   SomethingsController   extends   AppController   { var   $components   =   array ( 'Acl' ); function   s...
ACL <?php class   AppController   extends   Controller{ var   $components   =   array ( 'Acl' ); function   checkAccess( $...
ACL cd app ..cakeconsolecake schema run create DbAcl <ul><li>Criando as tabelas de ACL: </li></ul>
Referências <ul><li>The Cookbook </li></ul><ul><ul><li>http://book.cakephp.org  </li></ul></ul><ul><li>API </li></ul><ul><...
Upcoming SlideShare
Loading in...5
×

Php 07 Cakephp

6,266

Published on

0 Comments
18 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
6,266
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
474
Comments
0
Likes
18
Embeds 0
No embeds

No notes for slide

Php 07 Cakephp

  1. 1. Programação para WEB <ul><ul><li>Regis Pires Magalhães </li></ul></ul><ul><ul><li>[email_address] </li></ul></ul>O Framework CakePHP
  2. 2. Framework <ul><li>Oferece uma arquitetura que pode ser usada em várias aplicações. </li></ul><ul><li>Toda aplicação tem um conjunto de características básicas em comum, que terminam sendo copiadas para a criação de novos códigos. </li></ul><ul><li>Um framework é projetado para prover uma estrutura para esses elementos comuns. </li></ul>
  3. 3. Publicações sobre CakePHP <ul><li>CakePHP in Action - The Official Guide </li></ul><ul><ul><li>Duane O'Brien </li></ul></ul><ul><li>Beginning CakePHP: From Novice to Professional </li></ul><ul><ul><li>David Golding </li></ul></ul>
  4. 4. Publicações sobre CakePHP <ul><li>Frameworks para Desenvolvimento em PHP </li></ul><ul><ul><li>Elton Luís Minetto </li></ul></ul>
  5. 5. Histórico <ul><li>Em 2005, Michal Tatarynowicz escreveu uma pequena versão de um framework para aplicações rápidas em PHP. </li></ul><ul><li>Depois ele publicou o framework sob licença MIT, chamando-o de Cake e abrindo-o à comunidade que agora o mantém com o nome de CakePHP. </li></ul>
  6. 6. Características <ul><li>Baseado no framework Ruby on Rails: </li></ul><ul><ul><li>Convenção sobre Configuração; </li></ul></ul><ul><ul><li>Full Stack Web Framework; </li></ul></ul><ul><ul><li>DRY – Don´t Repeat Yourself – Não se repita </li></ul></ul><ul><ul><li>Arquitetura MVC – Modelo, Visão, Controlador </li></ul></ul><ul><ul><li>Funcionalidade CRUD para interação com banco de dados </li></ul></ul><ul><ul><li>Scaffolding </li></ul></ul><ul><ul><li>Validações nativas </li></ul></ul><ul><ul><li>Helpers nas visões para AJAX, JavaScript, HTML, formulários, etc. </li></ul></ul><ul><ul><li>URLs e rotas personalizáveis e limpas </li></ul></ul>
  7. 7. Características <ul><li>Ativo </li></ul><ul><li>Comunidade amigável e extensa </li></ul><ul><li>Licença bastante flexível (MIT) </li></ul><ul><li>Compatibilidade com PHP 4 e PHP 5 </li></ul><ul><li>Geração de código </li></ul><ul><li>Componentes de E-mail, Cookie, Segurança, Sessões, Manipulação de Requisições, etc. </li></ul><ul><li>Lista de controle de acessos (ACL) flexível </li></ul><ul><li>Cache flexível </li></ul><ul><li>Internacionalização e Localização </li></ul><ul><li>Facilidade de disponibilização </li></ul>
  8. 8. Comparativo com outros frameworks <ul><li>Estrutura MVC mais eficiente que Symfony e Zend, além de ocupar pouco espaço no servidor. (David Golding) </li></ul><ul><li>Boa documentação, inclusive em português. Livros estão sendo publicados. </li></ul><ul><li>Comunidade grande e ativa. </li></ul><ul><li>Atualizações freqüentes. </li></ul>
  9. 9. Arquitetura MVC
  10. 10. Arquitetura MVC <ul><li>Modelos para toda a interação com banco de dados; </li></ul><ul><li>Visões para todas as apresentações e saídas; </li></ul><ul><li>Controladores para comandos e scripts. </li></ul>
  11. 11. MVC – Vantagens <ul><li>Tarefas repetitivas podem ser separadas, facilitando a manutenção, entendimento, alterações, descoberta de erros e bugs, divisão de tarefas, etc. </li></ul>
  12. 12. Testando o PHP via console <ul><li>php -v </li></ul>
  13. 13. Instalando o CakePHP <ul><li>Baixe o CakePHP em: </li></ul><ul><ul><li>http://cakephp.org/downloads </li></ul></ul><ul><li>Descompacte-o na pasta htdocs e renomeie o diretório para o nome mais adequado para sua aplicação. </li></ul>
  14. 14. Geração de código com Bake <ul><li>Entre no diretório do projeto: </li></ul><ul><ul><li>cd xampplitehtdocsprojeto-cake </li></ul></ul><ul><li>Execute o gerador de código (bake): </li></ul><ul><ul><li>cakeconsolecake bake -app app </li></ul></ul>
  15. 15. Bake Welcome to CakePHP v1.2.0.6311 beta Console -------------------------------------------------------------- App : app Path: C:xampplitehtdocslocadoraapp -------------------------------------------------------------- Interactive Bake Shell -------------------------------------------------------------- [D]atabase Configuration [M]odel [V]iew [C]ontroller [P]roject [Q]uit What would you like to Bake? (D/M/V/C/P/Q)
  16. 16. Estrutura de Diretórios <ul><li>app – nossa aplicação fica aqui. </li></ul><ul><li>cake – o framework fica aqui. Não mexa!!! Pode-se atualizar a versão do CakePHP sem interferir na aplicação. </li></ul><ul><li>docs – documentação da nossa aplicação. </li></ul><ul><li>index.php – coletor de requisições. Recebe as requisições se: </li></ul><ul><ul><li>mod_rewrite ou .htaccess não estiver disponível </li></ul></ul><ul><ul><li>/public não estiver definido como web root. </li></ul></ul><ul><li>vendors – bibliotecas de terceiros. </li></ul>
  17. 17. Estrutura de Diretórios <ul><li>No diretório App temos : </li></ul><ul><ul><li>config : Arquivos de configuração </li></ul></ul><ul><ul><li>controllers : controladores </li></ul></ul><ul><ul><li>models : modelos </li></ul></ul><ul><ul><li>views : visões </li></ul></ul><ul><ul><li>webroot : html's, imagens, swf, css, javascript, etc. </li></ul></ul>
  18. 18. Configurando o CakePHP <ul><li>Teste a aplicação. </li></ul><ul><li>Algumas observações aparecerão e deverão ser seguidas: </li></ul><ul><ul><li>Alterar a seguinte linha do arquivo /app/config/core.php: </li></ul></ul><ul><ul><ul><li>Configure::write('Security.salt', 'DyhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi'); </li></ul></ul></ul><ul><ul><li>Renomear o arquivo config/database.php.defaul t para config/database.php e configurá-lo para acessar o banco de dados de nossa aplicação. </li></ul></ul>
  19. 19. Configurações da base de dados <ul><li>driver </li></ul><ul><ul><li>Nome do driver da base de dados para esta configuração. Exemplos: mysql, postgres, sqlite, pear-drivername, adodb-drivername, mssql, oracle, ou odbc. </li></ul></ul><ul><li>persistent </li></ul><ul><ul><li>Se usará ou não uma conexão persistente com a base de dados. </li></ul></ul><ul><li>host </li></ul><ul><ul><li>O nome do servidor da base de dados (ou endereço IP). </li></ul></ul><ul><li>login </li></ul><ul><ul><li>O usuário desta conta. </li></ul></ul><ul><li>password </li></ul><ul><ul><li>A senha desta conta. </li></ul></ul><ul><li>database </li></ul><ul><ul><li>O nome da base de dados que esta conexão irá usar. </li></ul></ul><ul><li>prefix (opcional) </li></ul><ul><ul><li>Esta string será adicionada como prefixo no nome de todas tabelas de sua base de dados.Se suas tabelas não possuem prefixo, deixe esta string vazia. </li></ul></ul><ul><li>port (opcional) </li></ul><ul><ul><li>A porta TCP ou socket Unix usado para conectar com o servidor. </li></ul></ul><ul><li>enconding </li></ul><ul><ul><li>Indica qual caractere definido será usado para enviar indicações SQL ao servidor. </li></ul></ul><ul><li>schema </li></ul><ul><ul><li>Usado em instalações de base de dados PostgreSQL para especificar qual schema usar. </li></ul></ul>
  20. 20. Base de Dados usando MySQL <?php class DATABASE_CONFIG { var $default = array ( 'driver' => 'mysql' , 'persistent' => true , 'host' => 'localhost' , 'port' => '' , 'login' => 'root' , 'password' => '' , 'database' => 'prog_web' , 'schema' => '' , 'prefix' => '' , 'encoding' => 'utf8' ); // ... } ?> app/config/database.php
  21. 21. Base de Dados usando MySQLi <?php class DATABASE_CONFIG { var $default = array ( 'driver' => 'mysqli' , 'persistent' => true , 'host' => 'localhost' , 'port' => '0' , 'login' => 'root' , 'password' => '' , 'database' => 'prog_web' , 'schema' => '' , 'prefix' => '' , 'encoding' => 'utf8' ); // ... } ?> app/config/database.php
  22. 22. Olá, Mundo!!! <?php class HelloController extends AppController { var $uses = array (); var $autoRender = false ; function index() { echo 'Olá, Mundo!!!' ; } } ?> app/controllers/hello_controller.php
  23. 23. Olá, Mundo!!! <?php class HelloController extends AppController { var $uses = array (); function index() { } } ?> < p > Olá, Mundo!!! </ p > app/views/hello/index.ctp app/controllers/hello_controller.php
  24. 24. Envio de dados do controlador para a visão <?php class HelloController extends AppController { var $uses = array (); function index() { $this ->set( 'nome' , 'Regis' ); } } ?> < p > Olá, <?php echo $nome ; ?> . </ p > app/views/hello/index.ctp app/controllers/hello_controller.php
  25. 25. Método set <ul><li>O método set usado nos controladores serve para enviar dados do controlador para a visão. </li></ul><ul><li>Exemplos: </li></ul>$this ->set( 'cor' , 'azul' ); $this ->set( 'colecoes' , $this ->Colecao->findAll());
  26. 26. Layouts <ul><li>Layout padrão: </li></ul><ul><ul><li>cake/libs/view/layouts/default.ctp </li></ul></ul><ul><li>Layout personalizado: </li></ul><ul><ul><li>appviewslayoutsdefault.ctp </li></ul></ul>< html > < head > < title > Aplicação Exemplo </ title > </ head > < body > < h1 > Minha Aplicação </ h1 > <?php echo $content_for_layout ; ?> </ body > </ html >
  27. 27. Fluxo de funcionamento do CakePHP
  28. 28. Configuração <ul><li>app/config/core.php </li></ul><ul><ul><li>debug </li></ul></ul><ul><ul><ul><li>0 = Modo de Produção. Nenhuma saída. </li></ul></ul></ul><ul><ul><ul><li>1 = Exibe erros e alertas. </li></ul></ul></ul><ul><ul><ul><li>2 = Exibe erros, alertas e SQL. </li></ul></ul></ul><ul><ul><ul><li>3 = Exibe erros, alertas, SQL e listagem completa do controller. </li></ul></ul></ul>
  29. 29. Paginação <ul><li>Padrão: 20 itens por página </li></ul><ul><li>Configuração no controller: </li></ul><ul><li>var $paginate = array ( 'limit' => 10 ); </li></ul><ul><li>var $paginate = array ( 'limit' => 10 , 'order' => 'Filme.titulo' ); </li></ul><ul><li>var $paginate = array ( 'limit' => 10 , 'order' => array ( 'Filme.titulo' => 'desc' )); </li></ul>
  30. 30. Paginação <ul><li>Uso: </li></ul><ul><ul><li>$filmes = $this ->paginate(); </li></ul></ul><ul><ul><li>$this ->set( 'filmes' , $filmes ); </li></ul></ul><ul><li>Ou: </li></ul><ul><ul><li>$filmes = $this ->paginate( 'Filme' ); </li></ul></ul><ul><ul><li>$this ->set( 'filmes' , $filmes ); </li></ul></ul>
  31. 31. Paginação < table > < tr > < th > <?php echo $paginator ->sort( 'ID' , 'id' ); ?> </ th > < th > <?php echo $paginator ->sort( 'Title' , 'title' ); ?> </ th > </ tr > <?php foreach ( $data as $recipe ): ?> < tr > < td > <?php echo $recipe [ 'Recipe' ][ 'id' ]; ?> </ td > < td > <?php echo $recipe [ 'Recipe' ][ 'title' ]; ?> </ td > </ tr > <?php endforeach ; ?> </ table > <ul><li>Na visão: </li></ul>
  32. 32. Paginação <!-- Shows the next and previous links --> <?php echo $paginator ->prev( '« Previous ' , null, null, array ( 'class' => 'disabled' )); echo $paginator ->next( ' Next »' , null, null, array ( 'class' => 'disabled' )); ?> <!-- prints X of Y, where X is current page and Y is number of pages --> <?php echo $paginator ->counter(); ?> <ul><li>Na visão: </li></ul>
  33. 33. Paginação <ul><li>O contador pode ser personalizado: </li></ul><?php echo $paginator ->counter( array ( 'format' => ' Página %page% de %pages%, mostrando %current% registros de um total de %count%. Registro inicial: %start%. Registro final: %end% ' )); ?>
  34. 34. Validação <?php class User extends AppModel { var $name = 'User' ; var $validate = array ( 'login' => 'alphaNumeric' , 'email' => 'email' , 'born' => 'date' ); } ?>
  35. 35. Validação <?php class Genero extends AppModel { var $name = 'Genero' ; var $useTable = 'generos' ; var $displayField = 'descricao' ; var $validate = array ( 'descricao' => VALID_NOT_EMPTY); //... } ?>
  36. 36. Validação <?php class Filme extends AppModel { var $name = 'Filme' ; var $useTable = 'filmes' ; var $validate = array ( 'titulo' => array ( array ( 'rule' => array ( 'minLength' , 1 ), 'message' => 'Não pode ficar em branco' ), array ( 'rule' => array ( 'maxLength' , 50 ), 'message' => 'Texto muito longo.' )), 'sinopse' => array ( 'rule' => array ( 'minLength' , 1 )), 'ano_lancamento' => array ( 'numeric' ) ); //... } ?>
  37. 37. Validação <?php class User extends AppModel { var $name = 'User' ; var $validate = array ( 'login' => array ( 'alphanumeric' => array ( 'rule' => 'alphaNumeric' , 'required' => true , 'message' => 'Alphabets and numbers only' ), 'between' => array ( 'rule' => array ( 'between' , 5 , 15 ) ) ), 'password' => array ( 'rule' => array ( 'minLength' , '8' ), 'message' => 'Mimimum 8 characters long' ), 'born' => array ( 'rule' => 'date' , 'message' => 'Enter a valid date' , 'allowEmpty' => true ) ); } ?>
  38. 38. Validação <ul><li>alphaNumeric </li></ul><ul><li>between </li></ul><ul><li>blank </li></ul><ul><li>cc </li></ul><ul><li>comparison </li></ul><ul><li>date </li></ul><ul><li>decimal </li></ul><ul><li>email </li></ul><ul><li>equalTo </li></ul><ul><li>extension </li></ul><ul><li>ip </li></ul><ul><li>minLength </li></ul><ul><li>maxLength </li></ul><ul><li>money </li></ul><ul><li>numeric </li></ul><ul><li>phone </li></ul><ul><li>postal </li></ul><ul><li>range </li></ul><ul><li>url </li></ul>
  39. 39. Associações <ul><li>$belongsTo </li></ul><ul><li>$hasOne </li></ul><ul><li>$hasMany </li></ul><ul><li>$hasAndBelongsToMany </li></ul>
  40. 40. Associações <?php class User extends AppModel { var $name = 'User' ; var $hasOne = 'Profile' ; var $hasMany = array ( 'Recipe' => array ( 'className' => 'Recipe' , 'conditions' => 'Recipe.approved = 1' , 'order' => 'Recipe.created DESC' )); } ?>
  41. 41. Associações <?php class Filme extends AppModel { var $name = 'Filme' ; var $useTable = 'filmes' ; // ... var $belongsTo = array ( 'Genero' => array ( 'className' => 'Genero' , 'foreignKey' => 'genero_id' , 'conditions' => '' , 'fields' => '' , 'order' => '' ) ); } ?>
  42. 42. Associações $generos = $this ->Filme->Genero->find( 'list' , array ( 'order' => 'Genero.descricao' )); $this ->set(compact( 'generos' )); $generos = $this ->Filme->Genero->find( 'list' , array ( 'conditions' => array ( 'Genero.descricao' => 'like a%' ), 'order' => 'Genero.descricao' )); $this ->set(compact( 'generos' )); <ul><li>No modelo (genero.php): </li></ul><ul><li>Nas actions add e edit do controller ( filmes_controller.php ): </li></ul>var $displayField = 'descricao' ;
  43. 43. Rotas <ul><li>Definições de rota dizem ao CakePHP como mapear URLs para ações de controladores. </li></ul><ul><li>Comportamento padrão: </li></ul><ul><ul><li>A URL &quot;/controller/action/var1/var2&quot; é mapeada para Controller::action($var1, $var2) </li></ul></ul><ul><li>Tal comportamento pode ser personalizado. </li></ul>
  44. 44. Definição de Rotas <ul><li>Arquivo: </li></ul><ul><ul><li>/app/config/routes.php </li></ul></ul><ul><li>Exemplo: </li></ul><?php Router::connect( '/' , array ( 'controller' => 'filmes' , 'action' => 'index' )); Router::connect( '/pages/*' , array ( 'controller' => 'pages' , 'action' => 'display' )); ?>
  45. 45. Flash <ul><li>Usado para comunicação entre ações. </li></ul><ul><li>Contém uma string contendo informação ou erro. </li></ul><ul><li>Existe somente durante uma requisição. </li></ul><ul><li>No controller: </li></ul><ul><ul><li>$this ->Session->setFlash( 'OK' ); </li></ul></ul><ul><li>Na view: </li></ul><ul><ul><li><?php </li></ul></ul><ul><ul><li>if ( $session ->check( 'Message.flash' )): </li></ul></ul><ul><ul><li>$session ->flash(); </li></ul></ul><ul><ul><li>endif ; </li></ul></ul><ul><ul><li>?> </li></ul></ul>
  46. 46. Logging <ul><li>Usar: </li></ul><ul><li>$this ->log( &quot;Ops, algo não deu certo!&quot; ); </li></ul><ul><li>$this ->log( 'mensagem de debug.' , LOG_DEBUG); </li></ul><ul><li>Verificar em: </li></ul><ul><ul><li>app/tmp/logs/error.log </li></ul></ul><ul><ul><li>app/tmp/logs/debug.log </li></ul></ul><ul><li>Níveis de log: </li></ul><ul><ul><li>LOG_ERROR </li></ul></ul><ul><ul><li>LOG_DEBUG </li></ul></ul>
  47. 47. Model <ul><li>Normalmente representam tabelas no banco de dados, mas também podem ser entradas LDAP, feeds RSS, arquivos no sistema, etc. </li></ul>
  48. 48. Model <?php class Pessoa extends AppModel { } ?> app/models/pessoa.php
  49. 49. Personalização de plurais <ul><li>Pode-se ajustar a pluralização no arquivo: </li></ul><ul><ul><li>/app/config/inflections.php </li></ul></ul><ul><ul><li>Exemplo: </li></ul></ul><ul><ul><ul><li>$irregularPlural = array ( 'valor' => 'valores' ); </li></ul></ul></ul>
  50. 50. Controller <?php class PessoasController extends AppController { var $scaffold ; } ?> app/controllers/pessoas_controller.php
  51. 51. View <ul><li>Obtém dados do controller e os usa para gerar a apresentação para o cliente. </li></ul><ul><li>Views são normalmente HTML, mas também podem ser: PDF, XML, objetos JSON, etc. </li></ul>
  52. 52. Layouts <ul><li>Por padrão, cada visão gerada pelo controlador é colocada dentro de um layout. </li></ul>
  53. 53. Helpers de Visão <ul><li>Ajudam na lógica de apresentação. </li></ul><ul><li>Compartilhados entre várias visões. </li></ul>
  54. 54. $html->link <?php echo $html ->link( 'Filmes' , array ( 'controller' => 'filmes', 'action' => 'index' )); ?> <?php echo $html ->link( 'Gêneros' , array ( 'controller' => 'generos', 'action' => 'index' )); ?>
  55. 55. Compartilhamento de Código <ul><li>Controladores, Helpers e Modelos possuem uma super-classe que permitem o compartilhamento de código entre vários controladores, helpers ou modelos: </li></ul><ul><ul><li>AppController – /app/app_controller.php </li></ul></ul><ul><ul><li>AppHelper – /app/app_helper.php </li></ul></ul><ul><ul><li>AppModel – /app/app_model.php </li></ul></ul>
  56. 56. Controller - Callbacks <ul><li>Controladores possuem callbacks . </li></ul><ul><li>E o que são callbacks ? </li></ul><ul><ul><li>São funções/métodos que ao invés de serem chamados diretamente por nós, são executadas pelo sistema/framework quando necessário. </li></ul></ul><ul><li>Callbacks são usados quando precisamos de alguma lógica entre operações do próprio CakePHP. </li></ul>
  57. 57. Controller - Callbacks <ul><li>Callbacks disponíveis nos controladores: </li></ul><ul><ul><li>beforeFilter() - executado antes de qualquer ação do controlador. </li></ul></ul><ul><ul><li>beforeRender() - executado após a lógica do controlador, mas antes da geração da visão. </li></ul></ul><ul><ul><li>afterFilter() - executado após toda a lógica do controlador e geração da visão. </li></ul></ul><ul><ul><li>afterRender() - A mesma coisa que afterFilter(), exceto quando há alguma lógica após uma chamada explícita a render() na ação do controller. </li></ul></ul>
  58. 58. Model – Callbacks <ul><li>beforeFind() </li></ul><ul><li>afterFind() </li></ul><ul><li>beforeValidate() </li></ul><ul><li>beforeSave() </li></ul><ul><li>afterSave() </li></ul><ul><li>beforeDelete() </li></ul><ul><li>afterDelete() </li></ul>
  59. 59. Autenticação <ul><li>Criar tabela usuarios </li></ul><ul><ul><li>Campo email - varchar(100) </li></ul></ul><ul><ul><li>Campo senha – varchar(40) </li></ul></ul><ul><li>Criar modelo, visão e controlador para Usuario </li></ul>
  60. 60. Autenticação <ul><li>AppController </li></ul><?php class AppController extends Controller { var $components = array ( 'Auth' ); function beforeFilter(){ $this ->Auth->userModel = 'Usuario' ; $this ->Auth->fields = array ( 'username' => 'email' , 'password' => 'senha' ); $this ->Auth->loginAction = array ( 'controller' => 'usuarios' , 'action' => 'login' ); $this ->Auth->loginRedirect = array ( 'controller' => 'filmes' , 'action' => 'index' ); $this ->Auth->loginError = &quot;Usuário ou senha inválido(s)&quot; ; $this ->Auth->authError = 'Acesso não autorizado.' ; } } ?>
  61. 61. Autenticação <ul><li>Criar ações login e logout no controlador de usuários: </li></ul><?php class UsuariosController extends AppController { var $name = 'Usuarios' ; var $helpers = array ( 'Html' , 'Form' ); // ... function login() { } function logout(){ $this ->Session->setFlash( 'Desconectado.' ); $this ->redirect( $this ->Auth->logout()); } } ?>
  62. 62. Autenticação <ul><li>Criar visão de login (/app/views/usuarios/login.ctp) </li></ul>< div class = &quot;login&quot; > < h2 > Digite usuário e senha para acessar o sistema < h2 > <?php echo $form ->create( 'Usuario' , array ( 'action' => 'login' )); ?> <?php echo $form ->input( 'email' ); ?> <?php echo $form ->input( 'senha' , array ( 'type' => 'password' )); ?> <?php echo $form ->end( 'Login' ); ?> </ div >
  63. 63. Autenticação <ul><li>No Layout </li></ul><ul><ul><li>Item de Menu: </li></ul></ul><ul><li><?php echo $html ->link( 'Sair' , array ( 'controller' => 'usuarios' , 'action' => 'logout' )); ?> </li></ul><ul><ul><li>Mensagem: </li></ul></ul><?php if ( $session ->check( 'Message.auth' )) { $session ->flash( 'auth' ); } ?>
  64. 64. Permissões de Acesso <ul><li>ACL – Access Control Lists </li></ul><ul><li>ARO – Access Request Objects </li></ul><ul><ul><li>Usuários ou Grupos </li></ul></ul><ul><ul><li>Exemplo: admin, usuario, convidado </li></ul></ul><ul><li>ACO – Access Control Objects </li></ul><ul><ul><li>Controladores, ações </li></ul></ul><ul><ul><li>Exemplo: Filme, Genero </li></ul></ul><ul><li>ACL decide se um ARO pode acessar um ACO. </li></ul><ul><ul><li>Ou seja: se um usuário tem acesso a uma ação C, R, U ou D do ACO. </li></ul></ul>
  65. 65. AROs $aro = new Aro(); $aro ->create( $user_id , $parent_id , $alias ); $aro ->create( 0 , null, 'Presidents' ); $aro ->create( 0 , null, 'Artists' ); $aro ->create( 1 , null , 'Bob Marley' ); $aro ->create( 2 , null , 'Jimi Hendrix' ); $aro ->create( 3 , null , 'George Washington' ); $aro ->create( 4 , null , 'Abraham Lincoln' ); $aro ->setParent( 'Presidents' , 'George Washington' ); $aro ->setParent( 'Presidents' , 'Abraham Lincoln' ); $aro ->setParent( 'Artists' , 'Jimi Hendrix' ); $aro ->setParent( 'Artists' , 'Bob Marley' ); ?>
  66. 66. ACOs $aco = new Aco(); $aco ->create( $id , $parent , $alias ); $aco ->create( 1 , null, 'Electric Guitar' ); $aco ->create( 2 , null, 'United States Army' ); $aco ->create( 3 , null, 'Fans' );
  67. 67. ACL <?php class SomethingsController extends AppController { var $components = array ( 'Acl' ); function someAction() { // ALLLOW $this ->Acl->allow( 'Jimi Hendrix' , 'Electric Guitar' ); $this ->Acl->allow( 'Bob Marley' , 'Electric Guitar' ); $this ->Acl->Allow( 'Presidents' , 'United States Army' ); $this ->Acl->allow( 'George Washington' , 'Electric Guitar' , 'read' ); $this ->Acl->allow( 'Abraham Lincoln' , 'Electric Guitar' , 'read' ); // DENY $this ->Acl->deny( 'Abraham Lincoln' , 'United States Army' ); } } ?>
  68. 68. ACL <?php class AppController extends Controller{ var $components = array ( 'Acl' ); function checkAccess( $aco ){ $access = $this ->Acl->check( $this ->Session-> read( 'user_alias' ), $aco , $action = &quot;*&quot; ); if ( $access === false ) { echo &quot;access denied&quot; ; exit ; } else { echo &quot;access allowed&quot; ; exit ; } } } ?> $this ->Acl->check( $aro , $aco , $action = '*' );
  69. 69. ACL cd app ..cakeconsolecake schema run create DbAcl <ul><li>Criando as tabelas de ACL: </li></ul>
  70. 70. Referências <ul><li>The Cookbook </li></ul><ul><ul><li>http://book.cakephp.org </li></ul></ul><ul><li>API </li></ul><ul><ul><li>http://api.cakephp.org/1.2 </li></ul></ul><ul><li>Bakery </li></ul><ul><ul><li>http://bakery.cakephp.org </li></ul></ul><ul><li>CakeForge </li></ul><ul><ul><li>http://bakery.cakephp.org </li></ul></ul><ul><li>Site oficial </li></ul><ul><ul><li>http://www.cakephp.org </li></ul></ul><ul><li>Grupo Google </li></ul><ul><ul><li>http://groups.google.com/group/cake-php </li></ul></ul>
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×