Escolar Documentos
Profissional Documentos
Cultura Documentos
O Framework
CakePHP
Regis Pires Magalhes
regispiresmag@gmail.com
Framework
Duane O'Brien
David Golding
Histrico
Caractersticas
Caractersticas
Ativo
Comunidade amigvel e extensa
Licena bastante flexvel (MIT)
Compatibilidade com PHP 4 e PHP 5
Gerao de cdigo
Componentes de E-mail, Cookie, Segurana,
Sesses, Manipulao de Requisies, etc.
Lista de controle de acessos (ACL) flexvel
Cache flexvel
Internacionalizao e Localizao
Facilidade de disponibilizao
Atualizaes freqentes.
Arquitetura MVC
Arquitetura MVC
MVC Vantagens
Instalando o CakePHP
http://cakephp.org/downloads
cd \xampplite\htdocs\projeto-cake
Bake
Welcome to CakePHP v1.2.0.6311 beta Console
-------------------------------------------------------------App : app
Path: C:\xampplite\htdocs\locadora\app
-------------------------------------------------------------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)
Estrutura de Diretrios
Estrutura de Diretrios
Configurando o CakePHP
Teste a aplicao.
Algumas observaes aparecero e devero
ser seguidas:
Configure::write('Security.salt',
'DyhG93b0qyJfIxfs2guVoUubWwvniR2G0FgaC9mi');
Renomear o arquivo
config/database.php.default para
config/database.php e configur-lo para acessar
driver
Esta string ser adicionada como prefixo no nome de todas tabelas de sua base de
dados.Se suas tabelas no possuem prefixo, deixe esta string vazia.
port (opcional)
Indica qual caractere definido ser usado para enviar indicaes SQL ao servidor.
schema
<?php
class DATABASE_CONFIG {
var $default = array(
'driver' => 'mysql',
'persistent' => true,
'host' => 'localhost',
'port' => '',
'login' => 'root',
'password' => '',
'database' => 'prog_web',
'schema' => '',
'prefix' => '',
'encoding' => 'utf8'
);
// ...
}
?>
<?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'
);
// ...
}
?>
Ol, Mundo!!!
app/controllers/hello_controller.php
<?php
class HelloController extends AppController {
var $uses = array();
var $autoRender = false;
}
?>
function index() {
echo 'Ol, Mundo!!!';
}
Ol, Mundo!!!
app/controllers/hello_controller.php
<?php
class HelloController extends AppController {
var $uses = array();
}
?>
function index() {
}
app/views/hello/index.ctp
<p>Ol, Mundo!!!</p>
<?php
class HelloController extends AppController {
var $uses = array();
}
?>
function index() {
$this->set('nome','Regis');
}
app/views/hello/index.ctp
Mtodo set
$this->set('cor','azul');
$this->set('colecoes',$this->Colecao->findAll());
Layouts
Layout padro:
cake/libs/view/layouts/default.ctp
Layout personalizado:
app\views\layouts\default.ctp
<html>
<head>
<title>Aplicao Exemplo</title>
</head>
<body>
<h1>Minha Aplicao</h1>
<?php echo $content_for_layout; ?>
</body>
</html>
Configurao
app/config/core.php
debug
Paginao
Configurao no controller:
Paginao
Uso:
$filmes = $this->paginate();
$this->set('filmes', $filmes);
Ou:
$filmes = $this->paginate('Filme');
$this->set('filmes', $filmes);
Paginao
Na viso:
<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>
Paginao
Na viso:
Paginao
<?php
echo $paginator->counter(array(
'format' => 'Pgina %page% de %pages%,
mostrando %current% registros de um total
de %count%. Registro inicial: %start%.
Registro final: %end%'
));
?>
Validao
<?php
class User extends AppModel {
var $name = 'User';
var $validate = array(
'login' => 'alphaNumeric',
'email' => 'email',
'born' => 'date'
);
}
?>
Validao
<?php
class Genero extends AppModel {
var $name = 'Genero';
var $useTable = 'generos';
var $displayField = 'descricao';
var $validate = array('descricao' => VALID_NOT_EMPTY);
}
?>
//...
Validao
<?php
class Filme extends AppModel {
var $name = 'Filme';
var $useTable = 'filmes';
var $validate = array(
'titulo' => array(
array('rule' => array('minLength',1),
'message'=>'No pode ficar em branco'),
array('rule' => array('maxLength',50),
'message'=>'Texto muito longo.')),
'sinopse' => array('rule' => array('minLength',1)),
'ano_lancamento' => array('numeric')
);
//...
}
?>
Validao
<?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
)
);
}
?>
Validao
alphaNumeric
between
blank
cc
comparison
date
decimal
email
equalTo
extension
ip
minLength
maxLength
money
numeric
phone
postal
range
url
Associaes
$belongsTo
$hasOne
$hasMany
$hasAndBelongsToMany
Associaes
<?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'
));
}
?>
Associaes
<?php
class Filme extends AppModel {
var $name = 'Filme';
var $useTable = 'filmes';
// ...
var $belongsTo = array(
'Genero' => array('className' => 'Genero',
'foreignKey' => 'genero_id',
'conditions' => '',
'fields' => '',
'order' => ''
)
);
}
?>
Associaes
No modelo (genero.php):
var $displayField = 'descricao';
$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'));
Rotas
Definio de Rotas
Arquivo:
/app/config/routes.php
Exemplo:
<?php
Router::connect('/', array('controller' =>
'filmes', 'action' => 'index'));
Router::connect('/pages/*',array('controller' =>
'pages', 'action' => 'display'));
?>
Flash
$this->Session->setFlash('OK');
Na view:
<?php
if ($session->check('Message.flash')):
$session->flash();
endif;
?>
Logging
Usar:
Verificar em:
app/tmp/logs/error.log
app/tmp/logs/debug.log
Nveis de log:
LOG_ERROR
LOG_DEBUG
Model
Model
app/models/pessoa.php
<?php
class Pessoa extends AppModel {
}
?>
Personalizao de plurais
/app/config/inflections.php
Exemplo:
Controller
app/controllers/pessoas_controller.php
<?php
class PessoasController extends AppController {
var $scaffold;
}
?>
View
Layouts
Helpers de Viso
$html->link
<?php echo $html->link('Filmes',
array('controller'=>'filmes',
'action'=>'index')); ?>
<?php echo $html->link('Gneros',
array('controller'=>'generos',
'action'=>'index')); ?>
Compartilhamento de Cdigo
AppController /app/app_controller.php
AppHelper /app/app_helper.php
AppModel /app/app_model.php
Controller - Callbacks
E o que so callbacks?
Controller - Callbacks
Model Callbacks
beforeFind()
afterFind()
beforeValidate()
beforeSave()
afterSave()
beforeDelete()
afterDelete()
Autenticao
Autenticao
AppController
<?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 =
"Usurio ou senha invlido(s)";
$this->Auth->authError =
'Acesso no autorizado.';
}
Autenticao
<?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());
}
}
?>
Autenticao
<div class="login">
<h2>Digite usurio 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>
Autenticao
No Layout
Item de Menu:
Mensagem:
<?php
if ($session->check('Message.auth')) {
$session->flash('auth');
}
?>
Permisses de Acesso
Usurios ou Grupos
Exemplo: admin, usuario, convidado
Controladores, aes
Exemplo: Filme, Genero
AROs
$aro = new Aro();
$aro->create($user_id, $parent_id, $alias);
$aro->create(0, null, 'Presidents');
$aro->create(0, null, 'Artists');
$aro->create(
$aro->create(
$aro->create(
$aro->create(
1,
2,
3,
4,
null,
null,
null,
null,
'Bob Marley' );
'Jimi Hendrix');
'George Washington');
'Abraham Lincoln');
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');
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');
ACL
$this->Acl->check($aro, $aco, $action = '*');
<?php
class AppController extends Controller{
var $components = array('Acl');
}
?>
function checkAccess($aco){
$access = $this->Acl->check($this->Session->
read('user_alias'), $aco, $action = "*");
if ($access === false) {
echo "access denied";
exit;
} else {
echo "access allowed";
exit;
}
}
ACL
cd app
..\cake\console\cake schema run create DbAcl
Referncias
The Cookbook
API
http://bakery.cakephp.org
Site oficial
http://bakery.cakephp.org
CakeForge
http://api.cakephp.org/1.2
Bakery
http://book.cakephp.org
http://www.cakephp.org
Grupo Google