Sei sulla pagina 1di 94

Desenvolvendo em MVC

com Zend Framework


Diego Pessoa
Desenvolvedor Web

“Baseado na simplicidade, melhores práticas,


licença corporativa amigável e um código-base
rigorosamente testado. O Zend Framework provê
componentes MVC ricos e flexíveis usando os
recursos de Orientação a Objetos do PHP.”

Copyright © 2008, Zend Technologies Inc


Quem sou eu?
Diego Pessoa
 Desenvolvedor Web
• Análise e Produção de Sistemas

 Pesquisador ‐ NAV, CEFET‐PB
• Produção de aplicações educacionais em 
Zend Framework
 Concluinte de Sistemas para 
Internet no CEFET‐PB
Frases de Pseudo-Programadores PHP
• “PHP é muito fácil!”
• “Não preciso de Orientação a Objetos, muito 
menos frameworks, negócio complicado!”
• “Meu projeto é simples, pra que padrões de 
codificação, padrões de projeto e essas coisas?”
• “Eu desenvolvo meu próprio Framework”
• “O que importa é que funcione. O que cliente 
não vai olhar o código!”
• “Assim PHP fica parecendo Java, aff!”
E na rotina dos programadores web...
Chefe
O programador anterior já tinha feito algo parecido, por
que você não reutilizou?

Eu preciso desse projeto pronto para ontém!

OU TERMINA HOJE OU ESTÁ DEMITIDO!

Chefinho, é que o código do programador antigo


estava uma porcaria, preferi refazer do meu jeito!

Mas é só você esperar um pouquinho que eu termino


as funções de acesso ao banco de dados, validação de
formulários e envio de e-mail.

Pseudo‐Programador
Resultado...

