CakePHP na pratica - suporte.inf.ufes.br · 5 Luis 1976 CSS 90 Novatec ... CakePHP eh um framework...
Transcript of CakePHP na pratica - suporte.inf.ufes.br · 5 Luis 1976 CSS 90 Novatec ... CakePHP eh um framework...
Sumario
Banco de DadosO que eh CakePHPInstalando o CakeModels, Controllers e ViewsMais ferramentas do CakePHPCake Bake – a magica do CakePHP
Entendendo BancoImagine que vc tenha uma biblioteca e queira
fazer um catalogo dos seus livros
ID Autor Nascido Titulo Pag Editora1 Roberto 1967 Editor VI 80 Novatec2 Roberto 1967 Python 300 Novatec3 Bira 1992 MMQSG24 NoisqDa4 Bira 1992 MMQSG 2 242 NoisqDa5 Luis 1976 CSS 90 Novatec6 Bira 1992 MMQSG 3 243 NoisqDa
Observe que tem dados sendo armazenados mais de uma vez
Entendendo BancoAssim separamos o banco em tabelas
Tabela Autor Tabela EditoraId NomeAno Id Nome1 Roberto 1967 1 Novatec2 Bira 1992 2 NoisqDa3 Luis 1976
Tabela LivroId NomePag Autor_idEditora_id1 Editor VI 80 1 12 Python 300 1 13 MMQSG 24 2 24 MMQSG 2 242 2 25 CSS 90 3 16 MMQSG 3 243 2 2
RelacionamentosTabelas possuem relacionamentos
N
publica 1
1
escreve
N
AUTOR
LIVRO
EDITORA
Exemplos de Bancos
ComputadorIdNome
HDIdFabricanteTamanhoTipoComputador_id
MonitorIdPolegadaFabricante
Placa de VideoIdFabricanteModeloComputador_id
MemoriaIdTamanhoFabricanteFrequencia
Exemplos de Bancos
TemporadasIdNumeroSeriado_id
SeriadosIdNomeStatusDia da Semana Episodio
IdNomeNumeroTemporada_idDia do Mes
Exemplos de Bancos
UsuarioIdNomeSenhaNascimentoEmail
PostsIdTituloCorpoDataUsuario_id
ComentariosIdComentarioDataPost_idUsuario_id
Exemplos de Bancos
RodadaIdNumeroTurno
CampeonatoIdAnoNomeData
JogoIdTituloSubtituloCorpoLocal
TimeIdNome
IntegranteIdNome
Exemplos de Bancos
RodadaIdNumeroTurno
CampeonatoIdAnoNomeData
JogoIdTituloSubtituloCorpoLocal
TimeIdNome
IntegranteIdNome
Nosso Banco
Postsidtitlebodycreatedmodified
Usersidusernamepassword
Commentsidbodycreatedpost_iduser_id
Convenções:Usaremos as conevencões do Cake para facilitar a minha vida.-Nome das tabelas- created e modified- post_id e user_id- username e password
Criando nosso bancoUtilizando o mysql, fazemos:
Para logar no banco: # mysql –u root – p
Criando o novo banco: mysql> create database aulacake;
Criando o meu usuario: mysql> grant all on aulacake.* to aulacake'@‘localhost' identified by 'biraviadin';
Para administrar o banco usaremos o phpmyadmin
phpMyAdmin
Sumario
Banco de DadosO que eh CakePHPInstalando o CakeModels, Controllers e ViewsMais ferramentas do CakePHPCake Bake – a magica do CakePHP
CakePHPCakePHP eh um framework para Aplicações WebFramework de Software:
compreende de um conjunto de classes implementadas em uma linguagem específica, usadas para auxiliar o desenvolvimento de software. (Wikipedia)
Começou em 2005Ultima versão estável 1.3.0Site: cakephp.org
Site do CakePHP
Arquitetura MVC
O CakePHP utiliza a arquitetura MVCBasicamente eh o seguinte:
Models: são os responsáveis por se comunicar com o banco, para salvar, modificar e deletar os dados
Controller: são eles quem mandam os models se comunicarem com o banco, recebe a resposta e manda para os views
Views: são eles quem mostram para os usuários o resultados das consultas pedidas ao banco
Sumario
Banco de DadosO que eh CakePHPInstalando o CakeModels, Controllers e ViewsMais ferramentas do CakePHPCake Bake – a magica do CakePHP
Baixando o CakePHP
Para baixar o Cake basta ir no site e baixar a ultima versao
Você vai escolher entre tar.gz (834KB) e o zip (1.3MB), dah na msm
Descompacte-o no seu diretório webMude o nome da pasta e acesse ela no seu
browserEx: http://pahnois/~2005100955/aulacake
Primeira visao do site
Possivel Erro
O cake pode dar um erro quando usado com o modulo userdir do apache
Se a sua url for desse tipo: http://meusite/~eu/appdocake/
eh possível que o site não abra. Para corrigir o erro devemos modificar um arquivo oculto chamado .htaccess localizado na que vc descompactou.
Modificando o .htacessFaça a seguinte modificacao no arquivo:
<IfModule mod_rewrite.c> RewriteEngine on RewriteBase /~eu/appdocake RewriteRule ^$ app/webroot/ [L] RewriteRule (.*) app/webroot/$1 [L]</IfModule>
Faça a mesma modificação no arquivo app/webroot/.htaccess
Core + APPNa pasta que vc descompactou
encontraremos as subpastas: app – eh onde fica o seu site cake – eh o coração (core) do cake plugins – plugins para facilitar ainda mais vendors – não sei e nem quero saber por enquanto
O core contem as informações vitais das suas apps. Por isso não cheguem perto se não sabem o que estão fazendo.
Um core pode ter varias apps
Os 3 warnings de start
Quando vc abre o seu site vai ver um exemplo pronto jah, com o padrao do cakephp
Verá também possíveis mensagens em amarelo, são elas:
Please change the value of 'Security.salt‘ Your tmp directory is not writable Your database configuration file is NOT present
Security SaltNo arquivo app/config/core.php,
possivelmente na linha 165, terá: Configure::write('Security.salt', 'DYhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');
O Security Salt serve para a geração de Hashes, sempre que precisar gerar um, o cake vai pegar o valor dessa string
Pode usar qualquer string, contanto que não seja facilmente adivinhada
Isso eh utilizado por exemplo, na criação do hash da senhas de usuários do site
Diretorio tmp
O diretório tmp da sua app, deve ser writableSe ele ainda não estiver, basta usar o
comando chmod:
chmod -R 777 app/tmp
Configuracao do BancoPor ultimo, devemos configurar o bancoEdite o arquivo app/config/database.php.default
var $default = array(
'driver' => 'mysql',
'persistent' => false,
'host' => ‘pahnois',
'login' => ‘aulacake',
'password' => ‘biraviadin',
'database' => ‘aulacake',
'prefix' => '', );
Renomeie o arquivo para database.php
Modulo mod_rewrite
Para que o cakephp funcione o modulo rewrite do apache deve estar habilitado
Voce pode usar o comando apache2ctl -M para saber se o modulo esta sendo usado
Procure na resposta do comando a linha: rewrite_module (shared)
Sumario
Banco de DadosO que eh CakePHPInstalando o CakeModels, Controllers e ViewsMais ferramentas do CakePHPCake Bake – a magica do CakePHP
ModelsVamos então criar os nossos modelsPor convenção cada tabela no banco terá um
model correspondente e o nome do model será o nome da tabela no singular
Para criar um model, crie um arquivo app/models/<nomedatabela>.php
Todos os models são classes em php e herdam da classe AppModel
Vamos criar o model da tabela post no próximo slide
Model de PostArquivo app/models/post.php
<?php
class Post extends AppModel {
var $name = 'Post';
}
?>
ControllersVamos então criar os nossos controllersPor convenção cada tabela terá um controller
correspondente e o nome do controller será o nome da tabela no plural + controller
Para criar um controller, crie um arquivo app/controllers/<nomedatabela>_controller.php
Todos os controllers são classes em php e herdam da classe AppController
Vamos criar o controller da tabela post no próximo slide
Controller de PostArquivo app/models/post_controller.php
<?php
class PostsController extends AppController {
var $name = 'Posts';
}
?>
Metodos
Todo controller eh composto de métodos, esses métodos são as funções da classe
Cada método pode estar relacionado a algum view
Os métodos são chamados também de actions
Os metodos mais comuns são: index, add, view e delete
Action IndexArquivo app/models/post_controller.php
<?php
class PostsController extends AppController {
var $name = 'Posts';
function index() {
$this->set('posts', $this->Post->find('all'));
}
}
?>
Metodos jah prontosNo arquivo app/models/controller.php temos
todos os metodos prontos pra vc, ou seja, não enconste lah
Todos os outros controller herdam de AppController, e AppController herda tudo de Controller
Métodos mais comuns: set redirect paginate requestAction
Temos também os métodos que aparentam ser de controllers, mas na verdade são de models
Metodos de Controllersset
cria uma variável para o seu view $this->set( ‘bira’, ‘viadin’) cria uma variavel $bira cujo valor eh viadin
paginate serve para fazer paginação dos dados recebidos do model,
serah visto mais a frente
requestAction chama um action de qualquer controller e recebe o
retorno dele $dado =$this->requestAction(‘/comments/primeiro’) joga o retorno do metodo ‘primeiro’ do controller
‘comments’ na variavel $dado
Metodos de Modelsfind ($type, $params)
pede ao banco os dados do Model os valores de $type pode ser:
‘first’ - retorna apenas o primeiro resultado encontrado
‘count’ - retorna a quantidade de resultados encontrados
‘all’ - retorna todos os resultados
‘list’ - retorna todos os resultados em uma pequena lista
‘neighbors’ - retorna o resultado anterior e o proximo do pesquisado
$params vai ser um array com as opcoes da buscaarray( 'conditions' => array('Model.field' => $valor),
'fields' => array('Model.field1', ‘Model.field2’),
'order' => array('Model.created', 'Model.field3 DESC'),
'limit' => n )
Outros metodos de ModelsfindAllBy<campo> ( ‘valor’ )findBy<campo> ( ‘valor’ )query ( ‘SELECT * FROM post;’ )read ( ‘nome’ , $valor )create ( )save ( $array )saveAll ( $arrays )delete ( $id )deleteAll ( $conditions )
ViewsOs views ficam localizados na pasta app/views/Dentro dessa pasta existem subpastas, cada
controller terá uma subpasta com seu nomePor convenção a pasta será igual o nome da
tabela do banco no pluralCada view será um arquivo .ctp dentro da pasta
do controller, e deverá ter um action criado no controller
Se voce criou a function index no controller do post, agora vamos criar o view index.ctp em app/views/posts
View IndexArquivo app/views/posts/index.ctp
<pre>
<?php
print_r($posts)
?>
</pre>
Entre no site para ver o resultado: http://pahnois/~2005100955/aulacake/posts/index/
Url do Cakehttp://www.inf.ufes.br/~mssoares/suportao/posts/view/17
site minhaApp Action
Controller Parametros
Adicionando DadosColoque o código abaixo no controller do post
function add() {
if (!empty($this->data)) {
if ($this->Post->save($this->data)) {
$this->Session->setFlash(‘Seu Post foi salvo.');
$this->redirect (array('action' => 'index'));
}
}
}
Adicionando DadosCrie o view add.ctp
<h1>Add Post</h1>
<?php
echo $form->create('Post');
echo $form->input('title');
echo $form->input('body', array('rows' => '3'));
echo $form->end(‘Salvar Post');
?>
Sumario
Banco de DadosO que eh CakePHPInstalando o CakeModels, Controllers e ViewsMais ferramentas do CakePHPCake Bake – a magica do CakePHP
HelpersO nome já diz tudo, estão aqui para ajudarOs helpers padrões estao na pasta
cake/libs/views/helpers/ ajax paginator cache RSS form session html text js time javascript xml number
Helper FormCriando um formulario:echo $form->create('Post');
Substitui o código html<form id="PostAddForm" method="post" action="/aulacake/posts/add">
Fechando um formulárioecho $form->end(‘Salvar');
Substitui o código html<div class="submit"><input type="submit" value=“Salvar" /></div></form>
Helper Forminput ( $coluna , array $options )
echo $form->input('body', array('rows' => '5'));
Dependendo do tipo da coluna o cake ajeita o formulário para vc
string text boolean, tinyint(1) checkbox text textarea password password date dia mes ano selects datetime dia mes ano hora minuto selects time hora minuto selects
Helper Forminput ( $coluna , array $options ) Os valores para o array $options pode ser:
array(
'type' => 'file‘,
'options' => array(1,2,3,4,5),
'label' => 'The User Alias‘,
'default'=>'Sugar‘,
'rows' => '5', 'cols' => '5‘,
'empty' => '(choose one)'
)
Helper Forminput ( $coluna , array $options ) Os valores para o array $options pode ser:
array(
'type' => 'file‘,
'options' => array(1,2,3,4,5),
'label' => 'The User Alias‘,
'default'=>'Sugar‘,
'rows' => '5', 'cols' => '5‘,
'empty' => '(choose one)'
)
Helper HtmlCSS
echo $html->css('cake.generic');
Substitui o código html<link rel="stylesheet" type="text/css" href="/aulacake/css/cake.generic.css" />
Normalmente essa echo fica no arquivo, cake/libs/views/default.ctp
Copie esse arquivo para app/views/layout/Nesse arquivo fica o layout da sua aplicação,
o layout eh a parte que não muda no seu site
Helper HtmlImage
echo $html->image("recipes/6.jpg", array( "alt" => "Brownies", 'url' => ‘/recipes/view/6’ ));
Substitui o código html<a href="/recipes/view/6"> <img src="/img/recipes/6.jpg" alt="Brownies" /> </a>
Imageecho $html->link('Enter', '/pages/home', array('class'=>'button','target'=>'_blank'))
Substitui o código html<a href="/pages/home" class="button" target="_blank">Enter</a>
Helper HtmlOutros métodos do helper do html
charset docType meta style tag div para script url
Helper RSSAntes de mais nada, vc deve adicionar uma
linha em app/config/routes.phpRouter::parseExtensions('rss');
Adicione em app/controllers/posts_controller.phpvar $components = array('RequestHandler');
Modifique o método index de posts:function index(){
if( $this->RequestHandler->isRss() ){ $posts = $this->Post->find('all', array('order' => 'Post.created DESC')); $this->set(compact('posts')); $this->set('channel',array('title'=>'Aula de Cake - Posts'));} else { $this->set('posts', $this->Post->find('all'));}
}
Helper RSS
Helper TimeDeixa um formato date time mais bonito:
nice ( $date ) Tue, Jan 1st 2008, 19:25 niceShort ( $date ) Jan 1st 2008, 19:25
Today, 19:25 timeAgoInWords($date) on 21/01/08
3 months, 3 weeks, 2 days ago 7 minutes ago 2 seconds ago
Vc pode mudar o padrao dessas funcoes em cake/libs/views/helpers/time.php
O recomendado eh que vc salve esse helper na app e modifique lah
Data ValidationUma coisa que vai te ajudar no cake eh validar os
dados antes de add algoA validação eh tratada nos Models, abra o model
do post e ponha o código:var $validate = array(
'title' => array(
'aplhanumeric' => array(
'rule' => array('alphanumeric'),
'message' => 'O titulo soh pode ter numeros e letras’ ), ),
'body' => array(
'notEmpty' => array(
'rule' => array('notEmpty'),
'message' => 'Nao deixe o corpo do post em branco’ ), ),
);
Testando a Validation
Tipos de ValidationVc pode colocar expressões regulares na
validação, mas para facilitar sua vida o cake jah tem algumas prontas:
alphaNumeric extension between file blank ip boolean isUnique cc minLength comparison notEmpty date phone decimal postal email url equalTo
Sumario
Banco de DadosO que eh CakePHPInstalando o CakeModels, Controllers e ViewsMais ferramentas do CakePHPCake Bake – a magica do CakePHP
Preparar o Cake BakePrimeiro temos que alterar a variável de
ambiente PATH, para ela achar o caminho do console e do php
Console eh onde fica o executável cakecake bake eh o camando que vai fazer tudo
por vc$ PATH=$PATH:/home/2005100955/aulacake/cake/console/
$ export PATH
Agora vamos botar o bolo no forno
Bakeando o siteNo terminal, entre na pasta app
$ cd ~/pastaweb/aulacake/app/
Rode o comando:
$ cake bake
Escolha a opção M de modelFaça a mesma coisa para os tres modelsDepois faça para controllers e views
Bakeando o site
Agora acesse o siteTudo esta pronto seguindo um padrão do
cakephpVc pode alterar o padrão do seu jeito, assim vc
acaba de bakear o site e jah tah tudo pronto
Sumario
Banco de DadosO que eh CakePHPInstalando o CakeModels, Controllers e ViewsMais ferramentas do CakePHPCake Bake – a magica do CakePHP
ComponentsOs components provêm varias funcionalidades
que são usadas normalmenteOs components padrões estão na pasta
cake/libs/views/components/ acl auth cookie email requesthandler security session
Components AuthA primeira coisa a ser fazer eh ativar o
componente no controller:var $components = array('Auth');
Para ativar em todos os controllers, basta adicionar essa linha em AppController
Agora todo o seu site esta bloqueado para quem não esta logado
Entao vamos fazer a tela de login
Components AuthNo controller User, crie os dois actions:
login function login () { }
logoutfunction logout (){
$this->redirect($this->Auth->logout());
}
Agora crie o view de loginOBS: logout não precisará de um view
Components AuthArquivo app/views/users/logint.ctp
<?php
echo $session->flash('auth');
echo $form->create('User', array('action' => 'login'));
echo $form->input('username');
echo $form->input('password');
echo $form->end('Login');
?>
Components AuthMas e se eu não quiser que todo o meu site
seja bloqueado para não usersColoque no controller que não queira ser
bloqueado a função beforeFilterDentro de allow coloque as actions que serão
permitidas a visitantesExemplo em app/controllers/users_controller.php
function beforeFilter() {
$this->Auth->allow('add');
}
Por ultimo: RotasNo arquivo app/config/routes.php voce pode
remodelar a url do site
Router::connect( '/logar', array('controller' => ‘users', 'action' => 'login') );
Router::connect( '/Comentarios/*', array('controller' => ‘comments', 'action' => ‘index') );
Router::connect( '/Postados/:action/*', array('controller' => ‘posts') );