O documento resume um seminário sobre o framework PHP cakePHP. Apresenta brevemente a história e objetivos do framework, seu funcionamento baseado em MVC, características como validação de dados e geração de código, e passos para instalação e criação de um blog simples.
2. Seminário cakePHP
2011/2012
Start!
• O CakePHP teve seu desenvolvimento
iniciado por Michal Tartarynowicz em 2005.
• Baseado nas ideias do framework Ruby on
Rails, e a principal meta é ser um framework
estruturado que permita programadores PHP
de todos os níveis desenvolverem aplicações
web robustas e sem perda de flexibilidade.
• http://www.cakephp.org
• Cookbook -
http://book.cakephp.org/2.0/pt/index.html
Arlindo Santos 09-05-12 2
4. Seminário cakePHP
2011/2012
Características
• Baseado em arquitetura MVC
– Facilita o desenvolvimento e manutenção de aplicações;
– Melhor organização do código-fonte;
– Facilita o trabalho em equipe;
– Abstrai o programador de tarefas repetitivas e complexas.
• Licença Flexível
– O CakePHP é licenciado sob a licença MIT, muito mais flexível que a GPL e a própria
BSD.
• Compatibilidade com PHP4 e PHP5
– Como a maioria dos servidores web usam a versão 4.0 do PHP esta é uma vantagem
significativa do CakePHP em relação a outros frameworks PHP, como é o caso do
Symfony ou do Zend Framework.
• Validação de campos
– O CakePHP possui formas de validar dados digitados pelos utilizadores em
formulários ou URLs. Isso ajuda o programador a evitar dados incorretos ou
problemas de segurança.
• Scaffolding
– É um recurso que analisa uma tabela na base de dados e cria automaticamente
botões e formulários para as operações básicas de inserção, alteração, e eliminação
de dados.
Arlindo Santos 09-05-12 4
5. Seminário cakePHP
2011/2012
Características
• Listas de controle de acesso (ACL)
– Permite a gestão de algo (geralmente utilizadores)
– Permite gerir algo que é desejado (aplicações, por exemplo)
– Não é autenticação de utilizadores
• Componentes para:
– Segurança;
– Sessões;
– Tratamento de requisições
– Permite o desenvolvimento de componentes específicos adicionais ao ambiente
• Helpers
– Existem helpers para auxiliar na geração de HTML, formulários, JavaScript e AJAX.
Novos helpers podem ser criados ou reutilizados em outros projetos.
• Geração de código-fonte
– O CakePHP apresenta uma ferramenta chamada bake, que permite a criação de
diretórios da aplicação, além da geração de código CRUD. CRUD é um acrônimo
para Create, Retrieve, Update e Delete.
Arlindo Santos 09-05-12 5
6. Seminário cakePHP
2011/2012
Requisitos
• O CakePHP pode ser utilizado em qualquer
plataforma operacional com suporte ao
interpretador PHP;
• Servidor Web Apache;
• PHP 4.3.2 ou superior;
• Editor PHP de sua preferência;
• DB Designer ou outra ferramenta de modelagem
de dados;
• Uma base de dados:
– A versão estável do framework suporta MySQL,
PostgreSQL e camada de abstração de banco de
dados chamada ADOdb.
Arlindo Santos 09-05-12 6
7. Seminário cakePHP
2011/2012
Organização dos directórios
• /app – Diretório onde ficará a aplicação desenvolvida
– /config – Arquivos de configuração, DB, etc..
– /controllers – Controladores da aplicação
– /index.php – Página inicial da aplicação
– /models – Modelos da aplicação
– /plugins – Plugins que podem ser adicionados
– /tmp – Usado para cache e logs
– /vendors – Bibliotecas de terceiros
– /views – Visões da aplicação
• /elements – Elementos, pedaços da visão
• /errors – Páginas de erros customizadas
• /helpers – Ajudantes para gerar código
• /layouts – Arquivos de layout
• /pages – Visões estáticas
– /webroot – DocumentRoot para aplicação
• /css – Arquivos css
• /files – Arquivos comuns
• /img – Imagens
• /js – Javascripts (AJAX)
• /lib
– /cake – Código-fonte do cake
• /plugins
• /vendors – Bibliotecas de terceiros
• index.php – Página inicial do framework
Arlindo Santos 09-05-12 7
8. Seminário cakePHP
2011/2012
Passos para a instalação
• Descarregar a versão estável da
ferramenta em
http://www.cakephp.org/downloads
• Descompactar/extrair no diretório raiz do
seu servidor web
• Renomear o diretório para um nome mais
usual/curto (cake)
• Pronto, já está funcionando:
http://localhost/cake
Arlindo Santos 09-05-12 8
9. Seminário cakePHP
2011/2012
Instalação
• http://book.cakephp.org/2.0/pt/installation.html
• Permissões
– O diretório /app/tmp com direitos de escrita
pelo utilizador.
– Executar http://localhost/cake
Arlindo Santos 09-05-12 9
10. Seminário cakePHP
2011/2012
Instalação
pp/Config/core.php
imezone
• date_default_timezone_set('UTC');
ecurity.salt - texto aleatório utilizado para os
metodos de criptografia de segurança.
• Alterar para um valor diferente.
ecurity.cipherSeed - Uma sequência númerica
aleatória (somente dígitos) usada para
Arlindo Santos 09-05-12 10
11. Seminário cakePHP
2011/2012
Instalação
• Activação do mod::rewrite.
– http://
book.cakephp.org/2.0/pt/installation/advanced-installation.html
– mod_rewrite é um módulo do apache que é responsável
pela reescrita de urls, e tormas estas mais amigáveis para
o utilizador
– Para que a dica deste post funcione é necessário que este
módulo esteja ativo no servidor apache.
– Associado a este conceito existe um ficheiro chamado
.htaccess onde ´´e possível escrever as reguintes regras:
RewriteEngine On
RewriteCond %{SCRIPT_FILENAME} !-f
RewriteCond %{SCRIPT_FILENAME} !-d
RewriteRule ^(.*)$ index.php?page=$1
Arlindo Santos 09-05-12 11
12. Seminário cakePHP
2011/2012
Base de dados: considerações
• Todas as tabelas devem estar no plural
– Ex: Utilizadores, Comentarios
• A chave primária para todas as tabelas deve ser o campo “id”
– Preferencialmente estes campos devem ter algum mecanismo de
geração de códigos-fonte, como a opção auto_increment do MySQL.
• Chave estrangeira no singular
– Para utilizar chave estrangeira, esta deve possuir nome da tabela no
singular acrescido do campo “id”. Exemplo: utilizador_id.
• Relacionamento de n-n deve ser organizado em ordem alfabética
– Primeiro nome no singular acrescido de um “_” e o nome da segunda
tabela no plural. Exemplo: livro_utilizadores.
Arlindo Santos 09-05-12 12
13. Seminário cakePHP
2011/2012
Criar um site - BLOG
• http://book.cakephp.org/2.0/pt/getting-started.html
• MySQL
– Criar uma base de dados “blog”
– Executar o seguinte código SQL no mysqladmin:
-- Primeiro, criamos nossa tabela de posts
CREATE TABLE posts (
id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(50),
body TEXT,
created DATETIME DEFAULT NULL,
modified DATETIME DEFAULT NULL
);
-- Agora inserimos alguns posts para testar
INSERT INTO posts (title, body, created)
VALUES ('The title', 'This is the post body.', NOW());
INSERT INTO posts (title, body, created)
VALUES ('A title once again', 'And the post body follows.', NOW());
INSERT INTO posts (title, body, created)
VALUES ('Title strikes back', 'This is really exciting! Not.', NOW());
Arlindo Santos 09-05-12 13
14. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Configuração da base de dados
– /app/Config/database.php.default.
• Copie este ficheiro no mesmo diretório renomeando-o
para database.php.
• Configure com os dados corretos.
public $default = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'port' => '',
'login' => ‘?',
'password' => ‘?',
'database' => ‘blog',
'schema' => '',
'prefix' => '',
'encoding' => ''
);
Veja o que aconteceu ao seu site! Não tem erros!
Arlindo Santos 09-05-12 14
15. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Crie um Model Post
– /app/Model/Post.php
• Insira o seguinte código:
class Post extends AppModel {
public $name = 'Post';
}
• A nomenclatura da classe segue uma convenção
que é muito importante no CakePHP.
– Se o model é Post, o CakePHP pode deduz que será
usado um PostsController, e que manipulará os
dados de uma tabela da base de dados chamada
posts.
Arlindo Santos 09-05-12 15
16. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Crie um Controller Post
– /app/Controller/PostsController.php
• Insira o seguinte código:
class PostsController extends AppController {
public $helpers = array ('Html','Form');
public $name = 'Posts';
function index() {
$this->set('posts', $this->Post->find('all'));
}
}
• Definindo a função index() em nosso PostsController, os
utilizadores podem aceder visitando o endereço
www.exemplo.com/posts/index
• De maneira semelhante, se definirmos um método
chamado foobar() dentro do controller, os utilizadores deveriam ser
capazes de acede-lo pelo endereço www.exemplo.com/posts/foobar
Arlindo Santos 09-05-12 16
17. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Crie um View Post
– Os ficheiros de view do Cake são
armazenados na pasta /app/View dentro de
uma pasta com o mesmo nome do controller.
– O nome do ficheiro deve ter o mesmo nome
da action.
Arlindo Santos 09-05-12 17
18. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Crie um View Post
– Insira o seguinte código:
<!-- File: /app/View/Posts/index.ctp -->
<h1>Posts do Blog</h1>
<table>
<tr>
<th>Id</th>
<th>Título</th>
<th>Data de Criação</th>
</tr>
<!-- Aqui é onde nós percorremos nossa matriz $posts, imprimindo
as informações dos posts -->
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo $post['Post']['id']; ?></td>
<td>
<?php echo $this->Html->link($post['Post']['title'],
array('controller' => 'posts', 'action' => 'view', $post['Post']['id'])); ?>
</td>
<td><?php echo $post['Post']['created']; ?></td>
</tr>
<?php endforeach; ?>
</table>
Arlindo Santos 09-05-12 18
19. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Testar:
– http://localhost/cake/posts
• Clicar no links…
– http://localhost/cake/posts/view/1
– Dá erro, pois… resolver…
– Está à espera que existe uma action view, e
como consequência, uma página view.ctp.
Também é enviado um parâmetro com o valor 1.
• Importante reconhecer esta sintaxe:
– url/{action}/{param1}/{param2}/{param3}/…
Arlindo Santos 09-05-12 19
20. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Acrescentar o código no controller
public function view($id = null) {
$this->Post->id = $id;
$this->set('post', $this->Post->read());
}
• Criar um novo view
<!-- File: /app/View/Posts/view.ctp -->
<h1><?php echo $post['Post']['title']?></h1>
<p><small>Created: <?php echo $post['Post']['created']?></small></p>
<p><?php echo $post['Post']['body']?></p>
Arlindo Santos 09-05-12 20
21. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Testar:
– http://localhost/cake/posts
Arlindo Santos 09-05-12 21
22. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Adiciona Posts
– Controller
• Insira o seguinte código:
…
public function add() {
if ($this->request->is('post')) {
if ($this->Post->save($this->request->data)) {
$this->Session->setFlash('Your post has been saved.');
$this->redirect(array('action' => 'index'));
}
}
}
– $this->request->data – Dados enviados pelo formulário.
Arlindo Santos 09-05-12 22
23. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Adiciona Posts
– Controller:
• Para trabalhar com sessões o componente
SessionComponent e o helper SessionHelper são
necessários.
• O componente Session já inclui tudo!
<?php
class PostsController extends AppController {
public $components = array('Session');
…
Arlindo Santos 09-05-12 23
24. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Crie um View Post - Adicionar um POST
– /app/View/Post/add.php
• Insira o seguinte código:
<!-- File: /app/View/Posts/add.ctp -->
<h1>Add Post</h1>
<?php
//<form id="PostAddForm" method="post" action="/posts/add">
echo $this->Form->create('Post');
echo $this->Form->input('title');
echo $this->Form->input('body', array('rows' => '3'));
echo $this->Form->end('Save Post');
?>
– /app/View/Post/index.ctp
• Insira o seguinte código:
<?php echo $this->Html->link('Add Post', array('controller' => 'posts', 'action' => 'add')); ?>
Arlindo Santos 09-05-12 24
25. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Validação dos dados submetidos pelo utilizador
– Rules
• http://book.cakephp.org/1.3/view/1143/Data-Validation
• http://book.cakephp.org/2.0/en/models/data-validation.html
– Model
• Insira o seguinte código:
class Post extends AppModel {
public $name = 'Post';
public $validate = array(
'title' => array(
'rule' => 'notEmpty'
),
'body' => array(
'rule' => 'notEmpty'
)
);
}
Arlindo Santos 09-05-12 25
26. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Editar Post
– Controller
function edit($id = null) {
$this->Post->id = $id;
if ($this->request->is('get')) {
$this->request->data = $this->Post->read();
} else {
if ($this->Post->save($this->request->data)) {
$this->Session->setFlash('Your post has been updated.');
$this->redirect(array('action' => 'index'));
}
}
}
Arlindo Santos 09-05-12 26
27. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Crie um View Post – Editar um Post
– /app/View/Post/edit.php
• Insira o seguinte código:
<!-- File: /app/View/Posts/edit.ctp -->
<h1>Edit Post</h1>
<?php
echo $this->Form->create('Post', array('action' => 'edit'));
echo $this->Form->input('title');
echo $this->Form->input('body', array('rows' => '3'));
echo $this->Form->input('id', array('type' => 'hidden')); //muito
importante!!!
echo $this->Form->end('Save Post');
?>
Arlindo Santos 09-05-12 27
28. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Editar a View Post para permitir que utilizador realize as ações:
<!-- File: /app/View/Posts/index.ctp (links para edição adicionados) -->
<h1>Blog posts</h1>
<p><?php echo $this->Html->link("Add Post", array('action' => 'add')); ?></p>
<table>
<tr>
<th>Id</th>
<th>Title</th>
<th>Action</th>
<th>Created</th>
</tr>
<!-- Aqui é onde nós percorremos nossa matriz $posts, imprimindo
as informações dos posts -->
<?php foreach ($posts as $post): ?>
<tr>
<td><?php echo $post['Post']['id']; ?></td>
<td>
<?php echo $this->Html->link($post['Post']['title'], array('action' => 'view', $post['Post']['id']));?>
</td>
<td>
<?php echo $this->Form->postLink(
'Delete',
array('action' => 'delete', $post['Post']['id']),
array('confirm' => 'Are you sure?')
)?>
<?php echo $this->Html->link('Edit', array('action' => 'edit', $post['Post']['id']));?>
</td>
<td><?php echo $post['Post']['created']; ?></td>
</tr>
<?php endforeach; ?>
</table>
Arlindo Santos 09-05-12 28
29. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Apagar o Post
– Controller:
function delete($id) {
if (!$this->request->is('post')) {
throw new MethodNotAllowedException();
}
if ($this->Post->delete($id)) {
$this->Session->setFlash('The post with id: ' . $id . ' has been
deleted.');
$this->redirect(array('action' => 'index'));
}
}
– Se o utilizador tentar apagar usando uma requisição do tipo
GET, é criada uma excepção – questões de segurança!!!
– O helper FormHelper fornece o método postLink()
Arlindo Santos 09-05-12 29
30. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Router (redirecionamento)
– /app/Config/routes.php
Router::connect('/', array('controller' => 'posts', 'action' =>
'index'));
– Tornar a URL mais amigável para o utilizador
– Neste exemplo, retira-se a necessidade de
adicionar “posts” na URL
Arlindo Santos 09-05-12 30
31. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Testar:
– http://localhost/cake
– E agora … questões?
• E se eu pretender fazer ….
Arlindo Santos 09-05-12 31
32. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Exercícios:
1. Criar uma página “Olá mundo” quando o utilizador digita a
URL “http://localhost/cake/welcome/
4. Posts:
• Permitir que o utilizador possa introduzir uma tag associadas a cada
post.
• Permitir que o utilizador possa introduzir várias tags associadas a
cada post.
Nota:
1. Planear
2. Model
3. Controller
4. View
Arlindo Santos 09-05-12 32
33. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Autenticação
http://book.cakephp.org/2.0/pt/tutorials-and-examples/blog
Arlindo Santos 09-05-12 33
34. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Autenticação
– E se o BLOG permite múltiplos utilizadores?
– Então:
• Criar a tabela
• Criar o model
– Validação.
• Criar o Controller
– Componente Auth
– Método beforefilter: será chamado antes de cada ação.
– É possível editar o AppController!
– Definir regras de autotrização
• Criar os Views
Arlindo Santos 09-05-12 34
35. Seminário cakePHP
2011/2012
Criar um site - BLOG
<?php
// app/Controller/UsersController.php
class UsersController extends AppController {
public function beforeFilter() {
parent::beforeFilter();
$this->Auth->allow('register', 'login'); // Letting users register themselves
}
public function login() {
if ($this->Auth->login()) {
$this->Session->write('user', $this->Auth->user());
$this->redirect($this->Auth->redirect());
} else {
$this->Session->setFlash(__('Invalid username or password, try again'));
}
}
public function logout() {
$this->Session->destroy('user');
$this->redirect($this->Auth->logout());
}
public function register() {
if ($this->request->is('post')) {
$this->User->create();
if ($this->User->save($this->request->data)) {
$this->Session->setFlash(__('The user has been saved'));
$this->redirect(array('controller' =>'posts', 'action' => 'index'));
} else {
$this->Session->setFlash(__('The user could not be saved. Please, try again.'));
}
}
}
}
?>
Arlindo Santos 09-05-12 35
36. Seminário cakePHP
2011/2012
Criar um site - BLOG
<?php
// app/Model/User.php
App::uses('AuthComponent', 'Controller/Component');
class User extends AppModel {
public $name = 'User';
public $validate = array(
'username' => array(
'required' => array(
'rule' => array('notEmpty'),
'message' => 'A username is required'
)
),
'password' => array(
'required' => array(
'rule' => array('notEmpty'),
'message' => 'A password is required'
)
),
'role' => array(
'valid' => array(
'rule' => array('inList', array('admin', 'author')),
'message' => 'Please enter a valid role',
'allowEmpty' => false
)
)
);
public function beforeSave() {
if (isset($this->data[$this->alias]['password'])) {
$this->data[$this->alias]['password'] = AuthComponent::password($this->data[$this->alias]['password']);
}
return true;
}
}
?>
Arlindo Santos 09-05-12 36
39. Seminário cakePHP
2011/2012
Criar um site - BLOG
<!-- app/View/Users/login.ctp -->
<div class="users form">
<?php echo $this->Session->flash('auth'); ?>
<?php echo $this->Form->create('User');?>
<fieldset>
<legend><?php echo __('Please enter your username and password'); ?></legend>
<?php
echo $this->Form->input('username');
echo $this->Form->input('password');
?>
</fieldset>
<?php echo $this->Form->end(__('Login'));?>
</div>
Arlindo Santos 09-05-12 39
40. Seminário cakePHP
2011/2012
Layouts
• Como alterar o layout?
– http://book.cakephp.org/2.0/en/views.html
– Temos:
• views – Já sabemos como funciona.
• elements
• layouts
• helpers
Arlindo Santos 09-05-12 40
41. Seminário cakePHP
2011/2012
Layouts
• Altera o layout
– /app/View/Layouts/default.ctp.
– É possível ter vários layouts e atribuir os títulos dinamicamente.
<?php
class UsersController extends AppController {
public function view_active() {
$this->set('title_for_layout', 'View Active Users');
$this->layout = 'default_small_ad';
}
public function view_image() {
$this->layout = 'image';
//output user image
}
}
Arlindo Santos 09-05-12 41
47. Seminário cakePHP
2011/2012
Criar um site - BLOG
• Exercícios:
1. Não permitir o registo duplicado de utilizadores
3. Cada utilizador poderá consultar informação sobre os outros
utilizadores
5. Alterar completamente o layout da página
Arlindo Santos 09-05-12 47