SlideShare a Scribd company logo
1 of 20
Programação para WEB
Regis Pires Magalhães
regispiresmag@gmail.com
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
Model
(Dados)
View
(apresentação
dos dados)
Controller
envia entrada de dados
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_modelo.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_modelo.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>
<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>
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/pessoa/mostra
 No nosso exemplo, o dispatcher:
 Instancia o controlador especificado
 Executa o método (ação) especificado do controlador
instanciado.
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>
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);
?>
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');
}
}
?>
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 repetidamente 'index.php' para acessar
o dispatcher deixa a URL 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:xamppliteapacheconfhttpd.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:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php/$1 [L]
Reescrita de URL
 No Ubuntu ainda é preciso alterar o AllowOverride
para All no arquivo /etc/apache2/sites-
available/default:
 No XAMPP isso já vem habilitado.
...
<Directory /var/www/>
Options Indexes FollowSymLinks MultiViews
AllowOverride All
Order allow,deny
allow from all
</Directory>
...
Flags de reescrita
 L – Last Rule
 Pára o processo de reescrita e não aplica
regras adicionais.
 Semelhante a um break do C, Java ou PHP.

More Related Content

What's hot

Arquitetura MVC, JavaBeans e DAO
Arquitetura MVC, JavaBeans e DAOArquitetura MVC, JavaBeans e DAO
Arquitetura MVC, JavaBeans e DAOLeonardo Sousa
 
Comtec2010 asp.net mvc
Comtec2010 asp.net mvcComtec2010 asp.net mvc
Comtec2010 asp.net mvcTadeu Matos
 
Knockout JS - Uma framework para aplicações web
Knockout JS - Uma framework para aplicações webKnockout JS - Uma framework para aplicações web
Knockout JS - Uma framework para aplicações webMario Andrade
 
KnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida realKnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida realComunidade NetPonto
 
Desenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São CarlosDesenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São CarlosRodolfo Fadino Junior
 
Lampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 PalestraLampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 PalestraDavid O'Keefe
 
Middleware Reflexivo
Middleware ReflexivoMiddleware Reflexivo
Middleware Reflexivoelliando dias
 
Padrões Arquiteturais - MVC, MVP e MVVM
Padrões Arquiteturais - MVC, MVP e MVVMPadrões Arquiteturais - MVC, MVP e MVVM
Padrões Arquiteturais - MVC, MVP e MVVMAricelio Souza
 
Programação modular - Ferramenta para rotular seções de imagens e realizar bu...
Programação modular - Ferramenta para rotular seções de imagens e realizar bu...Programação modular - Ferramenta para rotular seções de imagens e realizar bu...
Programação modular - Ferramenta para rotular seções de imagens e realizar bu...Rodrigo Ferreira
 
Sistemas Distribuidos, Middleware e RPC
Sistemas Distribuidos, Middleware e RPCSistemas Distribuidos, Middleware e RPC
Sistemas Distribuidos, Middleware e RPClimabezerra
 
Spring Security e Spring Boot Aula - 2018
Spring Security e Spring Boot Aula - 2018Spring Security e Spring Boot Aula - 2018
Spring Security e Spring Boot Aula - 2018André Luiz Forchesatto
 

What's hot (20)

Arquitetura MVC, JavaBeans e DAO
Arquitetura MVC, JavaBeans e DAOArquitetura MVC, JavaBeans e DAO
Arquitetura MVC, JavaBeans e DAO
 
Comtec2010 asp.net mvc
Comtec2010 asp.net mvcComtec2010 asp.net mvc
Comtec2010 asp.net mvc
 
Asp net mvc
Asp net mvcAsp net mvc
Asp net mvc
 
Mvc - Semifinal
Mvc - SemifinalMvc - Semifinal
Mvc - Semifinal
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Camadas
CamadasCamadas
Camadas
 
Middlewares
MiddlewaresMiddlewares
Middlewares
 
Knockout JS - Uma framework para aplicações web
Knockout JS - Uma framework para aplicações webKnockout JS - Uma framework para aplicações web
Knockout JS - Uma framework para aplicações web
 
KnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida realKnockoutJS com ASP.NET MVC3: Utilização na vida real
KnockoutJS com ASP.NET MVC3: Utilização na vida real
 
