Zend Framework - PHPSP - 2009

3.180 visualizações

Publicada em

Slides para a palestra realizada no I ENCONTRO DO PHPSP em fevereiro de 2009.

Publicada em: Tecnologia
0 comentários
6 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
3.180
No SlideShare
0
A partir de incorporações
0
Número de incorporações
136
Ações
Compartilhamentos
0
Downloads
176
Comentários
0
Gostaram
6
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Zend Framework - PHPSP - 2009

  1. 1.     I ENCONTRO DO PHPSP Zend Framework Edgar Ferreira da Silva Fev/2009
  2. 2.     Quem?  Eng. De Software  6 anos de várias experiências em desenvolvimento  Cientista da Computação  Entusiasta do PHP  Criador e mantenedor do ManjaPHP.com.br
  3. 3.     Objetivo  Discutir a arquitetura do Zend Framework  Demonstrar o uso alguns componentes  Discutir boas práticas com o ZF
  4. 4.     Framework?  Frameworks são softwares ou partes que provêem soluções genéricas e concisas ao escopo definido.  Framework para banco de dados:  Propel  Doctrine  Framework para comércio eletônico:  Magento
  5. 5.     É um novo conceito? Email Data BD Imagem Login Validação Lógica de  Negócio Personalizada
  6. 6.     Uma metamorfose Lógica de  Negócio Personalizada EmailImagem Login Data Validação BD
  7. 7.     Quais suas vantagens?  Utilização de boas práticas de desenvolvimento  Testes Unitários  Design Patterns  Documentação  Oferece bom suporte a evolução e a extensão do próprio framework  Oferece interfaces concisas  Extender ou modificar com muita cautela.
  8. 8.     Zend Framework  Escrito em PHP5  Orientado á Objetos  Utiliza a metodologia MVC  Licenciado como Open Source  Tocado pela Zend
  9. 9.     Entendendo e extendendo Models, Views e Controllers
  10. 10.     Model  É uma camada onde se reúnem as classes que: cuidam do acesso correto das informações  Reúne em si toda a lógica de negócio  Deve receber os dados, validar, e decidir o que fazer com esses dados
  11. 11.     Zend_Db ou Zend_Model ?  Zend_Model não existe!  O Zend_Db provê uma camada de abstração de banco de dados que, dependendo como for escrito, poderão ser chamados como models se aplicar os conceitos do slide anterior  Exemplo: Posso escrever meus models utilizando o Zend_Db_Table, implementando as regras de negócio nas tabelas criadas
  12. 12.     Zend_Db_Select  Uma classe que representa os selects de uma query no banco de dados  Abstrai a escrita de SQL  Os resultados são obtidos como é feito no PHP (método fetch da PDO ou *_fetch_*) podendo ser especificado como parâmetro a forma do fetch
  13. 13.     Zend_Db_Select $sel = new Zend_Db_Select($db); $query = $sel->from('usuarios') ->query(); while ($r = $query->fetch()) { echo $r['username']; }
  14. 14.     Zend_Db_Select $query = $db->select() ->from('usuarios') ->where('id > ?', 0) ->query(); while ($r = $query->fetch()) { echo $r['username']; }
  15. 15.     Zend_Db_Table  Abstrai uma tabela como sendo um objeto  Indicamos qual tabela a classe pertence e qual a chave primária  Possui métodos padrões para inserir, atualizar, consultar e apagar registros da tabela  Os resultados obtidos podem ser Zend_Db_Table_Row, Zend_Db_Table_Rowset ou personalizado, podendo ser um fetch comum
  16. 16.     Zend_Db_Table class Usuario extends Zend_Db_Table_Abstract { protected $_name = 'usuario'; protected $_primary = 'id'; public function insert() { /** faz algo personalizado **/ } public function buscarAtivos() { /** */ } }
  17. 17.     Usando $usuario = new Usuario(); $result = $usuario->fetchAll(); foreach ($result as $row) { echo $row->username; } $result = $usuario->find(1); $result = $usuario->buscarAtivos();
  18. 18.     Views HTML, Helpers e Zend_Form
  19. 19.     Views  A View é a camada responsável pela visualização das informações  Consiste de comandos HTML, XML, ou o que for a saída  PHP pode ser misturado, mas apenas para visualização, ou seja, não processe nada nas views  Pode ser segmentada em vários arquivos
  20. 20.     Uma view nada especial <form action="" method="post"> <dl> <dt><label for="txtUsername">Username</label> </dt> <dd> <input type="text" name="txtUsername" value="<?php echo $this->username ?>" /> </dd> <dt><label for="txtSenha">Senha</label></dt> <dd> <input type="password" name="txtSenha" /> </dd> </dl> <input type="submit" value="Enviar"/> </form>
  21. 21.     Helpers  São componentes que são disponibilizado para facilitar a montagem das views  Poupa tempo, é conciso, e oferece muita facilidade para quem for mexer na view  Você pode escrever seu próprio helper, para isso basta usar a interface Zend_View_Helper_Interface ou extender o Zend_View_Helper_Abstract
  22. 22.     Uma view com helpers <form action="" method="post"> <dl> <dt><?php echo $this->formLabel('txtUsername', 'Username', array()); ?></dt> <dd><?php echo $this->formText('txtUsername', $this->username, array()); ?></dd> <dt><?php echo $this->formLabel('txtSenha', 'Senha', array()); ?></dt> <dd><?php echo $this->formPassword('txtSenha', '', array()); ?></dd> </dl> <?php echo $this->formSubmit('submit', 'Enviar', array()); ?> </form>
  23. 23.     Partial ou PartialLoop Helper  Partial são helpers que permite você inserir um trecho de uma view em outra view  O Partial inclui apenas uma view uma vez  O PartialLoop inclui várias vezes, dependendo do parâmetro passado  Muito útil para o detalhe de um relatório
  24. 24.     Partial  O index.phtml <h1>Teste</h1> <?= $this->partial('index/frase.phtml', array('variavel' => 'Um partial', 'foo' => $bar)); ?>  O frase.phtml <?= $this->partial('index/frase.phtml', array('variavel' => 'Um partial', 'foo' => $bar)); ?>
  25. 25.     Resultado
  26. 26.     PartialLoop  O index.phtml <ul> <?= $this->partialLoop( 'index/lista.phtml', array(array('item' => 'arroz'), array('item' => 'pão') )); ?> </ul>  A lista.phtml <li><?= $this->item ?></li>
  27. 27.     Resultado
  28. 28.     Zend_Form  É um componente direcionado para montar um formulário  Dispõe de validações e filtragem dos dados  Pode ser criado a partir de um arquivo de configuração, ou via codificação
  29. 29.     Uma view com Zend_Form [development] login.action = "" login.method = "post" ; username login.elements.txtUsername.type = "text" login.elements.txtUsername.options.label = "Username"
  30. 30.     (continuação) ; senha login.elements.txtSenha.type = "password" login.elements.txtSenha.options.label = "Senha" ; submit login.elements.enviar.type = "submit" login.elements.enviar.options.label = "Enviar"
  31. 31.     Uma view com Zend_Form <?php $configForms = new Zend_Config_Ini( APPLICATION_PATH . '/config/forms.ini', 'development'); $form = new Zend_Form($configForms->login); echo $form; ?>
  32. 32.     Requisições atendidas em 1 min Simples Helpers Zend_Form 0 100 200 300 400 500 600 700 800 900 1000
  33. 33.     Controllers Zend_Controller_Front Zend_Controller_Request Zend_Controller_Router Zend_Controller_Dispatcher Zend_Controller_Action
  34. 34.     Zend_Controller_Front  Componente que implementa o design pattern FrontController  Responsável por instanciar o request, router, dispatcher e actions  Neste ponto a orientação á objeto começa a ser executada
  35. 35.     Zend_Controller_Front
  36. 36.     Zend_Controller_Request  Armazena as informações recebidas da requisição, como qual módulo, qual controller, qual action  Armazena as variáveis recebidas da requisição: GPCSE  Você pode armazenar parâmetros, que pode ser passado a outros componentes (na mesma requisição)
  37. 37.     Zend_Controller_Router  Partindo do request, é capaz de estabelecer rotas, ou melhor, mapear módulos, controllers e actions para serem dispachados e variáveis que devem ser preenchidas $route = new Zend_Controller_Router_Route( 'archive/:year', array( 'year' => 2006, 'controller' => 'archive', 'action' => 'show' ) );
  38. 38.     Zend_Controller_Dispatcher ● Dispara uma requisição recebendo informações do Zend_Controller_Request
  39. 39.     Zend_Controller_Action  Componente que todos os controllers desenvolvidos devem extender  É um conjunto de ações, que são mapeadas pela URL e estão presentes no objeto de request  Interage com views e models  Onde são escritos o preDispacther() e o postDispatcher()
  40. 40.     Exemplo de um controller <?php class IndexController extends Zend_Controller_Action { public function indexAction () $user = new Usuario(); $resultado = $a->find(1); $this->view->nome = $resultado->nome; } }
  41. 41.     Estrutura de Diretórios - application - config - controllers - models - views - scripts - controller - library - Zend - public
  42. 42.     Configuração da aplicação bootstrap.php Zend_Registry Zend_Config
  43. 43.     bootstrap.php  Dentro da pasta da aplicação  Responsável pela configuração inicial do framework e inicializações  Útil para iniciar componentes que serão utilizados em toda a aplicação  Não deve disparar processamentos dos contollers.
  44. 44.     Zend_Registry  Componente que pode armazenar valores  Acessado estaticamente, pode oferecer acesso a qualquer variável entre classes e funções diferentes.  Um uso de variáveis globais mais elegante  Uso muito simples:  Zend_Registry::get('foo');  Zend_Registry::set('foo', $bar);
  45. 45.     Zend_Config  Possibilita a configuração dos formatos:  Ini  Xml  Array  Possibilidade de extender o Zend_Config:  Yml  Implementa o Countable e o Iterator
  46. 46.     Zend_Config  O array passa a ser objeto  Perda de performance  A mudança para outra fonte de configuração se torna fácil e transparente
  47. 47.     Zend_Config_Ini  Utiliza arquivos .ini como fonte de configurações  Possibilita a divisão de seções  Possibilita uma seção herdar valores de outra, alterando apenas os valores que interessam  É um formato antigo e comum, o que pode facilitar para algumas pessoas acostumadas em fuçar no computador
  48. 48.     Zend_Config_Ini [development] login.action = "" login.method = "post" [production : development] login.action = "/prod/login"
  49. 49.     Zend_Config_Xml  Utiliza arquivos .xml como fonte de configurações  Possibilita uma seção herdar valores de outra, alterando apenas os valores que interessam  É um formato mais estruturado, que traz clareza sobre a organização das informações  É consideravelmente custoso.
  50. 50.     O xml <?xml version="1.0"?> <configdata> <development> <login> <action></action> <method>post</method> </login> </development> <production extends="development"> <login> <action>/prod/login</action> </login> </production> </configdata>
  51. 51.     Autenticação Zend_Auth e Zend_Acl
  52. 52.     Zend_Auth = Autenticação  O processo de autenticação é definido por identificar algo ou alguém que requer o acesso a algum local ou recurso  Exemplo do mundo real:  Ao chegar no seu trabalho, você é identificado como “Fulano – O Funcionário”.  Ao entrar em um hospital, você pode ser identificado como “Cicrano – O Paciente”
  53. 53.     Zend_Auth  Provê diversos adaptadores para acesso a diversos tipos de fontes de dados:  LDAP  DB  HTTP  OpenID  Ou você pode escrever o seu  Sugestão: Zend_Auth_Adapter_Txt (;P)
  54. 54.     Minha tabela de usuários  Nome da tabela: Usuários  Campos:  id: serial  username: varchar(25)  senha: char(32);
  55. 55.     Zend_Auth com DbTable $authAdapter = new Zend_Auth_Adapter_DbTable( $db, 'usuarios', 'username', 'senha'); Zend_Registry::set('authAdapter', $authAdapter);
  56. 56.     Autenticando com o Zend_Auth if ($this->_request->isPost()) { $db = Zend_Registry::get('db'); $authAdapter = new Zend_Auth_Adapter_DbTable( $db, 'usuarios', 'username', 'senha', 'md5(?)'); $authAdapter->setIdentity($username); $authAdapter->setCredential($senha); $resultado = $authAdapter->authenticate();
  57. 57.     Autenticando com o Zend_Auth if ($resultado->isValid()) { $auth = Zend_Auth::getInstance(); $storage = $auth->getStorage(); //importante //armazena a identidade para resgate mais //tarde $storage->write( $authAdapter->getResultRowObject( null, 'senha')); $this->_redirect('/'); }
  58. 58.     Está autenticado? $auth = Zend_Auth::getInstance(); if ($this->_request->getActionName() != 'login' && $auth->hasIdentity() == false) { $this->_redirect('/index/login'); }
  59. 59.     Zend_Acl = Autorização  O Zend_Auth identifica.  O Zend_Acl permite ou não o acesso  Tem permissão para visualizar?  Tem permissão para criar?  Tem permissão para editar?  Tem permissão para apagar?
  60. 60.     Zend_Acl  Zend_Acl_Role define o que ou quem pode quer acessar algo (grupo do usuario)  Admin  Operador  Convidado  Zend_Acl_Resource define o que pode pode ser acessado (actions)  Cadastrar  Deletar
  61. 61.     Zend_Acl_Role $acl = new Zend_Acl(); $acl->addRole(new Zend_Acl_Role('admin')); $acl->addRole(new Zend_Acl_Role('guest')) $acl->add(new Zend_Acl_Resource('index')); $acl->add(new Zend_Acl_Resource('sempermissao')); $acl->allow('admin', 'index', array()); $acl->allow('guest', 'sempermissao', array()); if(!$acl->isAllowed( $auth->getIdentity()->grupo, $actionName)) { $this->_redirect('/index/sempermissao'); }
  62. 62.     Testes Zend_Test
  63. 63.     Testes Unitários  São testes que escrevemos para testar uma funcionalidade de um método ou função  Escrevemos, em geral, uma única vez, e só modificamos se for prevista a mudança  Entre seus benefícios podemos citar:  Garante a evolução sem alterar comportamentos  Aumenta o bem-estar da equipe (ninguém quebra funcionalidade de outra pessoa)
  64. 64.     PHPUnit  Um framework para escrita de testes unitários  Anda lado a lado com a evolução do PHP  Provê relatórios com cobertura de código (xDebug)
  65. 65.     Testes Sistêmicos  Podemos considerar rusticamente os testes sistêmicos como um conjunto de testes unitários  Testam um conjunto de funcionalidades como um todo  Análogo á: entre no sistema, digite vários valores e verifica o resultado.  Selenium como plugin do PHPUnit
  66. 66.     Zend_Test  Um componente do framework que possibilita testar algumas funcionalidades sem a necessidade do Selenium  É possível testar formatações valores de entrada, um texto em uma página de retorno, uma formatação css, etc  Utiliza o mesmo bootstrap.php para carregar a aplicação
  67. 67.     Internalization e Globalization Zend_Locale e Zend_Translate
  68. 68.     Globalization  Identifica o local e as peculiaridades do local  Zend_Locale  Provê uma informação aos diversos componentes utilizados no G10n
  69. 69.     Um local  Um local ou uma cultura são identificados por uma combinação de abreviatura:  pt_BR  en_US  au  A primeira abreviatura refere-se a linguagem  A segunda abreviatura refere-se ao local
  70. 70.     Zend_Locale e os demais Zend*  Registrando o Zend_Locale com o Zend_Registry::set('Zend_Locale', $locale); a maioria dos componentes preparados para trabalhar com locais diferentes estarão automaticamente utilizando o $locale configurado  O locale pode ser setado no código ou usar a auto-detecção pela ordem:  Browser do usuário e sistema.
  71. 71.     Zend_Locale e os demais Zend*  Alguns componentes comuns para trabalhar com as diferênças:  Zend_Currency  Zend_Measure_Weight  Zend_Measure_Length  Zend_Date  Zend_Translate
  72. 72.     Intercionalization  Refere-se a tradução do software, sendo acessível em diversas línguas  Utiliza-se o Zend_Translate  O Zend_Locale identifica o local da tradução
  73. 73.     Zend_Translate  Resumidamente: procura uma string que foi indicada para ser traduzida na fonte de tradução  Se encontrada, retorna a tradução  Se não encontrada, retorna a string original  A fonte de tradução pode ser em diversos formatos  Array, Gettext, Xml, Tmf, etc.
  74. 74.     O processo  Primeiro se escreve e implementa o software  Depois de pronto, ele será traduzido  Serão geradas uma fonte de tradução para cada cultura (língua + local)  As fontes são traduzidas, processadas e incluídas no software
  75. 75.     Um problema com o ZF  O ZF suporta internacionalização de suas mensagens  Basta incluir na fonte de tradução  O problema é que algumas fontes de tradução podem gerar um esqueleto das strings que terão de ser traduzidas (uma simples busca por qualquer string entre _() ou ->translate(), simplesmente o ZF não coloca strings, e sim variáveis.
  76. 76.     Uma possível solução  Extender o adaptador de tradução que você estiver usando e reescrever os métodos que são usados para retornar a tradução.  Verificar se a string está traduzida  Se estiver, retorne a tradução  Se não, adiciona a fonte de tradução e retorne a string original  Aplicável se utilizar testes unitários com boa cobertura do código
  77. 77.     Integração com o Google Zend_Gdata
  78. 78.     A grande idéia  O Google é uma empresa promissora?  O Google consegue inserir (impor) produtos com mais facilidade?  Se não pode com ele, junte-se á ele.
  79. 79.     Serviços oferecidos  Integração com:  Blogs  Calendars  Picasa  Spreadsheets  Google Apps  A comunicação é em Atom ou Rss  Porém, como o componente nem precisa se preocupar com isso
  80. 80.     Como é o acesso  Para acesso de algumas informações ou serviços é necessário uma autenticação  Para as aplicações web, não há necessidade de armazenamento de usuário e senha  Apenas um token é armazenado  Traz muita confiança aos usuários, ou não.
  81. 81.     E agora?  Dúvidas?  Críticas?  Sugestões?  Mágoas?
  82. 82.     Fontes  Informações Técnicas  http://framework.zend.com  Imagens  Thanks Google!!!
  83. 83.     Obrigado Edgar Ferreira da Silva http://www.edgarfs.com.br http://www.manjaphp.com.br contato@edgarfs.com.br Grupo PHPSP http://www.phpsp.org.br

×