PHP FrameWARks - FISL

2,064 views

Published on

The Battle for the best PHP framework! Presentation took place at FISL - Free and Open Source Software International Forum.

0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
2,064
On SlideShare
0
From Embeds
0
Number of Embeds
12
Actions
Shares
0
Downloads
59
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

PHP FrameWARks - FISL

  1. 2. PHP FrameWARks Palestrantes: Leonardo Thomas Marcelo Curi Márcio Albuquerque Sandro Franco 26/06/2009
  2. 3. O que é um framework?
  3. 4. Framework <ul><li>Conjunto de classes </li></ul><ul><li>Funcionalidade específica </li></ul><ul><li>Dita o fluxo de controle da aplicação </li></ul>
  4. 5. Framework
  5. 8. O Framework! <ul><li>Framework COMPLETO para desenvolvimento de aplicações </li></ul><ul><li>Última versão estável: 1.8.4 </li></ul><ul><li>PHP 5.x </li></ul>
  6. 9. Instalação e Configuração <ul><li>Baixar o pacote </li></ul><ul><li>Cria-se uma estrutura de diretórios (zf.sh) </li></ul><ul><li>Configurar o bootstrap </li></ul><ul><li>Configurar o application.ini </li></ul><ul><li>Configurar o .conf (opcional) </li></ul>
  7. 10. ESTE é o Framework! <ul><li>Framework para desenvolvimento RÁPIDO em PHP </li></ul><ul><li>Última versão estável: 1.2.3.8166 </li></ul><ul><li>PHP 4.x e 5.x </li></ul>
  8. 11. Instalação e Configuração <ul><li>Download do arquivo no site do CakePHP </li></ul><ul><li>Descompactar o arquivo </li></ul><ul><li>Estrutura de diretório pré-estruturada </li></ul><ul><li>“ Convenção sobre configuração” </li></ul><ul><li>Simples configuração do webserver </li></ul>
  9. 12. Vocês ainda não viram O Framework! <ul><li>Framework RÁPIDO para desenvolvimento RÁPIDO em PHP, mas MUITO RÁPIDO MESMO! </li></ul><ul><li>Última versão estável: 1.7.1 </li></ul><ul><li>PHP 4.x e 5.x </li></ul>
  10. 13. Instalação e Configuração <ul><li>Baixa um arquivo compactado de 893kb </li></ul><ul><li>Descompacta na pasta www do seu servidor web </li></ul><ul><li>Simples e RÁPIDA configuração do webserver </li></ul>
  11. 14. Framework de verdade é esse daqui! <ul><li>Foco em aplicações robustas em contexto empresarial </li></ul><ul><li>Última versão estável: 1.2.8 </li></ul><ul><li>PHP 5.2.x </li></ul>
  12. 15. Instalação e Configuração <ul><li>Três opções de instalação: </li></ul><ul><li>Sandbox: para usuários que desejam testar o symfony </li></ul><ul><li>pear: $php pear install symfony/symfony </li></ul><ul><li>Download do pacote (recomendada) </li></ul><ul><li>Criar o projeto e aplicação </li></ul><ul><li>Configurar o webserver </li></ul>
  13. 16. DRY e X treme P rogramming Arquitetura
  14. 17. Arquitetura
  15. 18. Arquitetura
  16. 19. Arquitetura
  17. 20. Arquitetura
  18. 21. Conceito de Framework <ul><li>Conjunto de classes </li></ul><ul><li>Funcionalidade específica </li></ul><ul><li>Dita o fluxo de controle da aplicação </li></ul>
  19. 22. Acesso a Dados e ORM <ul><li>ORM próprio </li></ul><ul><li>Implementa Active Record </li></ul><ul><li>(Dados -> Class -> Objeto) </li></ul><ul><li>Exemplo: </li></ul><ul><li>Tabela Usuarios: </li></ul><ul><li>id, nome, sobrenome, login, senha </li></ul>
  20. 23. Acesso a Dados e ORM
  21. 24. Acesso a Dados e ORM <ul><li>Disponibiliza o padrão Active Record modificado </li></ul><ul><li>Leitura fácil </li></ul><ul><li>É bonito de se ver... </li></ul>
  22. 25. 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() ;
  23. 26. Acesso a Dados e ORM <ul><li>Também trabalha com Active Record </li></ul><ul><li>PDO para acesso a dados </li></ul>
  24. 27. Acesso a Dados e ORM class Usuarios extends Zend_Db_Table { protected $_name = &quot;usuarios&quot;; } // Controller public function indexAction() { $usuarios = new Usuarios(); $this->view->usuarios = $usuarios->fetchAll(); }
  25. 28. Acesso a Dados e ORM <ul><li>Camada de abstração: </li></ul><ul><li>1.0.x e 1.1.x => Creole </li></ul><ul><li>1.2.x => PDO </li></ul><ul><li>ORM: </li></ul><ul><li>Propel </li></ul><ul><li>Doctrine </li></ul><ul><li>Comandos: </li></ul><ul><li>symfony propel:build-model </li></ul>
  26. 29. Acesso a Dados e ORM class 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; } }
  27. 30. Formulários e Validações <ul><li>sfForm </li></ul><ul><li>sfFormPropel </li></ul><ul><li>sfFormDoctrine </li></ul><ul><li>sfValidator (sfValidatorDate, sfValidatorDateRange, sfValidatorEmail, sfValidatorNumber, sfValidatorInteger, sfValidatorString, sfCallbackValidator) </li></ul><ul><li>Comando </li></ul><ul><li>symfony propel:build-forms </li></ul>
  28. 31. Formulários e Validações class 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'; } }
  29. 32. 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(); }
  30. 33. Formulários e Validações
  31. 34. Formulários e Validações <ul><li>Formulários – Helpers que agilizam o desenvolvimento (Form, Ajax, Html...) </li></ul><ul><li>View .ctp (Cake Template Pages) </li></ul><ul><li>Validações – Fácil implementação nas classes Model da aplicação </li></ul><ul><li>Core validation rules </li></ul><ul><li>Date, e-mail, ip, cc, ... </li></ul>
  32. 35. Formulários e Validações
  33. 36. Formulários e Validações <ul><li>Zend_Form </li></ul><ul><li>Validation </li></ul><ul><li>Zend_Form_Element_* </li></ul><ul><li>XSS e SQL Injection </li></ul><ul><li>Zend_Validation </li></ul>
  34. 37. Formulários e Validações class UsuarioForm extends Zend_Form { public function __construct($options = null) { parent::__construct($options); $this->setName(&quot;Usuario&quot;); $id = new Zend_Form_Element_Hidden(&quot;id&quot;); $nome = new Zend_Form_Element_Text(&quot;nome&quot;); $nome->setLabel(&quot;Nome&quot;) ->setRequired(true); $submit = new Zend_Form_Element_Submit(&quot;enviar&quot;); $this->addElements(array($id, $nome$submit)); } }
  35. 38. Formulários e Validações <ul><li>Também possui helpers para tags html </li></ul><ul><li>Forms, input text, input hidden, ... </li></ul><ul><li>Validadores no controller </li></ul><ul><li>Validation rules no form: required, min_length, max_length, valid_email </li></ul><ul><li>Você também pode fazer o seu: métodos callback </li></ul><ul><li>Vejam como é fácil... </li></ul>
  36. 39. Formulários e Validações $rules['username'] = &quot;required&quot;; $rules['password'] = &quot;required&quot;; $rules['passconf'] = &quot;required&quot;; $rules['email'] = &quot;required&quot;; $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'); }
  37. 40. Cache <ul><li>Tem o recurso nativo de cache, que armazena os dados em /system/cache </li></ul><ul><li>Ative o recurso de cache com a linha de comando no controller: </li></ul><ul><li>$this->output->cache( n ); </li></ul><ul><li>//n é o tempo de cache em minutos </li></ul><ul><li>Permite database caching </li></ul><ul><li>Recurso embutido na classe Database </li></ul>
  38. 41. Cache <ul><li>File -> Armazenamento simples de arquivo. Possui vários parâmetros opcionais, mas funciona bem com os padrões; </li></ul><ul><li>APC -> Alternative PHP Cache, framework de cahe livre, aberto e robusto que visa a otimização do código. </li></ul>
  39. 42. Cache <ul><li>Xcache -> Semelhante ao APC, deve ser compilado no PHP para sua melhor performance. Necessita de usuário e senha para funcionar corretamente. </li></ul><ul><li>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. </li></ul>
  40. 43. Cache <ul><li>Configuração simples: </li></ul><ul><li>Configure::write('Cache.check', true), no core.php; </li></ul><ul><li>Utilizar um dos padrões de configuração disponíveis </li></ul>
  41. 44. Cache <ul><li>Zend_Cache: </li></ul><ul><li>Backend </li></ul><ul><li>Arquivo </li></ul><ul><li>Banco de Dados </li></ul><ul><li>Memcache (memória) </li></ul><ul><li>APC </li></ul><ul><li>Xcache </li></ul><ul><li>... </li></ul>
  42. 45. Cache <ul><li>Zend_Cache: </li></ul><ul><li>Frontend </li></ul><ul><li>Saída de Dados ( Output ) </li></ul><ul><li>Função </li></ul><ul><li>Classe </li></ul><ul><li>Página </li></ul><ul><li>... </li></ul>
  43. 46. Cache // Construção do objeto cache $cache = Zend_Cache::factory($frontendName, $backendName, $frontendOptions, $backendOptions); // Exemplo de cache de Saída if (!($cache->start('meu_cache'))) { echo ”Isso está em cache (“.time().”)“; $cache->end(); } echo “Isso NÃO está no cache”.time().”)”;
  44. 47. Cache <ul><li>Symfony oferece um sistema de cache flexível, configurado através de arquivos YAML </li></ul><ul><li>Várias formar de armazenar o cache: </li></ul><ul><li>sfAPCCache, sfEAcceleratorCache, sfMemcacheCache, sfSQLiteCache, and sfXCacheCache </li></ul><ul><li>Permitir cache de uma ação, de uma página ou apenas partes de página </li></ul><ul><li>Aceita parâmetros </li></ul>
  45. 48. Cache #<appName>/config/settings.yml dev: .settings: cache: on #<appName>/modules/<moduleName>/config/cache.yml list: 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)
  46. 49. Segurança <ul><li>Autenticação </li></ul><ul><li>Com o AuthComponent é possível retirar ou conceder permissões facilmente ao usuário. </li></ul>
  47. 50. Segurança <ul><li>Autorização </li></ul><ul><li>Com o SecurityComponent é possível implementar algumas características muito poderosas da segurança. </li></ul>
  48. 51. Segurança <ul><li>Configuração em arquivo YAML </li></ul><ul><li>#<appName>/config/security.yml </li></ul><ul><li>all: </li></ul><ul><li>is_secure: on </li></ul><ul><li>credentials: [[ admin, gerente ], usuario] </li></ul><ul><li>sfUser </li></ul><ul><li>setAuthenticated() </li></ul><ul><li>isAuthenticated() </li></ul><ul><li>addCredential() </li></ul><ul><li>hasCredential() </li></ul>
  49. 52. Segurança <ul><li>Zend_Acl </li></ul><ul><li>Papéis ( Roles ) </li></ul><ul><li>Recursos ( Resources ) </li></ul><ul><li>Zend_Auth </li></ul><ul><li>Banco de Dados </li></ul><ul><li>HTTP </li></ul><ul><li>LDAP </li></ul><ul><li>Digest </li></ul><ul><li>OpenID </li></ul>
  50. 53. 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”);
  51. 54. Segurança $auth = new Zend_Auth; $adapter = new Zend_Db_Adapter_Pdo_Sqlite( array('dbname' => ':memory:') ); $resposta = $auth->authenticate($adapter); if ($resposta->isValid()) { ... }
  52. 55. Segurança <ul><li>Por decisão de projeto não embute recursos de autorização e autenticação. </li></ul><ul><li>Desabilita o array $_GET no controller </li></ul><ul><li>$product_id = $this->uri->segment(3, 0); </li></ul><ul><li>Práticas para tornar a aplicação segura </li></ul><ul><li>Filtros xss, limpeza de dados antes da inclusão em banco, validação de dados </li></ul>
  53. 56. Localização e Internacionalização <ul><li>Zend_Locale </li></ul><ul><li>Zend_Date </li></ul><ul><li>Zend_Currency </li></ul><ul><li>Zend_Measure_* </li></ul>
  54. 57. Localização e Internacionalização <ul><li>Zend_Translate </li></ul><ul><li>Array </li></ul><ul><li>CSV </li></ul><ul><li>INI </li></ul><ul><li>Gettext </li></ul><ul><li>... </li></ul>
  55. 58. 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”);
  56. 59. Localização e Internacionalização <ul><li>User Culture: combinação do país e idioma do usuário </li></ul><ul><li>Alterando o User Culture do usuário </li></ul><ul><li>$this->getUser()->setCulture('pt_BR'); </li></ul><ul><li>Helpers => informações no formato correto (de acordo com o User Culture): </li></ul><ul><li>format_date, format_datetime, format_currency, format_number, etc </li></ul><ul><li>Helper I18N </li></ul>
  57. 60. Localização e Internacionalização // Texto a ser traduzido echo __('Bem vindo ao nosso site') # XML de tradução <appName>/i18n/messages.en.xml <?xml version=&quot;1.0&quot; ?> <xliff version=&quot;1.0&quot;> <file original=&quot;global&quot; source-language=&quot;pt_BR&quot; datatype=&quot;plaintext&quot;> <body> <trans-unit id=&quot;1&quot;> <source>Bem vindo ao nosso site</source> <target>Welcome to our website</target> </trans-unit> </body> </file> </xliff>
  58. 61. Localização e Internacionalização <ul><li>Baixar ou fazer arquivo de tradução; </li></ul><ul><li><APLICAÇÃO>/app/locale/pt_br </li></ul><ul><li>Configurar aqui: </li></ul>
  59. 62. Localização e Internacionalização <ul><li>Mudança da linguagem a qualquer momento antes da mensagem, bootstrap, beforeFilter ou em request específico; </li></ul><ul><li>Tratar o erro: </li></ul>
  60. 63. Localização e Internacionalização <ul><li>Facilita a construção de menus internacionalizados </li></ul><ul><li>Utiliza arquivos de linguagem para armazenar as traduções </li></ul><ul><li>Classe Language </li></ul><ul><li>Language helper </li></ul>
  61. 64. Documentação e Comunidade <ul><li>Documentação COMPLETA </li></ul><ul><li>Quick Start </li></ul><ul><li>API </li></ul><ul><li>Guia de Referência </li></ul><ul><li>Comunidade ativa (as outras são passivas) </li></ul><ul><li>Contribuições => FRAMEWORK!! </li></ul>
  62. 65. Documentação e Comunidade <ul><li>Documentação muito boa; </li></ul><ul><li>http://book.cakephp.org/ </li></ul><ul><li>Comunidades ativas; </li></ul><ul><li>Google Groups </li></ul><ul><li>http://groups.google.com/group/cake-php?pli=1 </li></ul><ul><li>http://bakery.cakephp.org/ </li></ul><ul><li>IRC </li></ul><ul><li>#cakephp on irc.freenode.net </li></ul>
  63. 66. Documentação e Comunidade <ul><li>Alguns Blogs </li></ul><ul><li>The Bakery </li></ul><ul><li>Mark Story </li></ul><ul><li>Ad7six </li></ul><ul><li>Teknoid </li></ul><ul><li>Mariano </li></ul><ul><li>CakeDC Team </li></ul><ul><li>Felix and Tim </li></ul><ul><li>GrumpyCanuck </li></ul><ul><li>Snook.ca </li></ul>
  64. 67. Documentação e Comunidade <ul><li>Tutoriais </li></ul><ul><li>Blog </li></ul><ul><li>Wiki </li></ul><ul><li>Livros </li></ul>
  65. 68. Documentação e Comunidade <ul><li>A documentação é bem resolvida. (Vem junto com o download do framework) </li></ul><ul><li>Wiki </li></ul><ul><li>Fórum </li></ul><ul><li>Livros </li></ul>
  66. 69. E mais... <ul><li>Múltiplas aplicações </li></ul><ul><li>Informações de Benchmark </li></ul><ul><li>Template parser </li></ul><ul><li>Assistente de flexão gramatical </li></ul><ul><li>Scaffolding </li></ul>
  67. 70. E mais... <ul><li>Testes unitários e funcionais </li></ul><ul><li>Vários ambientes </li></ul><ul><li>Configurações distintas </li></ul><ul><li>Web debug toolbar </li></ul><ul><li>Carga de dados ( fixtures ) </li></ul>
  68. 71. E mais... <ul><li>Uso de partes do framework </li></ul><ul><li>Componentização </li></ul><ul><li>MUITO COMPLETO </li></ul><ul><li>Zend </li></ul>
  69. 72. E mais... <ul><li>NADA !!!!!! </li></ul>
  70. 73. Quem aqui usa... <ul><li>Cake PHP? </li></ul><ul><li>Code Igniter? </li></ul><ul><li>Symfony? </li></ul><ul><li>Zend Framework? </li></ul>
  71. 74. Conclusão
  72. 75. Conclusão <ul><li>Similaridades </li></ul><ul><li>PHP 5.x </li></ul><ul><li>OO </li></ul><ul><li>MVC </li></ul><ul><li>ORM </li></ul><ul><li>Formulários e Validações </li></ul><ul><li>Cache </li></ul><ul><li>Internacionalização e Localização </li></ul><ul><li>Extensíveis </li></ul>
  73. 76. Conclusão AUMENTO DE PRODUTIVIDADE
  74. 77. Conclusão Escolha o framework que melhor atende às necessidades do seu projeto!!!
  75. 78. CONTATOS <ul><li>Leonardo Thomas </li></ul><ul><li>[email_address] </li></ul><ul><li>Marcelo Curi </li></ul><ul><li>[email_address] </li></ul><ul><li>Márcio Albuquerque </li></ul><ul><li>[email_address] </li></ul><ul><li>Sandro Franco </li></ul><ul><li>[email_address] </li></ul>

×