Arquitetura MVC
Arquitetura MVCArquitetura MVC
Arquitetura MVC
 
Gradle spring-hateoas-Lombok
Gradle spring-hateoas-LombokGradle spring-hateoas-Lombok
Gradle spring-hateoas-Lombok
 
Desenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São CarlosDesenvolvimento web com .NET Core - Meetup São Carlos
Desenvolvimento web com .NET Core - Meetup São Carlos
 
Lampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 PalestraLampada Php Conference Brasil 2007 Palestra
Lampada Php Conference Brasil 2007 Palestra
 
Middleware Reflexivo
Middleware ReflexivoMiddleware Reflexivo
Middleware Reflexivo
 
Padrões Arquiteturais - MVC, MVP e MVVM
Padrões Arquiteturais - MVC, MVP e MVVMPadrões Arquiteturais - MVC, MVP e MVVM
Padrões Arquiteturais - MVC, MVP e MVVM
 
Programação modular - Ferramenta para rotular seções de imagens e realizar bu...
Programação modular - Ferramenta para rotular seções de imagens e realizar bu...Programação modular - Ferramenta para rotular seções de imagens e realizar bu...
Programação modular - Ferramenta para rotular seções de imagens e realizar bu...
 
Fundamentos de arquitetura Web
Fundamentos de arquitetura WebFundamentos de arquitetura Web
Fundamentos de arquitetura Web
 
Framework web 02 - 2016
Framework web 02 - 2016Framework web 02 - 2016
Framework web 02 - 2016
 
Sistemas Distribuidos, Middleware e RPC
Sistemas Distribuidos, Middleware e RPCSistemas Distribuidos, Middleware e RPC
Sistemas Distribuidos, Middleware e RPC
 
Spring Security e Spring Boot Aula - 2018
Spring Security e Spring Boot Aula - 2018Spring Security e Spring Boot Aula - 2018
Spring Security e Spring Boot Aula - 2018
 

Viewers also liked (20)

Php 08 Oo
Php 08 OoPhp 08 Oo
Php 08 Oo
 
Lean Startup
Lean StartupLean Startup
Lean Startup
 
Prog web 09-php-crud-mvc
Prog web 09-php-crud-mvcProg web 09-php-crud-mvc
Prog web 09-php-crud-mvc
 
Prog web 07-pdo
Prog web 07-pdoProg web 07-pdo
Prog web 07-pdo
 
Java 14 Javadoc
Java 14 JavadocJava 14 Javadoc
Java 14 Javadoc
 
Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passos
 
Easy Rails
Easy RailsEasy Rails
Easy Rails
 
Web Scale Data Management
Web Scale Data ManagementWeb Scale Data Management
Web Scale Data Management
 
Pascal Tipos
Pascal TiposPascal Tipos
Pascal Tipos
 
Prog web 01-php-introducao
Prog web 01-php-introducaoProg web 01-php-introducao
Prog web 01-php-introducao
 
Java 15 Jar
Java 15 JarJava 15 Jar
Java 15 Jar
 
Prog web 06-php-oo
Prog web 06-php-ooProg web 06-php-oo
Prog web 06-php-oo
 
Java 01 Java Visao Geral Detalhado
Java 01 Java Visao Geral DetalhadoJava 01 Java Visao Geral Detalhado
Java 01 Java Visao Geral Detalhado
 
Prog web 00-modelo-cliente_servidor_web
Prog web 00-modelo-cliente_servidor_webProg web 00-modelo-cliente_servidor_web
Prog web 00-modelo-cliente_servidor_web
 
Coding Dojo
Coding DojoCoding Dojo
Coding Dojo
 
Prog web 03-php-sessoes-cookies_cabecalhos
Prog web 03-php-sessoes-cookies_cabecalhosProg web 03-php-sessoes-cookies_cabecalhos
Prog web 03-php-sessoes-cookies_cabecalhos
 
Linked Data - Minicurso - SBBD 2011
Linked Data - Minicurso - SBBD 2011Linked Data - Minicurso - SBBD 2011
Linked Data - Minicurso - SBBD 2011
 
