View
1.877
Download
4
Category
Preview:
DESCRIPTION
The Battle for the best PHP framework! Presentation took place at FISL - Free and Open Source Software International Forum.
Citation preview
PHPFrameWARks
Palestrantes: Leonardo ThomasMarcelo CuriMárcio AlbuquerqueSandro Franco
26/06/2009
O que é um framework?
Framework
Conjunto de classes
Funcionalidade específica
Dita o fluxo de controle da aplicação
Framework
O Framework!
Framework COMPLETO para desenvolvimento de aplicações
Última versão estável: 1.8.4
PHP 5.x
Instalação e Configuração
Baixar o pacote
Cria-se uma estrutura de diretórios (zf.sh)
Configurar o bootstrap
Configurar o application.ini
Configurar o .conf (opcional)
ESTE é o Framework!
Framework para desenvolvimento RÁPIDO em PHP
Última versão estável: 1.2.3.8166
PHP 4.x e 5.x
Instalação e Configuração
Download do arquivo no site do CakePHP
Descompactar o arquivo
Estrutura de diretório pré-estruturada
“Convenção sobre configuração”
Simples configuração do webserver
Vocês ainda não viram O Framework!
Framework RÁPIDO para desenvolvimento RÁPIDO em PHP, mas MUITO RÁPIDO MESMO!
Última versão estável: 1.7.1
PHP 4.x e 5.x
Instalação e Configuração
Baixa um arquivo compactado de 893kb
Descompacta na pasta www do seu servidor web
Simples e RÁPIDA configuração do webserver
Framework de verdade é esse daqui!
Foco em aplicações robustas em contexto empresarial
Última versão estável: 1.2.8
PHP 5.2.x
Instalação e Configuração
Três opções de instalação:
Sandbox: para usuários que desejam testar o symfony
pear: $php pear install symfony/symfony
Download do pacote (recomendada)
Criar o projeto e aplicação
Configurar o webserver
DRY
eXtreme Programming
Arquitetura
Arquitetura
Arquitetura
Arquitetura
Arquitetura
Conceito de Framework
Conjunto de classes
Funcionalidade específica
Dita o fluxo de controle da aplicação
Acesso a Dados e ORM
ORM próprio
Implementa Active Record
(Dados → Class → Objeto)
Exemplo:
Tabela Usuarios:
id, nome, sobrenome, login, senha
Acesso a Dados e ORM
Acesso a Dados e ORM
Disponibiliza o padrão Active Record modificado
Leitura fácil
É bonito de se ver...
Acesso a Dados e ORM// SELECT nome FROM usuarios u
// JOIN telefones t ON t.usuario_id = u.id
$this->db->select('nome');
$this->db->from('usuarios u');
$this->db->join('telefones t', 't.usuario_id = u.id');
$query = $this->db->get();
// SELECT nome FROM usuarios WHERE id = $id LIMIT 10, 20
$this->db->select('nome')->
from('usuarios')->
where('id', $id)->
limit(10, 20);
$query = $this->db->get();
Acesso a Dados e ORM
Também trabalha com Active Record
PDO para acesso a dados
Acesso a Dados e ORMclass Usuarios extends Zend_Db_Table
{
protected $_name = "usuarios";
}
// Controller
public function indexAction()
{
$usuarios = new Usuarios();
$this->view->usuarios = $usuarios->fetchAll();
}
Acesso a Dados e ORM
Camada de abstração:
1.0.x e 1.1.x => Creole
1.2.x => PDO
ORM:
Propel
Doctrine
Comandos:symfony propel:build-model
Acesso a Dados e ORMclass UsuarioPeer extends BaseUsuarioPeer{ public static function retrieveByLoginSenha($login, $senha) { $c = new Criteria(); $c->add(self::LOGIN, $login); $c->add(self::SENHA, $senha);
return self::doSelectOne($c); }}
class Usuario extends BaseUsuario{ public function getNomeCompleto() { return $this->nome . “ “ . $this->sobrenome; }}
Formulários e Validações
sfForm
sfFormPropel
sfFormDoctrine
sfValidator (sfValidatorDate, sfValidatorDateRange, sfValidatorEmail, sfValidatorNumber, sfValidatorInteger, sfValidatorString, sfCallbackValidator)
Comando
symfony propel:build-forms
Formulários e Validaçõesclass BaseUsuarioForm extends BaseFormPropel{ public function setup() { $this->setWidgets(array( 'nome' => new sfWidgetFormInput(), ));
$this->setValidators(array( 'nome' => new sfValidatorString( array('max_length' => 100, 'required' => true)), )); }
public function getModelName() { return 'Usuario'; }}
Formulários e Validações
$form = new UsuarioForm();$valores = $request->getParameter($form->getName());$arquivos = $request->getFiles($form->getName());
$form->bind($valores, $arquivos);if ($form->isValid()){ $usuario = $form->save(); // OU // $usuario = $form->getObject(); // $usuario->save();}
Formulários e Validações
Formulários e Validações
Formulários – Helpers que agilizam o desenvolvimento (Form, Ajax, Html...)
View .ctp (Cake Template Pages)
Validações – Fácil implementação nas classes Model da aplicação
Core validation rules
Date, e-mail, ip, cc, ...
Formulários e Validações
Formulários e Validações
Zend_Form
Validation
Zend_Form_Element_*
XSS e SQL Injection
Zend_Validation
Formulários e Validaçõesclass UsuarioForm extends Zend_Form{ public function __construct($options = null) { parent::__construct($options); $this->setName("Usuario");
$id = new Zend_Form_Element_Hidden("id");
$nome = new Zend_Form_Element_Text("nome"); $nome->setLabel("Nome") ->setRequired(true);
$submit = new Zend_Form_Element_Submit("enviar");
$this->addElements(array($id, $nome$submit)); }}
Formulários e Validações
Também possui helpers para tags html
Forms, input text, input hidden, ...
Validadores no controller
Validation rules no form: required, min_length, max_length, valid_email
Você também pode fazer o seu: métodos callback
Vejam como é fácil...
$rules['username'] = "required";$rules['password'] = "required";$rules['passconf'] = "required";$rules['email'] = "required";
$this->validation->set_rules($rules);
$fields['username'] = 'Username';$fields['password'] = 'Password';$fields['passconf'] = 'Password Confirmation';$fields['email'] = 'Email Address';
$this->validation->set_fields($fields);
if ($this->validation->run() == FALSE){
$this->load->view('myform');}else{
$this->load->view('formsuccess');}
Formulários e Validações
Cache
Tem o recurso nativo de cache, que armazena os dados em /system/cache
Ative o recurso de cache com a linha de comando no controller:
$this->output->cache(n);
//n é o tempo de cache em minutos
Permite database caching
Recurso embutido na classe Database
Cache
File → Armazenamento simples de arquivo. Possui vários parâmetros opcionais, mas funciona bem com os padrões;
APC → Alternative PHP Cache, framework de cahe livre, aberto e robusto que visa a otimização do código.
Cache
Xcache → Semelhante ao APC, deve ser compilado no PHP para sua melhor performance. Necessita de usuário e senha para funcionar corretamente.
MemCache → Sistema de cache de memória distribuída de alto desempenho, acesso rápido a resultados de consultas e armazenamento de dados armazenados em cache.
Cache
Configuração simples:
Configure::write('Cache.check', true), no core.php;
Utilizar um dos padrões de configuração disponíveis
Cache
Zend_Cache:
Backend
Arquivo
Banco de Dados
Memcache (memória)
APC
Xcache
...
Cache
Zend_Cache:
Frontend
Saída de Dados (Output)
Função
Classe
Página
...
Cache// Construção do objeto cache$cache = Zend_Cache::factory($frontendName, $backendName, $frontendOptions, $backendOptions);
// Exemplo de cache de Saídaif (!($cache->start('meu_cache'))){ echo ”Isso está em cache (“.time().”)“; $cache->end();}
echo “Isso NÃO está no cache”.time().”)”;
Cache
Symfony oferece um sistema de cache flexível, configurado através de arquivos YAML
Várias formar de armazenar o cache:
sfAPCCache, sfEAcceleratorCache, sfMemcacheCache, sfSQLiteCache, and sfXCacheCache
Permitir cache de uma ação, de uma página ou apenas partes de página
Aceita parâmetros
Cache#<appName>/config/settings.ymldev: .settings: cache: on
#<appName>/modules/<moduleName>/config/cache.ymllist: enabled: on with_layout: false # Default value lifetime: 86400 # Default value
// Removendo o cache$cacheManager = $this->getContext()->getViewCacheManager();$cacheManager->remove('usario/listar');$cacheManager->remove('usario/mostrar?id='.$user_id)
Segurança
Autenticação
Com o AuthComponent é possível retirar ou conceder permissões facilmente ao usuário.
Segurança
Autorização
Com o SecurityComponent é possível implementar algumas características muito poderosas da segurança.
Segurança
Configuração em arquivo YAML#<appName>/config/security.yml
all:
is_secure: on
credentials: [[ admin, gerente ], usuario]
sfUsersetAuthenticated()
isAuthenticated()
addCredential()
hasCredential()
Segurança
Zend_Acl
Papéis (Roles)
Recursos (Resources)
Zend_Auth
Banco de Dados
HTTP
LDAP
Digest
OpenID
Segurança$acl = new Zend_Acl();
$acl->addRole(new Zend_Acl_Role(“usuario_comum”)) ->addRole(new Zend_Acl_Role(“administrador”));
$acl->add(new Zend_Acl_Resource(“area_administrativa”));
$acl->allow(“administrador”, “area_administrativa”);$acl->deny(“usuario_comum”, “area_administrativa”);
$acl->isAllowed(“usuario_comum”, “area_administrativa”);
Segurança$auth = new Zend_Auth;
$adapter = new Zend_Db_Adapter_Pdo_Sqlite( array('dbname' => ':memory:') );
$resposta = $auth->authenticate($adapter);
if ($resposta->isValid()){ ...}
Segurança
Por decisão de projeto não embute recursos de autorização e autenticação.
Desabilita o array $_GET no controller$product_id = $this->uri->segment(3, 0);
Práticas para tornar a aplicação segura
Filtros xss, limpeza de dados antes da inclusão em banco, validação de dados
Localização e Internacionalização
Zend_Locale
Zend_Date
Zend_Currency
Zend_Measure_*
Localização e Internacionalização
Zend_Translate
Array
CSV
INI
Gettext
...
Localização e Internacionalização// l10n - Moedas$locale = new Zend_Locale(“pt_BR”);$moeda = new Zend_Currency();$moeda->toCurrency(1000.00);// Saída => R$1.000,00
// i18n$ingles = array(“Você conhece PHP?” => “Do you know PHP?”, “Sim” => “Yes”, “Não” => “No”);$tradutor = new Zend_Translate(“array”, $ingles, “en”);
$locale = new Zend_Locale(“en_US”);echo $tradutor->_(“Você conhece PHP?”);$resposta = $tradutor->_(“Sim”);
Localização e Internacionalização
User Culture: combinação do país e idioma do usuário
Alterando o User Culture do usuário$this->getUser()->setCulture('pt_BR');
Helpers => informações no formato correto (de acordo com o User Culture):
format_date, format_datetime, format_currency, format_number, etc
Helper I18N
Localização e Internacionalização// Texto a ser traduzidoecho __('Bem vindo ao nosso site')
# XML de tradução <appName>/i18n/messages.en.xml <?xml version="1.0" ?> <xliff version="1.0"> <file original="global" source-language="pt_BR" datatype="plaintext"> <body> <trans-unit id="1"> <source>Bem vindo ao nosso site</source> <target>Welcome to our website</target> </trans-unit> </body> </file> </xliff>
Localização e Internacionalização
Baixar ou fazer arquivo de tradução;
<APLICAÇÃO>/app/locale/pt_br
Configurar aqui:
Localização e Internacionalização
Mudança da linguagem a qualquer momento antes da mensagem, bootstrap, beforeFilter ou em request específico;
Tratar o erro:
Localização e Internacionalização
Facilita a construção de menus internacionalizados
Utiliza arquivos de linguagem para armazenar as traduções
Classe Language
Language helper
Documentação e Comunidade
Documentação COMPLETA
Quick Start
API
Guia de Referência
Comunidade ativa (as outras são passivas)
Contribuições => FRAMEWORK!!
Documentação e Comunidade
Documentação muito boa;
http://book.cakephp.org/
Comunidades ativas;
Google Groups
http://groups.google.com/group/cake-php?pli=1
http://bakery.cakephp.org/
IRC
#cakephp on irc.freenode.net
Documentação e Comunidade
Alguns Blogs
The Bakery
Mark Story
Ad7six
Teknoid
Mariano
CakeDC Team
Felix and Tim
GrumpyCanuck
Snook.ca
Documentação e Comunidade
Tutoriais
Blog
Wiki
Livros
Documentação e Comunidade
A documentação é bem resolvida. (Vem junto com o download do framework)
Wiki
Fórum
Livros
E mais...
Múltiplas aplicações
Informações de Benchmark
Template parser
Assistente de flexão gramatical
Scaffolding
E mais...
Testes unitários e funcionais
Vários ambientes
Configurações distintas
Web debug toolbar
Carga de dados (fixtures)
E mais...
Uso de partes do framework
Componentização
MUITO COMPLETO
Zend
E mais...
NADA !!!!!!
Quem aqui usa...
Cake PHP?
Code Igniter?
Symfony?
Zend Framework?
Conclusão
Conclusão
Similaridades
PHP 5.x
OO
MVC
ORM
Formulários e Validações
Cache
Internacionalização e Localização
Extensíveis
Conclusão
AUMENTO DE PRODUTIVIDADE
ConclusãoEscolha o framework que melhor
atende às necessidades do seu projeto!!!
CONTATOS
Leonardo Thomas
leonardo.santos@serpro.gov.br
Marcelo Curi
marcelo.cur-silva@serpro.gov.br
Márcio Albuquerque
marcio.albuquerque@serpro.gov.br
Sandro Franco
sandro.franco@serpro.gov.br
Recommended