Prog web 08-php-mvc

1,212 views
1,081 views

Published on

Published in: Technology
0 Comments
3 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
1,212
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
0
Comments
0
Likes
3
Embeds 0
No embeds

No notes for slide

Prog web 08-php-mvc

  1. 1. Programação para WEBRegis Pires Magalhãesregispiresmag@gmail.comImplementando aArquitetura MVC emPHP
  2. 2. MVC – Modelo, Visão, Controlador Model-view-controller (MVC) é um padrão dearquitetura de software. Para que serve? Separar papéis para: reduzir a complexidade efacilitar a manutenção, especialmente quando aaplicação fica grande. Também facilita a divisão detarefas em uma equipe de trabalho. Tornar aplicações mais flexíveis e extensíveis. Permite inclusive a substituição da tecnologia deuma camada sem afetar as demais.
  3. 3. MVC – Modelo, Visão, Controlador Como surgiu? Foi criado como padrão de projeto arquiteturalusado em interfaces de usuário na linguagemSmalltalk.
  4. 4. Arquitetura MVCModel(Dados)View(apresentaçãodos dados)Controllerenvia entrada de dadosexibe o modeloConsulta oualtera o modelodefine que visão será exibida
  5. 5. MVC – Modelo, Visão, Controlador Modelo Refere-se aos dados da aplicação. Pode usar mecanismos de armazenamento persistente(bancos de dados) ou não. Visão Determina como o modelo vai ser mostrado ao usuário. Controlador Recebe interações do usuário e a partir delas, manipula omodelo e determina a visão a ser usada. Pode alterar o modelo ou apenas consultá-lo paraposterior apresentação deste modelo a partir de umadeterminada visão. Em outras palavras, faz o “meio-de-campo” entre o modeloe a visão.
  6. 6. Arquitetura MVC – Resumo Modelos – Dados; Visões – Como os dados são apresentados; Controladores – Recebe entrada de dadosdo usuário. Manipula o modelo e determina avisão para exibição do modelo.
  7. 7. Arquitetura MVC
  8. 8. Exemplo 1 – MVC Super Simples MVC bem simples para entendermos adivisão. Modelo – pessoa.php Visão – pessoa_visao.php Controlador – pessoa_controlador.php
  9. 9. Modelo - pessoa_modelo.php<?phpclass Pessoa {private $nome, $fone;function __construct($nome, $fone) {$this->nome = $nome;$this->fone = $fone;}function getNome() {return $this->nome;}function getFone() {return $this->fone;}}?>
  10. 10. Controlador - pessoa_controlador.php<?phprequire_once(pessoa_modelo.php);class PessoaControlador {function mostra() {$pessoa = new Pessoa(Maria,(86)3323-1234);require_once(pessoa_visao.php);}}$pc = new PessoaControlador();$pc->mostra();?>
  11. 11. Visão - pessoa_visao.php<html><head><meta http-equiv="Content-type"content="text/html; charset=utf-8" /><title>Pessoa</title></head><body><h1>Pessoa - Visão</h1><p>Nome: <?= $pessoa->getNome() ?></p><p>Fone: <?= $pessoa->getFone() ?></p></body></html>
  12. 12. Exemplo 2 – MVC com Dispatcher Usando um front-controller ou dispatcher Há um controlador principal (index.php) quedespacha as requisições para controladores eações específicos. Controladores e ações específicos são definidospelos parâmetros da URL do dispatcher: http://localhost/mvc/index.php/pessoa/mostra No nosso exemplo, o dispatcher: Instancia o controlador especificado Executa o método (ação) especificado do controladorinstanciado.
  13. 13. Testando a URL - testa_url.php<?php$parametros = explode(/,$_SERVER[REQUEST_URI]);$controlador = $parametros[3];$acao = $parametros[4];$parametros = array_slice($parametros, 5);?><html><head><meta http-equiv="Content-type"content="text/html; charset=utf-8" /><title>Testa URL</title></head><body><h1>Testa URL</h1><p>REQUEST_URI: <?= $_SERVER[REQUEST_URI] ?></p><p>Controlador: <?= $controlador ?></p><p>Ação: <?= $acao ?></p><p>Demais parâmetros: <?php print_r($parametros); ?></p></body></html>
  14. 14. Dispatcher - index.php<?php$uri = str_replace(index.php/,,$_SERVER[REQUEST_URI]);$parametros = explode(/,$uri);$controlador = $parametros[2];$acao = $parametros[3];$parametros = array_slice($parametros, 4);$arq_controlador = $controlador . _controlador;$classe_controlador = str_replace(_, , $arq_controlador);$classe_controlador = ucwords($classe_controlador);$classe_controlador = str_replace( , , $classe_controlador);require_once($arq_controlador . .php);$obj = new $classe_controlador;$obj->$acao($parametros);?>
  15. 15. Controlador - pessoa_controlador.php<?phprequire_once(pessoa.php);class PessoaControlador {function mostra() {$pessoa = new Pessoa(Maria,(86)3323-1234);require_once(pessoa_visao.php);}}?>
  16. 16. Problemas Podemos enviar requisições que não passampelo dispatcher. Seria mais interessante o dispatcher centralizar otratamento de todas as requisições. Enviar repetidamente index.php para acessaro dispatcher deixa a URL longa e aindadiminui sua legibilidade. Seria melhor padronizarmos uma URL maisresumida para definirmos o nome do controladore da ação.
  17. 17. Solução Uma solução bastante interessante para osproblemas abordados é a reescrita de URL. Com esse recurso podemos fazer a seguinteconvenção: Para a URL: http://localhost/mvc/pessoa/mostra Podemos dizer que: mvc é um diretório da nossa aplicação pessoa é o nosso controlador mostra é a nossa ação que será executada nocontrolador.
  18. 18. Reescrita de URL Para usarmos reescrita de URL, precisamos habilitaro módulo de reescrita do Apache:No arquivo: C:xamppliteapacheconfhttpd.confdescomente a seguinte linha:LoadModule rewrite_module modules/mod_rewrite.so Depois disso, criamos nossas regras de reescrita noarquivo .htaccess no diretório raiz da aplicação:RewriteEngine onRewriteCond %{REQUEST_FILENAME} !-fRewriteCond %{REQUEST_FILENAME} !-dRewriteRule ^(.*)$ index.php/$1 [L]
  19. 19. Reescrita de URL No Ubuntu ainda é preciso alterar o AllowOverridepara All no arquivo /etc/apache2/sites-available/default: No XAMPP isso já vem habilitado....<Directory /var/www/>Options Indexes FollowSymLinks MultiViewsAllowOverride AllOrder allow,denyallow from all</Directory>...
  20. 20. Flags de reescrita L – Last Rule Pára o processo de reescrita e não aplicaregras adicionais. Semelhante a um break do C, Java ou PHP.

×