CakePHP na pratica - suporte.inf.ufes.br · 5 Luis 1976 CSS 90 Novatec ... CakePHP eh um framework...

Post on 11-Nov-2018

228 views 0 download

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') );