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