SlideShare a Scribd company logo
1 of 24
ROBUSTO COM




    Jaime Neto
contato@jaimeneto.com


FLISOL 2012 – PATOS/PB
Sobre mim
•   Tecnólogo em Telemática (CEFET-PB)
•   Especialista em Desenvolvimento para Web (UNIBRATEC)
•   Analista e desenvolvedor do
•   Analista e desenvolvedor da Ponto-R Comunicação
•   Analista e desenvolvedor da UFPB Virtual
•   Trabalho com PHP desde 2004
•   Trabalho com Zend Framework desde 2007
•   Parte da equipe dos grupos PHP-PB e ZF-PB




PHP Robusto com Zend Framework - Jaime Neto
Sumário
•   Sobre o ZF
•   Quem usa
•   Componentes
•   Exemplo: Blog
•   E o ZF2?
•   Veja também...
•   Perguntas



PHP Robusto com Zend Framework - Jaime Neto
Sobre o ZF
•   Desenvolvido pela Zend Technologies
•   Versão 1.0 lançada em Junho de 2007
•   Código aberto (New BSD License)
•   Requer PHP 5.1.4+ (recomenda-se 5.2.4+)
•   Requer PHPUnit 3.3.0 para testes unitários
•   Versão estável: 1.11.11
•   Versão em teste: 2 beta3
•   http://zendframework.com




PHP Robusto com Zend Framework - Jaime Neto
Sobre o ZF
•   Totalmente orientado a objetos
•   Utiliza bastante design patterns
•   Fracamente acoplado (“Preferir plugar a herdar”)
•   Não impõe regras de desenvolvimento ou estrutura
•   Pode ser usado como uma biblioteca de classes
•   Enorme variedade de componentes
•   Utiliza reescrita de url por padrão
•   Comunidade enorme
•   Curva de aprendizado lenta


PHP Robusto com Zend Framework - Jaime Neto
Quem usa?




PHP Robusto com Zend Framework - Jaime Neto
Componentes




PHP Robusto com Zend Framework - Jaime Neto
Por onde começar?
• Defina a arquitetura do seu sistema
• Defina bem seu banco de dados
• Use o Zend_Tool
    –   RAD e Tooling
    –   Rapidez para montar a estrutura do projeto
    –   Nada de manipular a árvore de diretórios
    –   Via linha de comando
• Adicione as configurações necessárias
• Defina as regras de negócio
• E mão na massa...


PHP Robusto com Zend Framework - Jaime Neto
Exemplo: Blog
   • Modelos                 Arquitetura do
        – Postagem              sistema
        – Usuário

   • Controladores                      Banco de
        – Autenticação                   dados
            – Login e Logout
        – Usuarios
            – Listar
            – Cadastrar, editar e excluir *
        – Postagens
            – Cadastrar, editar, excluir *
            – Inserir e excluir comentário

   * Apenas usuários com permissão



PHP Robusto com Zend Framework - Jaime Neto
Exemplo: Blog
zf create project blog                     zf create action login Auth         Zend_Tool
                                           zf create action logout Auth
zf configure dbadapter "adapter=           zf create action listar Postagens
     Pdo_Mysql&username=root               zf create action exibir Postagens
     &password=&dbname=blog"               zf create action cadastrar Postagens
zf enable layout                           zf create action editar Postagens
                                           zf create action excluir Postagens
zf create dbtable.from-database            zf create action comentar Postagens
                                           zf create action excluirComentario Postagens
zf create controller Auth                  zf create action cadastrar Usuarios
zf create controller Postagens             zf create action editar Usuarios
zf create controller Usuarios              zf create action excluir Usuarios

zf create model Usuario                    zf create form Login
zf create model Postagem                   zf create form Usuario
                                           zf create form Postagem
                                           zf create form Comentario

 PHP Robusto com Zend Framework - Jaime Neto
Exemplo: Blog        Estrutura da
                                               aplicação




PHP Robusto com Zend Framework - Jaime Neto
Inicialização
; configurações da visão                                                  application.ini
resources.view.encoding = "UTF-8"
resources.view.doctype = HTML5