Linked Data Tutorial - Conferencia W3C Brasil 2011
Linked Data Tutorial - Conferencia W3C Brasil 2011Linked Data Tutorial - Conferencia W3C Brasil 2011
Linked Data Tutorial - Conferencia W3C Brasil 2011
 
Curso Ruby
Curso RubyCurso Ruby
Curso Ruby
 
Responsive web design
Responsive web designResponsive web design
Responsive web design
 

Similar to Prog web 08-php-mvc

Apresentação Java Web Si Ufc Quixadá - MVC
Apresentação Java Web Si Ufc Quixadá - MVCApresentação Java Web Si Ufc Quixadá - MVC
Apresentação Java Web Si Ufc Quixadá - MVCZarathon Maia
 
Criando APIs com Node e TypeScript
Criando APIs com Node e TypeScriptCriando APIs com Node e TypeScript
Criando APIs com Node e TypeScriptAndre Baltieri
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsEduardo Mendes
 
Apresentação mvc
Apresentação mvcApresentação mvc
Apresentação mvcleopp
 
ASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre TarifaASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre Tarifaguestea329c
 
Slide 01 introdução ao php e ao code igniter
Slide 01   introdução ao php e ao code igniterSlide 01   introdução ao php e ao code igniter
Slide 01 introdução ao php e ao code igniterRaniere de Lima
 
Palestra MVC - Online tech day 2010
Palestra MVC - Online tech day 2010Palestra MVC - Online tech day 2010
Palestra MVC - Online tech day 2010Alexandre Tarifa
 
Utilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações FlexUtilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações FlexEric Cavalcanti
 
Mvc model view controller - java para desenvolvimento web
Mvc   model view controller - java para desenvolvimento webMvc   model view controller - java para desenvolvimento web
Mvc model view controller - java para desenvolvimento webValdir Junior
 
Workshop Ruby on Rails dia 2 ruby-pt
Workshop Ruby on Rails dia 2  ruby-ptWorkshop Ruby on Rails dia 2  ruby-pt
Workshop Ruby on Rails dia 2 ruby-ptPedro Sousa
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Vinícius de Paula
 
ASP.Net MVC 3 - o que há de novo (TechEd)
ASP.Net MVC 3 - o que há de novo (TechEd)ASP.Net MVC 3 - o que há de novo (TechEd)
ASP.Net MVC 3 - o que há de novo (TechEd)Giovanni Bassi
 

Similar to Prog web 08-php-mvc (20)

Php 05 Mvc
Php 05 MvcPhp 05 Mvc
Php 05 Mvc
 
ApresentaçãO Mvc
ApresentaçãO MvcApresentaçãO Mvc
ApresentaçãO Mvc
 
Apresentação M V C
Apresentação M V CApresentação M V C
Apresentação M V C
 
Mvc delphi
Mvc delphiMvc delphi
Mvc delphi
 
Apresentação Java Web Si Ufc Quixadá - MVC
Apresentação Java Web Si Ufc Quixadá - MVCApresentação Java Web Si Ufc Quixadá - MVC
Apresentação Java Web Si Ufc Quixadá - MVC
 
Criando APIs com Node e TypeScript
Criando APIs com Node e TypeScriptCriando APIs com Node e TypeScript
Criando APIs com Node e TypeScript
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
 
Apresentação mvc
Apresentação mvcApresentação mvc
Apresentação mvc
 
ASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre TarifaASP.NET MVC - Alexandre Tarifa
ASP.NET MVC - Alexandre Tarifa
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Slide 01 introdução ao php e ao code igniter
Slide 01   introdução ao php e ao code igniterSlide 01   introdução ao php e ao code igniter
Slide 01 introdução ao php e ao code igniter
 
Palestra MVC - Online tech day 2010
Palestra MVC - Online tech day 2010Palestra MVC - Online tech day 2010
Palestra MVC - Online tech day 2010
 
Utilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações FlexUtilizando o Padrão Presentation Model em Aplicações Flex
Utilizando o Padrão Presentation Model em Aplicações Flex
 
Mvc model view controller - java para desenvolvimento web
Mvc   model view controller - java para desenvolvimento webMvc   model view controller - java para desenvolvimento web
Mvc model view controller - java para desenvolvimento web
 
