Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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?
Pseudo‐Programador
Resultado...
Você está demi[do!!! FORA!
E na rotina dos programadores web...
Chefe
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 é?!
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!
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
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
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
Exemplo:
Vamos criar nosso sistema de pacotes:
Zend_Model
-PacotesModel
-ClientesModel
-ReservasModel
Zend_Model
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
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:
E é isso!
Foi bom pra vocês?
MVC com Zend Framework
PERGUNTAS?
REFERÊNCIAS
Lisboa, F. Zend Framework + PDF. 2008