• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content

Loading…

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

Like this presentation? Why not share!

Zend Framework - PHPSP - 2009

on

  • 5,293 views

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

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

Statistics

Views

Total Views
5,293
Views on SlideShare
5,162
Embed Views
131

Actions

Likes
6
Downloads
173
Comments
0

7 Embeds 131

http://edgarfs.com.br 99
http://www.manjaphp.com.br 19
http://www.slideshare.net 9
http://iw2servers 1
http://localhost 1
http://www.health.medicbd.com 1
http://www.linkedin.com 1
More...

Accessibility

Categories

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Zend Framework - PHPSP - 2009 Zend Framework - PHPSP - 2009 Presentation Transcript

    • I ENCONTRO DO PHPSP Zend Framework Edgar Ferreira da Silva Fev/2009
    • 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
    • Objetivo
      • Discutir a arquitetura do Zend Framework
      • Demonstrar o uso alguns componentes
      • Discutir boas práticas com o ZF
    • 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
    • É um novo conceito? Lógica de Negócio Personalizada Email Data BD Imagem Login Validação
    • Uma metamorfose Lógica de Negócio Personalizada Email Imagem Login Data Validação BD
    • 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.
    • Zend Framework
      • Escrito em PHP5
      • Orientado á Objetos
      • Utiliza a metodologia MVC
      • Licenciado como Open Source
      • Tocado pela Zend
    • Entendendo e extendendo Models, Views e Controllers
    • 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
    • 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
    • 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
    • Zend_Db_Select
      • $sel = new Zend_Db_Select($db);
      • $query = $sel->from('usuarios')
      • ->query();
      • while ($r = $query->fetch()) {
      • echo $r['username'];
      • }
    • Zend_Db_Select
      • $query = $db->select()
      • ->from('usuarios')
      • ->where('id > ?', 0)
      • ->query();
      • while ($r = $query->fetch()) {
      • echo $r['username'];
      • }
    • 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
    • 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() { /** */ }
      • }
    • Usando
      • $usuario = new Usuario();
      • $result = $usuario->fetchAll();
      • foreach ($result as $row) {
      • echo $row->username;
      • }
      • $result = $usuario->find(1);
      • $result = $usuario->buscarAtivos();
    • Views HTML, Helpers e Zend_Form
    • 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
    • Uma view nada especial
      • <form action=&quot;&quot; method=&quot;post&quot;>
      • <dl>
      • <dt><label for=&quot;txtUsername&quot;>Username</label> </dt>
      • <dd>
      • <input type=&quot;text&quot; name=&quot;txtUsername&quot;
      • value=&quot;<?php echo $this->username ?>&quot; />
      • </dd>
      • <dt><label for=&quot;txtSenha&quot;>Senha</label></dt>
      • <dd>
      • <input type=&quot;password&quot; name=&quot;txtSenha&quot; />
      • </dd>
      • </dl>
      • <input type=&quot;submit&quot; value=&quot;Enviar&quot;/>
      • </form>
    • 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
    • Uma view com helpers
      • <form action=&quot;&quot; method=&quot;post&quot;>
      • <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>
    • 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
    • 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)); ?>
    • Resultado
    • 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>
    • Resultado
    • 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
    • Uma view com Zend_Form
      • [development]
      • login.action = &quot;&quot;
      • login.method = &quot;post&quot;
      • ; username
      • login.elements.txtUsername.type = &quot;text&quot;
      • login.elements.txtUsername.options.label = &quot;Username&quot;
    • (continuação)
      • ; senha
      • login.elements.txtSenha.type = &quot;password&quot;
      • login.elements.txtSenha.options.label = &quot;Senha&quot;
      • ; submit
      • login.elements.enviar.type = &quot;submit&quot;
      • login.elements.enviar.options.label = &quot;Enviar&quot;
    • 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;
      • ?>
    • Requisições atendidas em 1 min
    • Controllers Zend_Controller_Front Zend_Controller_Request Zend_Controller_Router Zend_Controller_Dispatcher Zend_Controller_Action
    • 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
    • Zend_Controller_Front
    • 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)
    • 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'
      • )
      • );
    • Zend_Controller_Dispatcher
      • Dispara uma requisição recebendo informações do Zend_Controller_Request
    • 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()
    • 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;
      • }
      • }
    • Estrutura de Diretórios
      • - application
        • - config
        • - controllers
        • - models
        • - views
          • - scripts
            • - controller
      • - library
        • - Zend
      • - public
    • Configuração da aplicação
        • bootstrap.php
        • Zend_Registry
        • Zend_Config
    • 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.
    • 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);
    • Zend_Config
      • Possibilita a configuração dos formatos:
        • Ini
        • Xml
        • Array
      • Possibilidade de extender o Zend_Config:
        • Yml
      • Implementa o Countable e o Iterator
    • 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
    • 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
    • Zend_Config_Ini
      • [development]
      • login.action = &quot;&quot;
      • login.method = &quot;post&quot;
      • [production : development]
      • login.action = &quot;/prod/login&quot;
    • 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.
    • O xml
      • <?xml version=&quot;1.0&quot;?>
      • <configdata>
      • <development>
      • <login>
      • <action></action>
      • <method>post</method>
      • </login>
      • </development>
      • <production extends=&quot;development&quot;>
      • <login>
      • <action>/prod/login</action>
      • </login>
      • </production>
      • </configdata>
    • Autenticação Zend_Auth e Zend_Acl
    • 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”
    • 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)
    • Minha tabela de usuários
      • Nome da tabela: Usuários
      • Campos:
        • id: serial
        • username: varchar(25)
        • senha: char(32);
    • Zend_Auth com DbTable
      • $authAdapter = new Zend_Auth_Adapter_DbTable( $db,
      • 'usuarios',
      • 'username',
      • 'senha');
      • Zend_Registry::set('authAdapter', $authAdapter);
    • 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();
    • 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('/');
      • }
    • Está autenticado?
      • $auth = Zend_Auth::getInstance();
      • if ($this->_request->getActionName() != 'login'
      • && $auth->hasIdentity() == false) {
      • $this->_redirect('/index/login');
      • }
    • 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?
    • 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
    • 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');
      • }
    • Testes
        • Zend_Test
    • 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)
    • 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)
    • 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
    • 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
    • Internalization e Globalization Zend_Locale e Zend_Translate
    • Globalization
      • Identifica o local e as peculiaridades do local
      • Zend_Locale
      • Provê uma informação aos diversos componentes utilizados no G10n
    • 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
    • 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.
    • 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
    • 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
    • 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.
    • 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
    • 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.
    • 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
    • Integração com o Google Zend_Gdata
    • 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.
    • 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
    • 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.
    • E agora?
      • Dúvidas?
      • Críticas?
      • Sugestões?
      • Mágoas?
    • Fontes
      • Informações Técnicas
        • http://framework.zend.com
      • Imagens
        • Thanks Google!!!
    • Obrigado Edgar Ferreira da Silva http://www.edgarfs.com.br http://www.manjaphp.com.br [email_address] Grupo PHPSP http://www.phpsp.org.br