Programando php com excelência
Programando php com excelênciaProgramando php com excelência
Programando php com excelência
 
Palestra ASP.NET MVC
Palestra ASP.NET MVCPalestra ASP.NET MVC
Palestra ASP.NET MVC
 
Workshop Ruby on Rails dia 2 ruby-pt
Workshop Ruby on Rails dia 2  ruby-ptWorkshop Ruby on Rails dia 2  ruby-pt
Workshop Ruby on Rails dia 2 ruby-pt
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.
 
Arquitetura de sistemas web
Arquitetura de sistemas webArquitetura de sistemas web
Arquitetura de sistemas web
 
ASP.Net MVC 3 - o que há de novo (TechEd)
ASP.Net MVC 3 - o que há de novo (TechEd)ASP.Net MVC 3 - o que há de novo (TechEd)
ASP.Net MVC 3 - o que há de novo (TechEd)
 

More from Regis Magalhães

More from Regis Magalhães (15)

High Dimensional Data
High Dimensional DataHigh Dimensional Data
High Dimensional Data
 
PHP 10 CodeIgniter
PHP 10 CodeIgniterPHP 10 CodeIgniter
PHP 10 CodeIgniter
 
Prog web 05-php-mysql
Prog web 05-php-mysqlProg web 05-php-mysql
Prog web 05-php-mysql
 
Prog web 04-php-gd
Prog web 04-php-gdProg web 04-php-gd
Prog web 04-php-gd
 
Prog web 03-php-sessoes-cookies_cabecalhos
Prog web 03-php-sessoes-cookies_cabecalhosProg web 03-php-sessoes-cookies_cabecalhos
Prog web 03-php-sessoes-cookies_cabecalhos
 
Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passos
 
Prog web 02-php-primeiros-passos
Prog web 02-php-primeiros-passosProg web 02-php-primeiros-passos
Prog web 02-php-primeiros-passos
 
Prog web 00-modelo-cliente_servidor_web
Prog web 00-modelo-cliente_servidor_webProg web 00-modelo-cliente_servidor_web
Prog web 00-modelo-cliente_servidor_web
 
Prog web 01-php-introducao
Prog web 01-php-introducaoProg web 01-php-introducao
Prog web 01-php-introducao
 
Java 01 Java Visao Geral Resumo
Java 01 Java Visao Geral ResumoJava 01 Java Visao Geral Resumo
Java 01 Java Visao Geral Resumo
 
Merci 10 Completo
Merci 10 CompletoMerci 10 Completo
Merci 10 Completo
 
php 01 introducao
php 01 introducaophp 01 introducao
php 01 introducao
 
java 00 Introducao
java 00 Introducaojava 00 Introducao
java 00 Introducao
 
POO Plano de Curso
POO Plano de CursoPOO Plano de Curso
POO Plano de Curso
 
Php 04 Mysql
Php 04 MysqlPhp 04 Mysql
Php 04 Mysql
 

Prog web 08-php-mvc

  • 1. Programação para WEB Regis Pires Magalhães regispiresmag@gmail.com 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 Model (Dados) View (apresentação dos dados) Controller envia entrada de dados exibe o 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.
  • 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_modelo.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_modelo.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> <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. 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/pessoa/mostra  No nosso exemplo, o dispatcher:  Instancia o controlador especificado  Executa o método (ação) especificado do controlador instanciado.
  • 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. 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. 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'); } } ?>
  • 16. 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 repetidamente 'index.php' para acessar o dispatcher deixa a URL longa e ainda diminui sua legibilidade.  Seria melhor padronizarmos uma URL mais resumida para definirmos o nome do controlador e da ação.
  • 17. 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.
  • 18. Reescrita de URL  Para usarmos reescrita de URL, precisamos habilitar o módulo de reescrita do Apache:  No arquivo: C:xamppliteapacheconfhttpd.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: RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]
  • 19. Reescrita de URL  No Ubuntu ainda é preciso alterar o AllowOverride para All no arquivo /etc/apache2/sites- available/default:  No XAMPP isso já vem habilitado. ... <Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all </Directory> ...
  • 20. Flags de reescrita  L – Last Rule  Pára o processo de reescrita e não aplica regras adicionais.  Semelhante a um break do C, Java ou PHP.