Você está demi[do!!! FORA!
E na rotina dos programadores web...
Chefe

Já contratei mais de 5 programadores, gastei uma grana


preta e nenhum deles consegue fazer um simples sistema
de compra de pacotes on-line, o cliente já está
desesperado! Socorro!

Deixa comigo!

Bom Programador Web
E na rotina dos programadores web...
Como utilizo um framework, a parte básica já está
pronta, me preocupo apenas com a lógica do
negócio.
Também reutilizei componentes de um sistema
que já havia feito anteriormente modificando
apenas a visão para o seu projeto.

Que maravilha!
Finalmente o meu site está pronto!
Resultado...

Parabéns!
Você foi promovido!
E você? Que tipo de programador é?!
• Você consegue entender seu próprio 
código? E os outros?!
• Seu programa é documentado?
• Mais importante, ele é testado!?
• Você faz controle de código‐fonte?
• Sua equipe produz eficientemente?
• Você consegue reu[lizar seus códigos?!
E você? Que tipo de programador é?!
• FOCO no código, não se acomode ao ver 
“funcionar”, só isso não basta!
• Consistência
• Legibilidade
• Colaboração
• Seja Obje[vo!
• Encoraje o reuso!
E você? Que tipo de programador é?!

Prefiro fazer do meu jeito,


criei meu próprio framework e
uso os padrões que mais se
encaixam na minha realidade.
E você? Que tipo de programador é?!
• Use um padrão pré‐estabelecido

NÃO INVENTE SEU PRÓPRIO 
PADRÃO. VOCÊ NÃO É 
ESPECIAL E SEU CÓDIGO 
PHP NÃO É ÚNICO!
E você? Que tipo de programador é?!

MORTE AOS FRAMEWORKS CASEIROS!
E você? Que tipo de programador é?!
Pense no Futuro...
Seja simples!

“As coisas devem ser feitas tão simples quanto for 
possível, mas não de forma simplista.”

Albert Einstein

• Simples é mais fácil de usar
• Simples é estável, menos propenso a erros
• Simples é mais compa_vel
• Simples é mais fácil de manter
Um sonho...

Não seria maravilhoso se todos os 
programadores PHP do mundo 
trabalhassem de uma forma 
padronizada, de modo que pudessem 
compar[lhar seus componentes e 
reu[lizar milhares de linhas de código‐
fonte?

Deve ser um sonho...
MVC

O Que
é
MVC?
MVC

Controle

Modelo Visão
MVC
Modelo
• O “conteúdo” que povoa sua aplicação: dados
vindos do banco, Web Services, Feeds, etc.
Visão
• O que é mostrado ao usuário
Controle
• Gerencia o ambiente da requisição, e
determina o que irá acontecer
MVC
Com MVC, você consegue dividir
sua aplicação em camadas!

Camadas? Como é isso?


MVC
Exemplo da vida real...

Guarda‐roupa  em camada única Guarda‐roupa  em camadas dis[ntas
MVC
Exemplo do mundo virtual

Código HTML em camada única
MVC
Exemplo do mundo virtual

Código HTML em camadas separadas
MVC
Código PHP Spaghetti
CÓDIGO PHP MVC
CÓDIGO PHP MVC

Você não programa em


MVC ainda?
Zend Framework

Zend
Framework
Visão Geral
Visão Geral
Zend Framework provê uma estrutura de
alta qualidade para o desenvolvimento de
Aplicações Web e Web Services.
Seguindo o espírito PHP, o Zend Framework
dispõe de funcionalidades poderosas e fáceis
de utilizar, com foco nos desafios da
construção de uma aplicação web segura e
moderna.
http://framework.zend.com
Visão Geral
• Framework “Self-Service”: Use o que
você precisa
• Fácil integração com outros frameworks
• Fracamente acoplado
• Desenvolvido em PHP 5
• Implementa tendências da web
atual (Web Services, Ajax, etc)
Amigável aos Negócios
• Acordo de Licença requerido aos
que contribuem com código,
atualizações ou documentações.
• Todo o código é licenciado
sob a licença new BSD (livre!).
• Certificação oficial
• Mantido ativamente pela ZEND
O que é o Zend Framework?

Estabilidade e Documentação
• Todos os componentes são rigorosamente
testados!
• Todos os componentes devem ter
documentações para o usuário e casos de uso
O que é o Zend Framework?
Estrutura de diretórios
• A estrutura de diretórios é personalizável:

Módulo gerencia, contendo os elementos MVC.

Módulo site, contendo os elementos MVC.

Pasta contendo arquivos de configuração
Pasta para bibliotecas. Exemplo: Zend, Smarty, etc.

Arquivos Públicos está[cos: imagens, java scripts, css, etc.

Bootstrap File – Arquivo de inicialização
Por que usar o Zend Framework?
• Simples, porém poderoso
• Toda a parte incômoda dos bits já está feita!
• Possui componentes para a maioria das
atividades rotineiras do desenvolvimento web
• Projeto moderno: PHP 5, OO
• Documentação completa e de fácil acesso
• Foco na regra do negócio!
Por que usar o Zend Framework?
É um Framework, não apenas componentes
• “Cola” para construir aplicações
• Alta Produtividade
• Componentes desenvolvidos e testados juntos
Use somente o que você precisa, mas
• Ele sempre será distribuído em sua totalidade
Ainda possui fácil integração com outros 
(PEAR, Smarty, etc)
Não Confunda!
Zend Framework != Zend Studio
• É um Framework, não é uma IDE.

Framework para construção civil
Arquitetura
O que há no Zend Framework?
• Model View Controller
• Dados: banco de dados, JSON, PDF, Busca
• Internacionalização, datas, moedas
• Web Services: consumo e disponibilização
• Serviços de infra-estrutura: autenticação,
listas de controle de acesso, cache,
configuração, log, mail, session.
e muito mais...
Vantagens do Zend Framework?
• Segue o padrão de codificação Zend
• Todas as classes são completamente testadas
com PHPUnit
• Revisão por pares e aprovação de todo o
código
• Rica documentação on-line
• Grupos, comunidades e listas de discussões
• Projeto com apoio de grandes empresas
Grandes empresas que usam o ZF

Mais informações em: hhp://framework.zend.com/about/casestudies
Zend Framework e MVC
Zend Framework

Zend_Controller,
o ‘C’ do MVC
Zend Framework - Controllers
• Caminhos de URL Básicos:
/controlador/acao
/controlador/acao/parametro/valor
/modulo/controlador/acao
/modulo/controlador/acao/valor
• Controller: Classe derivada de Zend_Controller_Action
IndexController, PacotesController
• Action: Método publico terminado com Action
IndexAction, listarAction
Zend Framework - Controllers

Simplificando:
Ao acessar: 
seusite.com/blog/postar
  o Zend Framework irá chamar o método 
PostarAc[on da classe BlogController.

Que legal! Sempre quis fazer 
isso! Hoje eu crio páginas 
“index.php” dentro de pastas 
para fazer URLs amigáveis.

Como o Zend faz isso? Mágica?
O Padrão Front Controller
• Manipula todas as requisições
• Delega requisições para os ‘Page
Controllers’ (controladores de ação)
manipularem.
• Devolve a resposta
Zend_Controller_Front: Atribuições
• O Zend implementa este padrão através da classe
Zend_Controller_Front
•Objeto Request: contém todas as informações sobre o
ambiente de requisição
• Objeto Router: decompõe o ambiente, separando o
módulo, controlador e ação atuais.
• Objeto Dispatcher: mapeia o roteamento para as
classes controladoras de ação e métodos
• Objeto Response: contém a resposta completa e tem
habilidade para enviá-la.
Zend_Controller_Front: Atribuições
Zend_Controller_Front: Dispatcher
• O método dispatch() manipula a entrada de
requisições, ele é que faz a coisa funcionar!
• Instancia objetos de requisição e resposta se não
foram previamente configurados
• Requisita Rotas
• Entra em um laço despachante: Instancia o
controlador de ação, chama o método de ação e
despacha até que o objeto da requisição não possua
mais ações a serem despachadas.
• Retorna a Resposta
Zend_Controller_Action
Action Controllers:
• Classes que estendem Zend_Controller_Action
• O nome da classe termina em Controller
• ClientesController, PacotesController
• CamelCasing permitido
• FooBarController
• Separa as palavras CamelCased em URLs com
‘-’ (hífen)
• foo-bar
Zend_Controller_Action
Controller Actions:
• Método que o Action Controller deve executar
• Métodos publicos que terminam em Action
• listarAction, salvarAction
• CamelCasing permitido
• fooBarAction()
• Separa as palavras CamelCased em URLs com
‘-’ (hífen)
• foo-bar
Zend_Controller_Action
O controlador de Ação está preparado
para tratar os seguintes eventos:
init() : executado sempre que o objeto é
instanciado.
preDispach() : executado antes que a ação
seja despachada
postDispach() : executado depois que a ação
seja despachada
Zend_Controller_Action
Métodos utilitários:
_forward($action, $controller=null,
$module=null, $params=null): repassa o
processo para outra ação.
_redirect($url): redireciona para outra URL
_render ($action, $name, $noController):
renderiza um script de visão alternativo
_call($method, $params) : usado para criar
ações dinâmicas ou desviar ações.
Zend_Controller_Action

Como assim renderizar um script de 
visão alterna[vo?
Como a visão é renderizada 
normalmente?
Zend_Controller_Action
ViewRenderer
• A integração com a Visão é automática
• Registrado pelo action helper ViewRenderer
• Pode ser desabilitado
• A propriedade $view do controlador contém um
objeto de visão
• O objeto da visão pode ser obtido assim:
Zend_Controller_Action_HelperBroker::getStatic
Helper(‘viewRenderer’)
Zend_Controller_Action

Simplificando: 
Para associar uma variável a um 
controlador basta fazer isso:
 $this‐>view‐>variavel = “valor”;  
Com isso, na visão você poderá u[lizar:
$this‐>variavel

Isso vale para variáveis de qualquer [po, 
de [pos primi[vos e coleções até 
objetos.
Zend_Controller_Action

Peraí peraí! 
Mas se é automá[co, como 
ele sabe qual arquivo de visão 
chamar?
Zend_Controller_Action
• Os view scripts são renderizados automaticamente
durante o evento postDispatch()
• View scripts são nomeados de acordo com o
controlador e a ação:
FooController::barAction() renderiza views/foo/
bar.phtml
PacotesController::listarAction() renderiza views/
pacotes/listar.phtml
Para desabilitar o ViewRenderer:
setNoRender() ou chamar _forward() ou _redirect()
Zend_Controller_Action
O método listarAc[on do 
IndexController irá chamar 
a o arquivo de visão 
listar.phtml que está na 
pasta index dentro de 
views/scripts.
Zend_Controller_Action
Customizando o ViewRenderer:
setView(): Configura o objeto de visão (permite
colocar outras implementações, exemplo: Smarty)
setViewSuffix(): Altera o sufixo do arquivo usado
setView(Base|Script)PatchSpec(): Configura a
especificação do caminho das visões
setResponseSegment(): Configura o seguemento de
resposta nomeado para o qual renderizar.
Zend_Controller_Action
Módulos: Um conjunto de controladores de ação,
modelos e visões relacionados.
• Funciona como um sub-programa, contendo uma
estrutura MVC dentro dele.
• Nomes de classes controladoras devem ser prefixadas
com o nome do módulo:
Foo_PacotesController -> foo/controllers/
PacotesController.php
* A prefixação não é necessária se o módulo for
configurado como o “default” da aplicação
Zend_Controller_Action
Estrutura Modular:

Os módulos podem 
conversar entre si.
Zend Framework

Zend_View,
o ‘V’ do
MVC
Zend_View: O ‘V’ do VMC
Implemente Zend_View_Interface para criar seu próprio
mecanismo de template
A implementação padrão do Zend (Zend_View) usa
PHP como linguagem de template
Associa e recupera variáveis da visão como se elas
fossem variáveis membro de um objeto:
$view->content = $body;
Acessa variáveis de visão em view scripts a partir do
objeto $this
<?=$this->content ?>
Zend_View: O ‘V’ do VMC
• Mistura HTML e PHP
• Acessa variáveis de template usando $this
• Mantém variáveis associadas no seu próprio escopo
• Distingue variáveis associadas de variáveis locais

Benefícios:
Todo o PHP está a sua disposição
Problemas:
Todo o PHP está a sua disposição
Zend_View: O ‘V’ do VMC

Isso não está me cheirando 
bem...
Zend_View: O ‘V’ do VMC
5 mandamentos da visão:
- Não instanciarás quaisquer classes dentro da visão
- Não roubarás nenhum dado de modelo diretamente da
visão
- Jamais chamarás algum controlador direto da visão
- Respeitai e honrai as regras de fluxo do MVC
- É proibido utilizar métodos de leitura de arquivos,
formatação ou similares.
Zend_View: O ‘V’ do VMC

A Visão é feita apenas para mostrar


resultados, operações são feitas nos
controladores!

Caso queira fazer operações de


exibição use os Helpers
Zend_View - Helpers
Quer uma mãozinha?
Zend_View - Helpers
O que são os Helpers?
Classes que estendem a funcionalidade do Zend_View
- Modelos de acesso (adiciona um feed del.icio.us à sua
página)
- Formata ou trata saída
- Lógica de exibição (mostra botão de login se o usuário
não estiver logado)
- Snippets de exibição reutilizáveis (por exemplo, caixa
de busca)
Zend_Model

Zend_Model,
o ‘M’ do MVC
Zend_Model
O que é um modelo?
• Banco de dados
• Web Services
• Feeds
• Arquivos de Configuração
• Sistema de Arquivos
• Imagens
Zend_Model

Usando dados do banco como Modelo


Zend_Db_Table
• Implementa o padrão Table Gateway
• Exerce controle total sobre operações na
tabela (insert, update, delete, find,
fetchAll, etc), basta indicar qual é a tabela
relacionada!
Zend_Model

Exemplo:
Vamos criar nosso sistema de pacotes:
Zend_Model

Temos 3 tabelas, isto significa que


precisaremos de 3 arquivos do tipo
Zend_Db_Table para mapeá-las.

-PacotesModel
-ClientesModel
-ReservasModel
Zend_Model

Pronto! Só isso! Agora já podemos instanciar as


nossas classes de modelo e usar os métodos
correspondentes à tabela.
Zend_Model
Alguns Métodos de manipulação do Zend_Db_Table:
insert(array $dados): insere um novo registro
baseado nos campos da array recebida

delete($string|$array): deleta o registro passado


como parametro

update(array $dados, $where): atualiza registros 
baseado nos campos da array recebida
Zend_Model
Alguns Métodos de manipulação do Zend_Db_Table:
fetchAll(string|array $where = null, $order = null,
$count = null, $offset = null): busca lista de
registros no banco de dados

find($id): busca registro único pela chave primária

info() : retorna informações da tabela

createRow($array=null): Cria um novo registro na


tabela
Zend_Model
Exemplos:
Zend_Model

Só isso?!
Antes eu [nha que criar na mão 
todas as queries para inserir, 
editar, selecionar, apagar, etc.
Zend_Model

Mas peraí? Aonde isso é OO? 
Você tá mandando array dentro 
do insert, update, delete, etc. 
Não tô vendo nada de objeto aí 
não!
Zend_Model
O Zend também implementa o padrão Row Data
Gateway através da classe Zend_Db_Table_Row.
Com isso, você pode configurar cada linha da tabela
como um objeto criado por você, já contando também,
com vários métodos prontos disponíveis, restando
implementar apenas a lógica da sua aplicação.
Alguns métodos:
save(): é responsável por persistir o objeto no banco
delete(): responsável por deletar o objeto do banco
Zend_Model
O Zend_Db_Table_Row é uma classe PHP normal:
Zend_Model
Para ela ser interpretada, é necessário configurá-la na
classe que herda a Zend_Db_Table_Abstract,
exemplo:
Zend_Model
Resultado:
Zend_Model

Legal, mas, como eu faço o 
relacionamento entre objetos?! 
Afinal, a par[r da classe 
Reservas eu tenho que acessar 
o cliente e o pacote! Como fazer 
isso?
Relacionamento Entre Objetos

Mapeamento Objeto‐Relacional
Relacionamento entre objetos
Vai me dizer que agora vou ter 
que configurar arquivos XML 
enormes e colocar anotações nas 
minhas classes?
Relacionamento entre objetos
Lembra das nossas tabelas?

Relacionamentos:
Reservas 1 –> N Clientes
Reservas 1 –> N Pacotes
Relacionamento entre objetos
A tabela Reservas se relaciona com duas tabelas (Clientes e Pacotes)
Adicionamos à classe ReservasModel:

Sendo assim, as tabelas Clientes e Pacotes são dependentes de Reservas


Adicionamos às classes ClientesModel e PacotesModel:
Relacionamento entre objetos
Para acessar os objetos Clientes e Pacotes a partir de Reservas
podemos utilizar dois métodos diferentes:
findParentRow($objeto): através deste método acessamos o objeto
que está mapeado no referenceMap.
Exemplo: findParentRow(“Cliente”) ou findParentRow(“Pacote”)
ou
De uma forma mais elegante, utilizar o mecanismo de métodos
dinâmicos do Zend:
findParent<OBJETO_PROCURADO>
Exemplo: findParentCliente();
Relacionamento entre objetos
Agora teremos:
MVC com Zend Framework

E é isso!

Foi bom pra vocês?
MVC com Zend Framework

Foi uma delícia...


MVC com Zend Framework

PERGUNTAS?
REFERÊNCIAS

Lisboa, F. Zend Framework + PDF. 2008

Allen, R. Zend Framework Overview. 2008.


O'Phinney, M. W. Zend Framework: Creating
A CRUD Application. 28/02/2007.
IDEM. Zend Framework MVC Quick Start.
09/10/2007.

Potrebbero piacerti anche