; internacionalização
resources.locale.default = “pt_BR"
resources.translate.content = APPLICATION_PATH “/data/locales"
resources.translate.scan = Zend_Translate::LOCALE_DIRECTORY

; caching
resources.cachemanager.database.frontend.name = Core
resources.cachemanager.database.frontend.customFrontendNaming = false
resources.cachemanager.database.frontend.options.lifetime = 7200
resources.cachemanager.database.frontend.options.automatic_serialization = true
resources.cachemanager.database.backend.name = File
resources.cachemanager.database.backend.customBackendNaming = false
resources.cachemanager.database.backend.options.cache_dir = APPLICATION_PATH "/data/cache/dbtable“
resources.cachemanager.database.frontendBackendAutoload = false


 PHP Robusto com Zend Framework - Jaime Neto
Inicialização                                      Bootstrap
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap {
   /** Inicializa as configurações de autorização **/
   protected function _initAcl() {
     $acl = new Zend_Acl();

        $acl->addRole(new Zend_Acl_Role(‘visitante'))
          ->addRole(new Zend_Acl_Role('membro‘, ‘visitante’)
          ->addRole(new Zend_Acl_Role('administrador‘));

        $acl->add(new Zend_Acl_Resource(‘postagens'));
        $acl->add(new Zend_Acl_Resource(‘usuarios'));

        $acl->allow(‘membro’, ‘postagens’, array(‘inserir’, ‘editar’, ‘excluir-comentario’));
        $acl->allow(‘membro’, ‘usuarios’); // todos os privilégios de usuários
        $acl->deny(‘membro’, ‘usuarios’, array(‘excluir’));

        $acl->allow(‘administrador’); // admin pode tudo

        Zend_Registry::set(‘Zend_Acl’, $acl);
    }
}

    PHP Robusto com Zend Framework - Jaime Neto
Regras de negócio
class Application_Model_Postagem {                                                         Classes de
  public function salvar(array $dados) {                                                     modelo
     $tbPostagem = new Application_Model_DbTable_Postagem();
     if (isset($dados['id'])) {
        $id = $dados['id'];
        if ($tbPostagem->update($dados, array('id = ?' => $id))) return $id;
     } else {
        $dados['criacao'] = Zend_Date::now()->get('yyyy-MM-dd HH:mm:ss');
        return $tbPostagem->insert($dados);
     }
  }
  public function consultaTodas($where = null, $order = null, $count = null, $offset = null) { /* ... */ }
  public function consulta($id) { /* ... */ }
  public function excluir($id) { /* ... */ }
  public function getComentario($id) { /* ... */ }
  public function inserirComentario($dados) { /* ... */ }
  public function excluirComentario($id) { /* ... */ }
}


 PHP Robusto com Zend Framework - Jaime Neto
Autorização
                                                                                            Zend_Auth
class AuthController extends Zend_Controller_Action {
  public function loginAction() {
     // se já estiver logado redireciona para a página inicial
     if (Zend_Auth::getInstance()->hasIdentity()) $this->_helper->redirector('index', 'index');

    $loginForm = new Application_Form_Login();
    if ($this->getRequest()->isPost()) {
       if ($loginForm->isValid($this->getRequest()->getPost())) {
          $dbAdapter = Zend_Db_Table::getDefaultAdapter();
          $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter);
          $authAdapter->setTableName('usuario')
               ->setIdentityColumn('email‘)->setCredentialColumn('senha‘)
               ->setCredentialTreatment('MD5(?)');

         $authAdapter->setIdentity($loginForm->getValue('email'))
             ->setCredential($loginForm->getValue('senha'));

         $auth = Zend_Auth::getInstance()->authenticate($authAdapter);


 PHP Robusto com Zend Framework - Jaime Neto
Autorização
                                                                                Zend_Auth
              if ($result->isValid()) {
                 $userInfo = $authAdapter->getResultRowObject(null, 'senha');
                 $auth->getStorage()->write($userInfo);

                $this->_helper->redirector('index', 'index');
              } else {
                // Usuário ou senha incorretos
              }
          }
        }
         $this->view->form = $loginForm;
    }

    public function logoutAction() {
       Zend_Auth::getInstance()->clearIdentity();
      $this->_helper->redirector('index', 'index');
    }
}


    PHP Robusto com Zend Framework - Jaime Neto
Formulários                                       Aqui começa a
                                                                                                mão na
class Application_Form_Comentario extends Zend_Form {
   public function init() {
                                                                                               massa...
     $this->setMethod(self::METHOD_POST);
      $this->addElement($this->createElement('hidden',              public function persistData()
      'postagem_id'));                                              {
                                                                        $values = $this->getValues();
      $nome = $this->createElement('text', 'nome');                     if ($values) {
      $nome->setLabel('Nome')->setRequired(true)
                                                                           $modelPostagem = new
           ->addFilter('stripTags')->addFilter('StringTrim')             Application_Model_Postagem();
           ->addValidator('StringLength', false, array(5, 30));
      $this->addElement($nome);
                                                                              return $modelPostagem->
                                                                            inserirComentario($values);
      $descricao = $this->createElement('textarea', 'descricao');
                                                                            }
      $descricao->setLabel('Comentários')->setRequired(true);
                                                                        }
      $this->addElement($descricao);
                                                                    }
      $submit = $this->createElement('submit', 'submit');
      $submit->setLabel('Salvar Comentário')->setIgnore(true);
      $this->addElement($submit);
  }


 PHP Robusto com Zend Framework - Jaime Neto
Controladores e visões
class PostagensController extends Zend_Controller_Action {
  /* Outros métodos do controlador */
  public function comentarAction() {
     $form = new Application_Form_Comentario();
     $form->setAction('postagens/comentar’);

        if ($this->getRequest()->isPost() && $form->isValid($this->getRequest()->getPost()))
              if ($form->persistData())
                 $this->_redirect('postagens/exibir/id/' . $form->getValue('postagem_id') . '#comentarios');

        $postagem_id = $this->_getParam('postagem_id');
        $form->populate(array('postagem_id' => $postagem_id));
        $this->view->form = $form;
    }
}

application/views/scripts/postagens/comentar.phtml
<div>Escreva um comentário</div>
<?php echo $this->form ?>



    PHP Robusto com Zend Framework - Jaime Neto
Verificando as permissões
class PostagensController extends Zend_Controller_Action {

     /* Outros métodos do controlador */

     public function inserirAction() {
       $auth = Zend_Auth::getInstance()->getIdentity();
       $acl = Zend_Registry::get(‘Zend_Acl’);

         if (!$acl->isAllowed($auth->perfil, ‘postagens’, ‘inserir’)) {
            $this->_helper->redirector(‘error’, ‘error’);
         }

         /* ... */
     }
}



    PHP Robusto com Zend Framework - Jaime Neto
Que mais posso fazer?
•   Criar página de RSS (Zend_Feed)
•   Criar uma página de contato (Zend_Form, Zend_Mail)
•   Criar widgets para a barra lateral (Zend_View_Helper)
•   Melhorar performance do site (Zend_Cache)
•   Criar rotas alternativas para as páginas (routers)
    – Exemplo: /titulo-do-post em vez de /postagens/exibir/id/1
•   Criar um módulo para versão mobile
•   Guardar os logs de acesso (Zend_Log)
•   Criar menu e breadcrumbs (Zend_Navigation)
•   Criar paginação para as postagens (Zend_Paginator)
•   Criar testes unitários para a aplicação (Zend_Test)
•   Inserir busca por conteúdo (Zend_Search_Lucene)
•   Muito mais...


PHP Robusto com Zend Framework - Jaime Neto
E o ZF2?
• Previsão para versão final
    – “Verão de 2012”
• O que vai mudar?
    – Baseado no PHP versão 5.3
    – Performance melhorada
    – Uma camada MVC dirigida por eventos totalmente reescrita
    – Novo sistema de gerenciamento de módulos
    – Uma nova camada de visão, para responder de forma adequada
      de acordo com o tipo de requisição (HTML, JSON, etc)
    – Suporte a injeção de dependência
    – EventManager, para sistemas controlados por eventos
    – Namespaces


PHP Robusto com Zend Framework - Jaime Neto
Só pra ter uma idéia...
                                                                     Namespaces
namespace ExemploController;
                                                                       no ZF2
use ZendMvcControllerActionController,
    ZendViewModelViewModel;

// Antes era Exemplo_HelloController extends Zend_Controller_Action_Abstract
class HelloController extends ActionController {
   public function worldAction() {
     $message = $this->getRequest()->query()->get('message', 'foo');
     return new ViewModel(array('message' => $message));
   }
}




PHP Robusto com Zend Framework - Jaime Neto
Veja também...
•   zendframework.com/manual                        Links úteis
•   zend-framework-examples.blogspot.com.br
•   forum.imasters.com.br/topic/220186-zend-framework
•   blog.giovannicandido.com/category/php/zend-framework
•   akrabat.com

• php-pb.net/sua-escolha
• github.com/php-pb/Sua-escolha

• blog.jaimeneto.com/category/zend-framework



PHP Robusto com Zend Framework - Jaime Neto
Obrigado!
              Jaime Neto
      contato@jaimeneto.com
            @jaimecpn

                                              abda.la/flisol/pubilc


PHP Robusto com Zend Framework - Jaime Neto

More Related Content

What's hot

Fugindo das armadilhas do MVC
Fugindo das armadilhas do MVCFugindo das armadilhas do MVC
Fugindo das armadilhas do MVCEdiaimo Borges
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoFreedom DayMS
 
Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesOtávio Calaça Xavier
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Luis Gustavo Almeida
 
Meu projeto final - Neobase 2.0
Meu projeto final - Neobase 2.0Meu projeto final - Neobase 2.0
Meu projeto final - Neobase 2.0Saulo Vallory
 
Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontEvento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontMichel Ribeiro
 
Hooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPressHooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPressZé Fontainhas
 
PHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHPPHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHPGuilherme Blanco
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesStanislaw Pusep
 
Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014Paulo Victor Gomes
 
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes AuraPHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes AuraFlávio Lisboa
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11Cezar Souza
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o JavascriptMichel Ribeiro
 

What's hot (20)

Fugindo das armadilhas do MVC
Fugindo das armadilhas do MVCFugindo das armadilhas do MVC
Fugindo das armadilhas do MVC
 
Aplicações rápidas para a Web com Django
Aplicações rápidas para a Web com DjangoAplicações rápidas para a Web com Django
Aplicações rápidas para a Web com Django
 
Java script aula 07 - j-query
Java script   aula 07 - j-queryJava script   aula 07 - j-query
Java script aula 07 - j-query
 
Object Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simplesObject Calisthenics: relaxe e escreva códigos simples
Object Calisthenics: relaxe e escreva códigos simples
 
Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017 Mini Curso PHP Twig - PHP Conference 2017
Mini Curso PHP Twig - PHP Conference 2017
 
jQuery na Prática!
jQuery na Prática!jQuery na Prática!
jQuery na Prática!
 
Meu projeto final - Neobase 2.0
Meu projeto final - Neobase 2.0Meu projeto final - Neobase 2.0
Meu projeto final - Neobase 2.0
 
Evento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de FrontEvento Front End SP - Arquitetura de Front
Evento Front End SP - Arquitetura de Front
 
Hooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPressHooks, o condimento mágico e escondido do WordPress
Hooks, o condimento mágico e escondido do WordPress
 
PHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHPPHPubSP Object Calisthenics aplicado ao PHP
PHPubSP Object Calisthenics aplicado ao PHP
 
Proxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testesProxy, Man-In-The-Middle e testes
Proxy, Man-In-The-Middle e testes
 
Programação Web com jQuery
Programação Web com jQueryProgramação Web com jQuery
Programação Web com jQuery
 
Minicurso de jQuery
Minicurso de jQueryMinicurso de jQuery
Minicurso de jQuery
 
Java script aula 06 - dom
Java script   aula 06 - domJava script   aula 06 - dom
Java script aula 06 - dom
 
Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014Domain Driven Design PHP TDC2014
Domain Driven Design PHP TDC2014
 
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes AuraPHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
PHP Conference Brasil 2013 - Aplicações PHP 5.4 com componentes Aura
 
Curso de Introdução - PHP
Curso de Introdução - PHPCurso de Introdução - PHP
Curso de Introdução - PHP
 
Php 08 Oo
Php 08 OoPhp 08 Oo
Php 08 Oo
 
Zend Framework 1.11
Zend Framework 1.11Zend Framework 1.11
Zend Framework 1.11
 
Evento Front End SP - Organizando o Javascript
 Evento Front End SP - Organizando o Javascript Evento Front End SP - Organizando o Javascript
Evento Front End SP - Organizando o Javascript
 

Similar to PHP robusto com Zend Framework

Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkMarcelo Rodrigo
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Elton Minetto
 
Conhecendo o Zend Framework
Conhecendo o Zend FrameworkConhecendo o Zend Framework
Conhecendo o Zend FrameworkJaime Neto
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkPablo Dall'Oglio
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2Cezar Souza
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer FacesEduardo Bregaida
 
Como criar um plugin para WordPress
Como criar um plugin para WordPressComo criar um plugin para WordPress
Como criar um plugin para WordPressLeandrinho Vieira
 
Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia
 
Certificação Zend Framework
Certificação Zend FrameworkCertificação Zend Framework
Certificação Zend FrameworkJaime Neto
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3Flávio Lisboa
 

Similar to PHP robusto com Zend Framework (20)

Zend Framework
Zend FrameworkZend Framework
Zend Framework
 
Php FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHPPhp FrameWARks - sem CakePHP
Php FrameWARks - sem CakePHP
 
Desenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana frameworkDesenvolvimento ágil com Kohana framework
Desenvolvimento ágil com Kohana framework
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
Conhecendo o Zend Framework
Conhecendo o Zend FrameworkConhecendo o Zend Framework
Conhecendo o Zend Framework
 
Programando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um FrameworkProgramando para programadores: Desafios na evolução de um Framework
Programando para programadores: Desafios na evolução de um Framework
 
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
ZF2 básico : Desenvolvendo um Blog com o Zend Framework 2
 
Doctrine for dummies
Doctrine for dummiesDoctrine for dummies
Doctrine for dummies
 
PHP FrameWARks - FISL
PHP FrameWARks - FISLPHP FrameWARks - FISL
PHP FrameWARks - FISL
 
Produtividade com JavaServer Faces
Produtividade com JavaServer FacesProdutividade com JavaServer Faces
Produtividade com JavaServer Faces
 
Aplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com DjangoAplicacoes Rapidas Para Web Com Django
Aplicacoes Rapidas Para Web Com Django
 
Como criar um plugin para WordPress
Como criar um plugin para WordPressComo criar um plugin para WordPress
Como criar um plugin para WordPress
 
Estrutura do Projeto
Estrutura do ProjetoEstrutura do Projeto
Estrutura do Projeto
 
Estrutura do Projeto
Estrutura do ProjetoEstrutura do Projeto
Estrutura do Projeto
 
Rafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em açãoRafael Garcia - Yii Framework, principais características e em ação
Rafael Garcia - Yii Framework, principais características e em ação
 
Certificação Zend Framework
Certificação Zend FrameworkCertificação Zend Framework
Certificação Zend Framework
 
Zend Framework
Zend FrameworkZend Framework
Zend Framework
 
Hello SAFE World!!!
Hello SAFE World!!!Hello SAFE World!!!
Hello SAFE World!!!
 
O que esperar do Zend Framework 3
O que esperar do Zend Framework 3O que esperar do Zend Framework 3
O que esperar do Zend Framework 3
 
Solid
SolidSolid
Solid
 

PHP robusto com Zend Framework

  • 1. ROBUSTO COM Jaime Neto contato@jaimeneto.com FLISOL 2012 – PATOS/PB
  • 2. Sobre mim • Tecnólogo em Telemática (CEFET-PB) • Especialista em Desenvolvimento para Web (UNIBRATEC) • Analista e desenvolvedor do • Analista e desenvolvedor da Ponto-R Comunicação • Analista e desenvolvedor da UFPB Virtual • Trabalho com PHP desde 2004 • Trabalho com Zend Framework desde 2007 • Parte da equipe dos grupos PHP-PB e ZF-PB PHP Robusto com Zend Framework - Jaime Neto
  • 3. Sumário • Sobre o ZF • Quem usa • Componentes • Exemplo: Blog • E o ZF2? • Veja também... • Perguntas PHP Robusto com Zend Framework - Jaime Neto
  • 4. Sobre o ZF • Desenvolvido pela Zend Technologies • Versão 1.0 lançada em Junho de 2007 • Código aberto (New BSD License) • Requer PHP 5.1.4+ (recomenda-se 5.2.4+) • Requer PHPUnit 3.3.0 para testes unitários • Versão estável: 1.11.11 • Versão em teste: 2 beta3 • http://zendframework.com PHP Robusto com Zend Framework - Jaime Neto
  • 5. Sobre o ZF • Totalmente orientado a objetos • Utiliza bastante design patterns • Fracamente acoplado (“Preferir plugar a herdar”) • Não impõe regras de desenvolvimento ou estrutura • Pode ser usado como uma biblioteca de classes • Enorme variedade de componentes • Utiliza reescrita de url por padrão • Comunidade enorme • Curva de aprendizado lenta PHP Robusto com Zend Framework - Jaime Neto
  • 6. Quem usa? PHP Robusto com Zend Framework - Jaime Neto
  • 7. Componentes PHP Robusto com Zend Framework - Jaime Neto
  • 8. Por onde começar? • Defina a arquitetura do seu sistema • Defina bem seu banco de dados • Use o Zend_Tool – RAD e Tooling – Rapidez para montar a estrutura do projeto – Nada de manipular a árvore de diretórios – Via linha de comando • Adicione as configurações necessárias • Defina as regras de negócio • E mão na massa... PHP Robusto com Zend Framework - Jaime Neto
  • 9. Exemplo: Blog • Modelos Arquitetura do – Postagem sistema – Usuário • Controladores Banco de – Autenticação dados – Login e Logout – Usuarios – Listar – Cadastrar, editar e excluir * – Postagens – Cadastrar, editar, excluir * – Inserir e excluir comentário * Apenas usuários com permissão PHP Robusto com Zend Framework - Jaime Neto
  • 10. Exemplo: Blog zf create project blog zf create action login Auth Zend_Tool zf create action logout Auth zf configure dbadapter "adapter= zf create action listar Postagens Pdo_Mysql&username=root zf create action exibir Postagens &password=&dbname=blog" zf create action cadastrar Postagens zf enable layout zf create action editar Postagens zf create action excluir Postagens zf create dbtable.from-database zf create action comentar Postagens zf create action excluirComentario Postagens zf create controller Auth zf create action cadastrar Usuarios zf create controller Postagens zf create action editar Usuarios zf create controller Usuarios zf create action excluir Usuarios zf create model Usuario zf create form Login zf create model Postagem zf create form Usuario zf create form Postagem zf create form Comentario PHP Robusto com Zend Framework - Jaime Neto
  • 11. Exemplo: Blog Estrutura da aplicação PHP Robusto com Zend Framework - Jaime Neto
  • 12. Inicialização ; configurações da visão application.ini resources.view.encoding = "UTF-8" resources.view.doctype = HTML5 ; internacionalização resources.locale.default = “pt_BR" resources.translate.content = APPLICATION_PATH “/data/locales" resources.translate.scan = Zend_Translate::LOCALE_DIRECTORY ; caching resources.cachemanager.database.frontend.name = Core resources.cachemanager.database.frontend.customFrontendNaming = false resources.cachemanager.database.frontend.options.lifetime = 7200 resources.cachemanager.database.frontend.options.automatic_serialization = true resources.cachemanager.database.backend.name = File resources.cachemanager.database.backend.customBackendNaming = false resources.cachemanager.database.backend.options.cache_dir = APPLICATION_PATH "/data/cache/dbtable“ resources.cachemanager.database.frontendBackendAutoload = false PHP Robusto com Zend Framework - Jaime Neto
  • 13. Inicialização Bootstrap class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { /** Inicializa as configurações de autorização **/ protected function _initAcl() { $acl = new Zend_Acl(); $acl->addRole(new Zend_Acl_Role(‘visitante')) ->addRole(new Zend_Acl_Role('membro‘, ‘visitante’) ->addRole(new Zend_Acl_Role('administrador‘)); $acl->add(new Zend_Acl_Resource(‘postagens')); $acl->add(new Zend_Acl_Resource(‘usuarios')); $acl->allow(‘membro’, ‘postagens’, array(‘inserir’, ‘editar’, ‘excluir-comentario’)); $acl->allow(‘membro’, ‘usuarios’); // todos os privilégios de usuários $acl->deny(‘membro’, ‘usuarios’, array(‘excluir’)); $acl->allow(‘administrador’); // admin pode tudo Zend_Registry::set(‘Zend_Acl’, $acl); } } PHP Robusto com Zend Framework - Jaime Neto
  • 14. Regras de negócio class Application_Model_Postagem { Classes de public function salvar(array $dados) { modelo $tbPostagem = new Application_Model_DbTable_Postagem(); if (isset($dados['id'])) { $id = $dados['id']; if ($tbPostagem->update($dados, array('id = ?' => $id))) return $id; } else { $dados['criacao'] = Zend_Date::now()->get('yyyy-MM-dd HH:mm:ss'); return $tbPostagem->insert($dados); } } public function consultaTodas($where = null, $order = null, $count = null, $offset = null) { /* ... */ } public function consulta($id) { /* ... */ } public function excluir($id) { /* ... */ } public function getComentario($id) { /* ... */ } public function inserirComentario($dados) { /* ... */ } public function excluirComentario($id) { /* ... */ } } PHP Robusto com Zend Framework - Jaime Neto
  • 15. Autorização Zend_Auth class AuthController extends Zend_Controller_Action { public function loginAction() { // se já estiver logado redireciona para a página inicial if (Zend_Auth::getInstance()->hasIdentity()) $this->_helper->redirector('index', 'index'); $loginForm = new Application_Form_Login(); if ($this->getRequest()->isPost()) { if ($loginForm->isValid($this->getRequest()->getPost())) { $dbAdapter = Zend_Db_Table::getDefaultAdapter(); $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter); $authAdapter->setTableName('usuario') ->setIdentityColumn('email‘)->setCredentialColumn('senha‘) ->setCredentialTreatment('MD5(?)'); $authAdapter->setIdentity($loginForm->getValue('email')) ->setCredential($loginForm->getValue('senha')); $auth = Zend_Auth::getInstance()->authenticate($authAdapter); PHP Robusto com Zend Framework - Jaime Neto
  • 16. Autorização Zend_Auth if ($result->isValid()) { $userInfo = $authAdapter->getResultRowObject(null, 'senha'); $auth->getStorage()->write($userInfo); $this->_helper->redirector('index', 'index'); } else { // Usuário ou senha incorretos } } } $this->view->form = $loginForm; } public function logoutAction() { Zend_Auth::getInstance()->clearIdentity(); $this->_helper->redirector('index', 'index'); } } PHP Robusto com Zend Framework - Jaime Neto
  • 17. Formulários Aqui começa a mão na class Application_Form_Comentario extends Zend_Form { public function init() { massa... $this->setMethod(self::METHOD_POST); $this->addElement($this->createElement('hidden', public function persistData() 'postagem_id')); { $values = $this->getValues(); $nome = $this->createElement('text', 'nome'); if ($values) { $nome->setLabel('Nome')->setRequired(true) $modelPostagem = new ->addFilter('stripTags')->addFilter('StringTrim') Application_Model_Postagem(); ->addValidator('StringLength', false, array(5, 30)); $this->addElement($nome); return $modelPostagem-> inserirComentario($values); $descricao = $this->createElement('textarea', 'descricao'); } $descricao->setLabel('Comentários')->setRequired(true); } $this->addElement($descricao); } $submit = $this->createElement('submit', 'submit'); $submit->setLabel('Salvar Comentário')->setIgnore(true); $this->addElement($submit); } PHP Robusto com Zend Framework - Jaime Neto
  • 18. Controladores e visões class PostagensController extends Zend_Controller_Action { /* Outros métodos do controlador */ public function comentarAction() { $form = new Application_Form_Comentario(); $form->setAction('postagens/comentar’); if ($this->getRequest()->isPost() && $form->isValid($this->getRequest()->getPost())) if ($form->persistData()) $this->_redirect('postagens/exibir/id/' . $form->getValue('postagem_id') . '#comentarios'); $postagem_id = $this->_getParam('postagem_id'); $form->populate(array('postagem_id' => $postagem_id)); $this->view->form = $form; } } application/views/scripts/postagens/comentar.phtml <div>Escreva um comentário</div> <?php echo $this->form ?> PHP Robusto com Zend Framework - Jaime Neto
  • 19. Verificando as permissões class PostagensController extends Zend_Controller_Action { /* Outros métodos do controlador */ public function inserirAction() { $auth = Zend_Auth::getInstance()->getIdentity(); $acl = Zend_Registry::get(‘Zend_Acl’); if (!$acl->isAllowed($auth->perfil, ‘postagens’, ‘inserir’)) { $this->_helper->redirector(‘error’, ‘error’); } /* ... */ } } PHP Robusto com Zend Framework - Jaime Neto
  • 20. Que mais posso fazer? • Criar página de RSS (Zend_Feed) • Criar uma página de contato (Zend_Form, Zend_Mail) • Criar widgets para a barra lateral (Zend_View_Helper) • Melhorar performance do site (Zend_Cache) • Criar rotas alternativas para as páginas (routers) – Exemplo: /titulo-do-post em vez de /postagens/exibir/id/1 • Criar um módulo para versão mobile • Guardar os logs de acesso (Zend_Log) • Criar menu e breadcrumbs (Zend_Navigation) • Criar paginação para as postagens (Zend_Paginator) • Criar testes unitários para a aplicação (Zend_Test) • Inserir busca por conteúdo (Zend_Search_Lucene) • Muito mais... PHP Robusto com Zend Framework - Jaime Neto
  • 21. E o ZF2? • Previsão para versão final – “Verão de 2012” • O que vai mudar? – Baseado no PHP versão 5.3 – Performance melhorada – Uma camada MVC dirigida por eventos totalmente reescrita – Novo sistema de gerenciamento de módulos – Uma nova camada de visão, para responder de forma adequada de acordo com o tipo de requisição (HTML, JSON, etc) – Suporte a injeção de dependência – EventManager, para sistemas controlados por eventos – Namespaces PHP Robusto com Zend Framework - Jaime Neto
  • 22. Só pra ter uma idéia... Namespaces namespace ExemploController; no ZF2 use ZendMvcControllerActionController, ZendViewModelViewModel; // Antes era Exemplo_HelloController extends Zend_Controller_Action_Abstract class HelloController extends ActionController { public function worldAction() { $message = $this->getRequest()->query()->get('message', 'foo'); return new ViewModel(array('message' => $message)); } } PHP Robusto com Zend Framework - Jaime Neto
  • 23. Veja também... • zendframework.com/manual Links úteis • zend-framework-examples.blogspot.com.br • forum.imasters.com.br/topic/220186-zend-framework • blog.giovannicandido.com/category/php/zend-framework • akrabat.com • php-pb.net/sua-escolha • github.com/php-pb/Sua-escolha • blog.jaimeneto.com/category/zend-framework PHP Robusto com Zend Framework - Jaime Neto
  • 24. Obrigado! Jaime Neto contato@jaimeneto.com @jaimecpn abda.la/flisol/pubilc PHP Robusto com Zend Framework - Jaime Neto