24
ROBUSTO COM Jaime Neto [email protected] FLISOL 2012 – PATOS/PB

PHP robusto com Zend Framework

Embed Size (px)

DESCRIPTION

Palestra sobre Zend Framework apresentada no FLISOL 2012 em Patos/PB no dia 28 de Abril de 2012.

Citation preview

Page 1: PHP robusto com Zend Framework

ROBUSTO COM

Jaime [email protected]

FLISOL 2012 – PATOS/PB

Page 2: PHP robusto com Zend Framework

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

Page 3: PHP robusto com Zend Framework

Sumário

• Sobre o ZF• Quem usa• Componentes• Exemplo: Blog• E o ZF2?• Veja também...• Perguntas

PHP Robusto com Zend Framework - Jaime Neto

Page 4: PHP robusto com Zend Framework

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

Page 5: PHP robusto com Zend Framework

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

Page 6: PHP robusto com Zend Framework

Quem usa?

PHP Robusto com Zend Framework - Jaime Neto

Page 7: PHP robusto com Zend Framework

Componentes

PHP Robusto com Zend Framework - Jaime Neto

Page 8: PHP robusto com Zend Framework

Por onde começar?

PHP Robusto com Zend Framework - Jaime Neto

• 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...

Page 9: PHP robusto com Zend Framework

Exemplo: Blog

PHP Robusto com Zend Framework - Jaime Neto

• Modelos– Postagem– Usuário

• Controladores– Autenticação

– Login e Logout– Usuarios

– Listar– Cadastrar, editar e excluir *

– Postagens– Cadastrar, editar, excluir *– Inserir e excluir comentário

* Apenas usuários com permissão

Arquitetura do sistema

Banco de dados

Page 10: PHP robusto com Zend Framework

Exemplo: Blog

PHP Robusto com Zend Framework - Jaime Neto

zf create project blog

zf configure dbadapter "adapter= Pdo_Mysql&username=root &password=&dbname=blog"

zf enable layout

zf create dbtable.from-database

zf create controller Authzf create controller Postagenszf create controller Usuarios

zf create model Usuariozf create model Postagem

zf create action login Authzf create action logout Authzf create action listar Postagenszf create action exibir Postagenszf create action cadastrar Postagenszf create action editar Postagenszf create action excluir Postagenszf create action comentar Postagenszf create action excluirComentario Postagenszf create action cadastrar Usuarioszf create action editar Usuarioszf create action excluir Usuarios

zf create form Loginzf create form Usuariozf create form Postagemzf create form Comentario

Zend_Tool

Page 11: PHP robusto com Zend Framework

Exemplo: Blog

PHP Robusto com Zend Framework - Jaime Neto

Estrutura da aplicação

Page 12: PHP robusto com Zend Framework

Inicialização

PHP Robusto com Zend Framework - Jaime Neto

; configurações da visãoresources.view.encoding = "UTF-8"resources.view.doctype = HTML5

; internacionalizaçãoresources.locale.default = “pt_BR"resources.translate.content = APPLICATION_PATH “/data/locales"resources.translate.scan = Zend_Translate::LOCALE_DIRECTORY ; cachingresources.cachemanager.database.frontend.name = Coreresources.cachemanager.database.frontend.customFrontendNaming = falseresources.cachemanager.database.frontend.options.lifetime = 7200resources.cachemanager.database.frontend.options.automatic_serialization = trueresources.cachemanager.database.backend.name = Fileresources.cachemanager.database.backend.customBackendNaming = falseresources.cachemanager.database.backend.options.cache_dir = APPLICATION_PATH "/data/cache/dbtable“resources.cachemanager.database.frontendBackendAutoload = false

application.ini

Page 13: PHP robusto com Zend Framework

Inicialização

PHP Robusto com Zend Framework - Jaime Neto

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); }}

Bootstrap

Page 14: PHP robusto com Zend Framework

Regras de negócio

PHP Robusto com Zend Framework - Jaime Neto

class Application_Model_Postagem { public function salvar(array $dados) { $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) { /* ... */ }}

Classes de modelo

Page 15: PHP robusto com Zend Framework

Autorização

PHP Robusto com Zend Framework - Jaime Neto

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);

Zend_Auth

Page 16: PHP robusto com Zend Framework

Autorização

PHP Robusto com Zend Framework - Jaime Neto

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'); }}

Zend_Auth

Page 17: PHP robusto com Zend Framework

Formulários

PHP Robusto com Zend Framework - Jaime Neto

class Application_Form_Comentario extends Zend_Form { public function init() { $this->setMethod(self::METHOD_POST);

$this->addElement($this->createElement('hidden', 'postagem_id'));

$nome = $this->createElement('text', 'nome'); $nome->setLabel('Nome')->setRequired(true) ->addFilter('stripTags')->addFilter('StringTrim') ->addValidator('StringLength', false, array(5, 30)); $this->addElement($nome);

$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); }

public function persistData() { $values = $this->getValues(); if ($values) { $modelPostagem = new

Application_Model_Postagem();

return $modelPostagem-> inserirComentario($values);

} }}

Aqui começa a mão na massa...

Page 18: PHP robusto com Zend Framework

Controladores e visões

PHP Robusto com Zend Framework - Jaime Neto

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; }}

<div>Escreva um comentário</div><?php echo $this->form ?>

application/views/scripts/postagens/comentar.phtml

Page 19: PHP robusto com Zend Framework

Verificando as permissões

PHP Robusto com Zend Framework - Jaime Neto

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’); }

/* ... */ }}

Page 20: PHP robusto com Zend Framework

Que mais posso fazer?

PHP Robusto com Zend Framework - Jaime Neto

• 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...

Page 21: PHP robusto com Zend Framework

E o ZF2?

PHP Robusto com Zend Framework - Jaime Neto

• 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

Page 22: PHP robusto com Zend Framework

Só pra ter uma idéia...

PHP Robusto com Zend Framework - Jaime Neto

namespace Exemplo\Controller;

use Zend\Mvc\Controller\ActionController, Zend\View\Model\ViewModel;

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

Namespacesno ZF2

Page 23: PHP robusto com Zend Framework

Veja também...

PHP Robusto com Zend Framework - Jaime Neto

Links úteis• zendframework.com/manual• 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

Page 24: PHP robusto com Zend Framework

PHP Robusto com Zend Framework - Jaime Neto

Jaime [email protected]

@jaimecpn

Obrigado!

abda.la/flisol/pubilc