Programação para WEB Regis Pires Magalhães [email_address] Implementando a Arquitetura MVC em PHP
MVC – Modelo, Visão, Controlador Model-view-controller (MVC) é um padrão de arquitetura de software. Para que serve?  Separar   papéis  para:  reduzir  a  complexidade  e  facilitar  a  manutenção , especialmente quando a aplicação fica grande. Também  facilita  a  divisão   de tarefas  em uma  equipe  de trabalho. Tornar  aplicações  mais  flexíveis  e  extensíveis . Permite inclusive a substituição da tecnologia de uma camada sem afetar as demais.
MVC – Modelo, Visão, Controlador Como surgiu? Foi criado como padrão de projeto arquitetural usado em interfaces de usuário na linguagem  Smalltalk .
Arquitetura MVC exibe o modelo Consulta ou altera o modelo define que visão será exibida
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 o modelo e determina a visão a ser usada. Pode alterar o modelo ou apenas consultá-lo para posterior apresentação deste modelo a partir de uma determinada visão. Em outras palavras, faz o “meio-de-campo” entre o modelo e a visão.
Arquitetura MVC – Resumo  Modelos  – Dados; Visões  – Como os dados são apresentados; Controladores  – Recebe entrada de dados do usuário. Manipula o modelo e determina a visão para exibição do modelo.
Arquitetura MVC
Exemplo 1 – MVC Super Simples MVC bem simples para entendermos a divisão. Modelo – pessoa.php Visão – pessoa_visao.php Controlador – pessoa_controlador.php
Modelo - pessoa.php <?php class   Pessoa   { private   $nome ,   $fone ; function   __construct( $nome ,   $fone )   { $this ->nome   =   $nome ; $this ->fone   =   $fone ; } function   getNome()   { return   $this ->nome; } function   getFone()   { return   $this ->fone; } } ?>
Controlador - pessoa_controlador.php <?php require_once ( 'pessoa.php' ); class   PessoaControlador   { function   mostra()   { $pessoa   =   new   Pessoa( 'Maria' , '(86)3323-1234' ); require_once ( 'pessoa_visao.php' ); } } $pc   =   new   PessoaControlador(); $pc ->mostra(); ?>
Visão - pessoa_visao.php < html > < head > < title > Pessoa </ title > </ head > < body >   < h1 > Pessoa - Visão </ h1 > < p > Nome:  <? =   $pessoa ->getNome()   ?> </ p > < p > Fone:  <? =   $pessoa ->getFone()   ?> </ p > </ body > </ html >
Exemplo 2 – MVC com Dispatcher Usando um front-controller ou dispatcher Há um controlador principal (index.php) que despacha as requisições para controladores e ações específicos. Controladores e ações específicos são definidos pelos parâmetros da URL do dispatcher: http://localhost/mvc/index.php?controlador=pessoa&acao=mostra  No nosso exemplo, o dispatcher: Instancia o controlador especificado Executa o método (ação) especificado do controlador instanciado.
Dispatcher - index.php <?php $arq_controlador   =   $_GET [controlador]. '_controlador' ; $acao   =   $_GET [acao]; $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 ; call_user_func( array ( $obj ,   $acao ), $_REQUEST ); ?>
Controlador - pessoa_controlador.php <?php require_once ( 'pessoa.php' ); class   PessoaControlador   { function   mostra()   { $pessoa   =   new   Pessoa( 'Maria' , '(86)3323-1234' ); require_once ( 'pessoa_visao.php' ); } } ?>
Usando convenções Podemos convencionar algumas coisas. Se um controlador não for definido, podemos usar um controlador padrão chamado de  HomeControlador , por exemplo. Caso uma ação não tenha sido definida, usamos a ação  index , por exemplo. Assim, se nada for dito, a ação  index  do controlador  HomeControlador  será executada.  Para isso, devemos alterar nosso dispatcher...
Convenções no Dispatcher <?php $arquivo_controlador   =   $_GET [controlador]   ?   $_GET [controlador]. '_controlador'   :   'home_controlador' ; $acao   =   $_GET [acao]   ?   $_GET [acao]   :   'index' ; $classe_controlador   =   str_replace( '_' ,   ' ' ,   $arquivo_controlador ); $classe_controlador   =   ucwords( $classe_controlador ); $classe_controlador   =   str_replace( ' ' ,   '' ,   $classe_controlador ); require_once ( $arquivo_controlador . '.php' ); $obj   =   new   $classe_controlador ; call_user_func( array ( $obj ,   $acao ), $_REQUEST ); ?>
Problemas Podemos enviar requisições que não passam pelo dispatcher. Seria mais interessante o dispatcher centralizar o tratamento de todas as requisições. Enviar o nome do controlador e da ação via parâmetros deixa a URL muito longa e ainda diminui sua legibilidade. Seria melhor padronizarmos uma URL mais resumida para definirmos o nome do controlador e da ação.
Solução Uma solução bastante interessante para os problemas abordados é a reescrita de URL. Com esse recurso podemos fazer a seguinte convençã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 no controlador.
Reescrita de URL Para usarmos reescrita de URL, precisamos habilitar o módulo de reescrita do Apache: No arquivo:  C:\xampplite\apache\conf\httpd.conf  descomente a seguinte linha: LoadModule rewrite_module modules/mod_rewrite.so Depois disso, criamos nossas regras de reescrita no arquivo  .htaccess  no diretório raiz da aplicação: <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] </IfModule>
Testando a Reescrita - index.php <?php $parametros   =   explode( '/' , $_GET [ 'url' ]); $controlador   =   $parametros [ 0 ]; $acao   =   $parametros [ 1 ]; ?> < html > < head > < title > Testa Reescrita </ title > </ head > < body > < h1 > Testa Reescrita </ h1 > < p > URL:  <? =   $_GET [ 'url' ]   ?> </ p > < p > Controlador:  <? =   $controlador   ?> </ p > < p > Ação:  <? =   $acao   ?> </ p > </ body > </ html >

