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

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 Robustocom Zend Framework - Jaime Neto
  • 7.
    Componentes PHP Robusto comZend 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 createproject 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 davisã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 classApplication_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 classPostagensController 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 classPostagensController 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 possofazer? • 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 teruma 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