Php 05 Mvc

  • 1.
    Programação para WEBRegis Pires Magalhães [email_address] Implementando a Arquitetura MVC em PHP
  • 2.
    MVC – Modelo,Visão, Controlador Model-view-controller (MVC) é um padrão de arquitetura de software. Para que serve? Separar papéis para: reduzir a complexidade e facilitar a manutenção , especialmente quando a aplicação fica grande. Também facilita a divisão de tarefas em uma equipe de trabalho. Tornar aplicações mais flexíveis e extensíveis . Permite inclusive a substituição da tecnologia de uma camada sem afetar as demais.
  • 3.
    MVC – Modelo,Visão, Controlador Como surgiu? Foi criado como padrão de projeto arquitetural usado em interfaces de usuário na linguagem Smalltalk .
  • 4.
    Arquitetura MVC exibeo modelo Consulta ou altera o modelo define que visão será exibida
  • 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 o modelo e determina a visão a ser usada. Pode alterar o modelo ou apenas consultá-lo para posterior apresentação deste modelo a partir de uma determinada visão. Em outras palavras, faz o “meio-de-campo” entre o modelo e a visão.
  • 6.
    Arquitetura MVC –Resumo Modelos – Dados; Visões – Como os dados são apresentados; Controladores – Recebe entrada de dados do usuário. Manipula o modelo e determina a visão para exibição do modelo.
  • 7.
  • 8.
    Exemplo 1 –MVC Super Simples MVC bem simples para entendermos a divisão. Modelo – pessoa.php Visão – pessoa_visao.php Controlador – pessoa_controlador.php
  • 9.
    Modelo - pessoa.php<?php class 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.
    Controlador - pessoa_controlador.php<?php require_once ( 'pessoa.php' ); class PessoaControlador { function mostra() { $pessoa = new Pessoa( 'Maria' , '(86)3323-1234' ); require_once ( 'pessoa_visao.php' ); } } $pc = new PessoaControlador(); $pc ->mostra(); ?>
  • 11.
    Visão - pessoa_visao.php< html > < head > < title > Pessoa </ title > </ head > < body > < h1 > Pessoa - Visão </ h1 > < p > Nome: <? = $pessoa ->getNome() ?> </ p > < p > Fone: <? = $pessoa ->getFone() ?> </ p > </ body > </ html >
  • 12.
    Exemplo 2 –MVC com Dispatcher Usando um front-controller ou dispatcher Há um controlador principal (index.php) que despacha as requisições para controladores e ações específicos. Controladores e ações específicos são definidos pelos parâmetros da URL do dispatcher: http://localhost/mvc/index.php?controlador=pessoa&acao=mostra No nosso exemplo, o dispatcher: Instancia o controlador especificado Executa o método (ação) especificado do controlador instanciado.
  • 13.
    Dispatcher - index.php<?php $arq_controlador = $_GET [controlador]. '_controlador' ; $acao = $_GET [acao]; $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 ; call_user_func( array ( $obj , $acao ), $_REQUEST ); ?>
  • 14.
    Controlador - pessoa_controlador.php<?php require_once ( 'pessoa.php' ); class PessoaControlador { function mostra() { $pessoa = new Pessoa( 'Maria' , '(86)3323-1234' ); require_once ( 'pessoa_visao.php' ); } } ?>
  • 15.
    Usando convenções Podemosconvencionar algumas coisas. Se um controlador não for definido, podemos usar um controlador padrão chamado de HomeControlador , por exemplo. Caso uma ação não tenha sido definida, usamos a ação index , por exemplo. Assim, se nada for dito, a ação index do controlador HomeControlador será executada. Para isso, devemos alterar nosso dispatcher...
  • 16.
    Convenções no Dispatcher<?php $arquivo_controlador = $_GET [controlador] ? $_GET [controlador]. '_controlador' : 'home_controlador' ; $acao = $_GET [acao] ? $_GET [acao] : 'index' ; $classe_controlador = str_replace( '_' , ' ' , $arquivo_controlador ); $classe_controlador = ucwords( $classe_controlador ); $classe_controlador = str_replace( ' ' , '' , $classe_controlador ); require_once ( $arquivo_controlador . '.php' ); $obj = new $classe_controlador ; call_user_func( array ( $obj , $acao ), $_REQUEST ); ?>
  • 17.
    Problemas Podemos enviarrequisições que não passam pelo dispatcher. Seria mais interessante o dispatcher centralizar o tratamento de todas as requisições. Enviar o nome do controlador e da ação via parâmetros deixa a URL muito longa e ainda diminui sua legibilidade. Seria melhor padronizarmos uma URL mais resumida para definirmos o nome do controlador e da ação.
  • 18.
    Solução Uma soluçãobastante interessante para os problemas abordados é a reescrita de URL. Com esse recurso podemos fazer a seguinte convençã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 no controlador.
  • 19.
    Reescrita de URLPara usarmos reescrita de URL, precisamos habilitar o módulo de reescrita do Apache: No arquivo: C:\xampplite\apache\conf\httpd.conf descomente a seguinte linha: LoadModule rewrite_module modules/mod_rewrite.so Depois disso, criamos nossas regras de reescrita no arquivo .htaccess no diretório raiz da aplicação: <IfModule mod_rewrite.c> RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-f RewriteRule ^(.*)$ index.php?url=$1 [QSA,L] </IfModule>
  • 20.
    Testando a Reescrita- index.php <?php $parametros = explode( '/' , $_GET [ 'url' ]); $controlador = $parametros [ 0 ]; $acao = $parametros [ 1 ]; ?> < html > < head > < title > Testa Reescrita </ title > </ head > < body > < h1 > Testa Reescrita </ h1 > < p > URL: <? = $_GET [ 'url' ] ?> </ p > < p > Controlador: <? = $controlador ?> </ p > < p > Ação: <? = $acao ?> </ p > </ body > </ html >