Académique Documents
Professionnel Documents
Culture Documents
Busca
Busca
DigitalDev
Para quem gosta de programar
Incio
Linguagens, para que servem?
DigitalDev > Padres de Projeto > MVC > Exemplo de MVC com PHP
Nesse artigo irei demonstrar na prtica, a aplicao do padro de projeto MVC com PHP. Para isso,
construirei um aplicativo de Agenda de Contatos Telefnicos conforme requisitos funcionais,
diagramas e cdigo que sero mostrados ao longo desse texto. Mas, antes de comear, aconselho a
vocs que leiam o artigo de introduo a MVC, o mesmo poder ser visualizado acessando o link
Entendendo o MVC (Model-View-Controller).
Hierarquia de Diretrios
Conforme a Imagem 1, irei seguir um padro de hierarquia de diretrios e arquivos, vou explicar sobre
as responsabilidades dos diretrios e arquivos logo abaixo.
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
1/33
23/7/2014
Diretrio controllers
Conforme se pode deduzir pelo nome, irei us-lo para guardar as classes da camada de controle do
sistema, as famosas classes controladoras ou controllers, responsveis por fazer o intermdio entre a
camada de dados (models ou modelos) e visualizao (views), conforme o artigo de introduo a
MVC citado acima.
Diretrio databases
Por se tratar de um projeto apenas de exemplo, irei persistir os dados dos contatos e telefones usando
um banco de dados SQLite, nesse diretrio que o arquivo referente ao banco ficar.
Caso queria conectar a aplicao com o MySQL, veja como no fim do artigo
Diretrio lib
Nesse diretrio, irei guardar as classes diretamente ligadas ao sistema, como por exemplo, classes de
filtros de dados, validaes genricas, helpers (caso haja algum), interfaces e abstraes no ligadas
camada de negcio do sistema. Se estivesse construindo um framework em PHP, guardaria as classes
do mesmo nesse diretrio.
Diretrio models
Aqui, guardarei as classes de dados diretamente abstradas e ligadas s regras de negcio do sistema,
como por exemplo, as classes Contato e Telefone, entre outras.
Diretrio views
Esse o diretrio onde guardarei os arquivos HTML do sistema, tais arquivos representam a camada de
visualizao (view), da qual foi falada no artigo de introduo ao MVC.
Arquivo index.php
um arquivo ndex como qualquer outro, nele que a execuo do sistema ir comear.
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
2/33
23/7/2014
Conforme vocs devem ter visto acima, usei o sufixo Controller no nome da classe e Action no nome
do mtodo. Esse o padro de nomenclatura que irei utilizar em todas as outras classes da camada
Controle e seus mtodos. Alm disso, nomearei os arquivos que iro conter as classes com o mesmo
nome da prpria classe.
A segunda classe que implementarei ser a Application. A responsabilidade da mesma ser a de
verificar qual classe da camada de controle (Controller) e qual mtodo da classe (Action) o usurio
deseja executar. D uma olhada no cdigo abaixo, espero que ele seja simples o suficiente para
esclarecer seu modo de funcionamento.
<?php
/**
* Camada - Controller
* Diretrio Pai - lib
* Arquivo - Application.php
**/
/**
* Essa funo garante que todas as classes
* da pasta lib sero carregadas automaticamente
*/
function __autoload($st_class)
{
if(file_exists('lib/'.$st_class.'.php'))
require_once 'lib/'.$st_class.'.php';
}
/**
* Verifica qual classe controlador (Controller) o usurio deseja chamar
* e qual mtodo dessa classe (Action) deseja executar
* Caso o controlador (controller) no seja especificado, o IndexControllers ser o padro
* Caso o mtodo (Action) no seja especificado, o indexAction ser o padro
*
* @package Exemplo simples com MVC
* @author DigitalDev
* @version 0.1.1
**/
class Application
{
/**
* Usada pra guardar o nome da classe
* de controle (Controller) a ser executada
* @var string
*/
protected $st_controller;
/**
* Usada para guardar o nome do metodo da
* classe de controle (Controller) que dever ser executado
* @var string
*/
protected $st_action;
/**
* Verifica se os parmetros de controlador (Controller) e ao (Action) foram
* passados via parmetros "Post" ou "Get" e os carrega tais dados
* nos respectivos atributos da classe
*/
private function loadRoute()
{
/*
* Se o controller nao for passado por GET,
* assume-se como padro o controller 'IndexController';
*/
$this->st_controller = isset($_REQUEST['controle']) ? $_REQUEST['controle'] : 'Index';
/*
* Se a action nao for passada por GET,
* assume-se como padro a action 'IndexAction';
*/
$this->st_action = isset($_REQUEST['acao']) ? $_REQUEST['acao'] : 'index';
}
/**
*
* Instancia classe referente ao Controlador (Controller) e executa
* mtodo referente e acao (Action)
* @throws Exception
*/
public function dispatch()
{
$this->loadRoute();
//verificando se o arquivo de controle existe
$st_controller_file = 'controllers/'.$this->st_controller.'Controller.php';
if(file_exists($st_controller_file))
require_once $st_controller_file;
else
throw new Exception('Arquivo '.$st_controller_file.' nao encontrado');
//verificando se a classe existe
$st_class = $this->st_controller.'Controller';
if(class_exists($st_class))
$o_class = new $st_class;
else
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
3/33
23/7/2014
}
/**
* Redireciona a chamada http para outra pgina
* @param string $st_uri
*/
static function redirect( $st_uri )
{
header("Location: $st_uri");
}
}
?>
Apesar da classe acima no ter semelhana alguma com a classe IndexController que escrevi, ela
tambm faz parte da camada de controle (Controller), mas est num nvel mais acima. O fato dela ser
responsvel por verificar qual controlador (Controller) e qual mtodo (Action) ir executar, faz da
mesma o corao do sistema.
A terceira classe que irei implementar ser responsvel por cuidar da camada de visualizao. Apesar
de cdigo um pouco extenso, ela uma classe sem muitas funcionalidade, mas poder ser enriquecida
de acordo com nossas necessidades futuras.
<?php
/**
* Essa classe responsvel por renderizar os arquivos HTML
*
* @package Exemplo simples com MVC
* @author DigitalDev
* @version 0.1.1
*
* Diretrio Pai - lib
* Arquivo - View.php
*/
class View
{
/**
* Armazena o contedo HTML
* @var string
*/
private $st_contents;
/**
* Armazena o nome do arquivo de visualizao
* @var string
*/
private $st_view;
/**
* Armazena os dados que devem ser mostrados ao reenderizar o
* arquivo de visualizao
* @var Array
*/
private $v_params;
/**
* possivel efetuar a parametrizao do objeto ao instanciar o mesmo,
* $st_view o nome do arquivo de visualizao a ser usado e
* $v_params so os dados que devem ser utilizados pela camada de visualizao
*
* @param string $st_view
* @param Array $v_params
*/
function __construct($st_view = null, $v_params = null)
{
if($st_view != null)
$this->setView($st_view);
$this->v_params = $v_params;
}
/**
* Define qual arquivo html deve ser renderizado
* @param string $st_view
* @throws Exception
*/
public function setView($st_view)
{
if(file_exists($st_view))
$this->st_view = $st_view;
else
throw new Exception("View File '$st_view' don't exists");
}
/**
* Retorna o nome do arquivo que deve ser renderizado
* @return string
*/
public function getView()
{
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
4/33
23/7/2014
}
/**
* Define os dados que devem ser repassados view
* @param Array $v_params
*/
public function setParams(Array $v_params)
{
$this->v_params = $v_params;
}
/**
* Retorna os dados que foram ser repassados ao arquivo de visualizao
* @return Array
*/
public function getParams()
{
return $this->v_params;
}
/**
* Retorna uma string contendo todo
* o conteudo do arquivo de visualizao
*
* @return string
*/
public function getContents()
{
ob_start();
if(isset($this->st_view))
require_once $this->st_view;
$this->st_contents = ob_get_contents();
ob_end_clean();
return $this->st_contents;
}
/**
* Imprime o arquivo de visualizao
*/
public function showContents()
{
echo $this->getContents();
exit;
}
}
?>
Os dados de algumas classes da camada de modelo devero persistir no banco de dados, para isso,
ser necessrio a implementao de pequeno bloco de cdigo responsvel pela conexo entre o sistema
e o SGDB. A alternativa que adotarei ser a de implementar uma classe abstrata, que dever ser
herdada pelas classes em que os dados devero ser armazenados no banco de dados. Veja cdigo da
classe abstrata a seguir.
<?php
/**
* Classe Abstrata responsvel por centralizar a conexo
* com o banco de dados
*
* @package Exemplo simples com MVC
* @author DigitalDev
* @version 0.1.1
*
* Diretrio Pai - lib
* Arquivo - PersistModelAbstract.php
*/
abstract class PersistModelAbstract
{
/**
* Varivel responsvel por guardar dados da conexo do banco
* @var resource
*/
protected $o_db;
function __construct()
{
// Inicio de conexo com SQLite
$this->o_db = new PDO("sqlite:./databases/db.sq3");
$this->o_db->setAttribute ( PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION );
// Fim de conexo com SQLite
/*
//Inicio de conexo com MySQL
$st_host = 'ip ou host';
$st_banco = 'bancodedados';
$st_usuario = 'usuario';
$st_senha = 'senha';
$st_dsn = "mysql:host=$st_host;dbname=$st_banco";
$this->o_db = new PDO
(
$st_dsn,
$st_usuario,
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
5/33
23/7/2014
}
}
?>
Conforme Vocs j devem ter visto, a classe PersistModelAbstract faz referncia ao arquivo db.sq3
dentro do diretrio databases, esse arquivo ser o responsvel por guardar nossos dados. Irei mostrar
isso na prtica com o continuar desse artigo.
Implementarei tambm, duas outras pequenas classes, a primeira ser usada para filtrar os dados
passados via POST e GET e a segunda ser usada para validar os dados. Irei cham-las de
DataFilter e DataValidator, respectivamente.
<?php
/**
* Classe designada a filtragem de dados
*
* @package Exemplo simples com MVC
* @author DigitalDev
* @version 0.1.1
*
* Diretrio Pai - lib
* Arquivo - DataFilter.php
*/
class DataFilter
{
/**
* Retira pontuacao da string
* @param string $st_data
* @return string
*/
static function alphaNum( $st_data )
{
$st_data = preg_replace("([[:punct:]]| )",'',$st_data);
return $st_data;
}
/**
* Retira caracteres nao numericos da string
* @param string $st_data
* @return string
*/
static function numeric( $st_data )
{
$st_data = preg_replace("([[:punct:]]|[[:alpha:]]| )",'',$st_data);
return $st_data;
}
/**
*
* Retira tags HTML / XML e adiciona "\" antes
* de aspas simples e aspas duplas
* @param string $st_string
*/
static function cleanString( $st_string )
{
return addslashes(strip_tags($st_string));
}
}
?>
<?php
/**
* Classe designada a validacao de formato de dados
*
* @package Exemplo simples com MVC
* @author DigitalDev
* @version 0.1.1
*
* Diretrio Pai - lib
* Arquivo - DataValidator.php
*/
class DataValidator
{
/**
* Verifica se o dado passado esta vazio
* @param mixed $mx_value
* @return boolean
*/
static function isEmpty( $mx_value )
{
if(!(strlen($mx_value) > 0))
return true;
return false;
}
/**
* Verifica se o dado passado e um numero
* @param mixed $mx_value;
* @return boolean
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
6/33
23/7/2014
*/
static function isNumeric( $mx_value )
{
$mx_value = str_replace(',', '.', $mx_value);
if(!(is_numeric($mx_value)))
return false;
return true;
}
/**
* Verifica se o dado passado e um numero inteiro
* @param mixed $mx_value;
* @return boolean
*/
static function isInteger( $mx_value )
{
if(!DataValidator::isNumeric($mx_value))
return false;
if(preg_match('/[[:punct:]&^-]/', $mx_value) > 0)
return false;
return true;
}
}
?>
Por fim, irei implementar o cdigo do arquivo index.php, o mesmo ser extremamente simples. Veja
abaixo.
<?php
/**
* Primeiro arquivo a ser executado.
* aqui que tudo comea
*
* @package Exemplo simples com MVC
* @author DigitalDev
* @version 0.1.1
*
* Diretrio Pai - raiz do site
* Arquivo - index.php
*/
//configurando o PHP para mostrar os erros na tela
ini_set('display_errors', 1);
//configurando o PHP para reportar todo e qualquer erro
error_reporting(E_ALL);
require_once 'lib/Application.php';
$o_Application = new Application();
$o_Application->dispatch();
?>
Nesse estgio de desenvolvimento, a hierarquia de diretrios e arquivos deve se dar como a Imagem 2
mostrada abaixo.
A Camada de Negcios
Agora, com as classes do sistema implementadas, irei finalmente me preocupar com as regras de
negcio da Agenda Telefnica. Veja a documentao abaixo.
Lista de requisitos
Permitir ao usurio visualizar a lista de contatos na tela principal do sistema.
Permitir ao usurio administrar o cadastro de contatos.
Permitir ao usurio, selecionar o contato e visualizar os telefones do mesmo.
Permitir ao usurio administrar o cadastro de telefones do contato selecionado.
Permitir ao usurio cadastrar n telefones para o contato selecionado.
Diagrama de Casos de Uso
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
7/33
23/7/2014
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
8/33
23/7/2014
* @author DigitalDev
* @version 0.1.1
*
* Camada - Modelo ou Model.
* Diretrio Pai - models
* Arquivo - ContatoModel.php
**/
class ContatoModel extends PersistModelAbstract
{
private $in_id;
private $st_nome;
private $st_email;
function __construct()
{
parent::__construct();
//executa mtodo de criao da tabela de Telefone
$this->createTableContato();
}
/**
* Setters e Getters da
* classe ContatoModel
*/
public function setId( $in_id )
{
$this->in_id = $in_id;
return $this;
}
public function getId()
{
return $this->in_id;
}
public function setNome( $st_nome )
{
$this->st_nome = $st_nome;
return $this;
}
public function getNome()
{
return $this->st_nome;
}
public function setEmail( $st_email )
{
$this->st_email = $st_email;
return $this;
}
public function getEmail()
{
return $this->st_email;
}
/**
* Retorna um array contendo os contatos
* @param string $st_nome
* @return Array
*/
public function _list( $st_nome = null )
{
if(!is_null($st_nome))
$st_query = "SELECT * FROM tbl_contato WHERE con_st_nome LIKE '%$st_nome%';";
else
$st_query = 'SELECT * FROM tbl_contato;';
$v_contatos = array();
try
{
$o_data = $this->o_db->query($st_query);
while($o_ret = $o_data->fetchObject())
{
$o_contato = new ContatoModel();
$o_contato->setId($o_ret->con_in_id);
$o_contato->setNome($o_ret->con_st_nome);
$o_contato->setEmail($o_ret->con_st_email);
array_push($v_contatos, $o_contato);
}
}
catch(PDOException $e)
{}
return $v_contatos;
}
/**
* Retorna os dados de um contato referente
* a um determinado Id
* @param integer $in_id
* @return ContatoModel
*/
public function loadById( $in_id )
{
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
9/33
23/7/2014
}
/**
* Salva dados contidos na instancia da classe
* na tabela de contato. Se o ID for passado,
* um UPDATE ser executado, caso contrrio, um
* INSERT ser executado
* @throws PDOException
* @return integer
*/
public function save()
{
if(is_null($this->in_id))
$st_query = "INSERT INTO tbl_contato
(
con_st_nome,
con_st_email
)
VALUES
(
'$this->st_nome',
'$this->st_email'
);";
else
$st_query = "UPDATE
tbl_contato
SET
con_st_nome = '$this->st_nome',
con_st_email = '$this->st_email'
WHERE
con_in_id = $this->in_id";
try
{
if($this->o_db->exec($st_query) > 0)
if(is_null($this->in_id))
{
/*
* verificando se o driver usado sqlite e pegando o ultimo id inserido
* por algum motivo, a funo nativa do PDO::lastInsertId() no funciona com sqlite
*/
if($this->o_db->getAttribute(PDO::ATTR_DRIVER_NAME) === 'sqlite')
{
$o_ret = $this->o_db->query('SELECT last_insert_rowid() AS con_in_id')->fetchObject();
return $o_ret->con_in_id;
}
else
return $this->o_db->lastInsertId();
}
else
return $this->in_id;
}
catch (PDOException $e)
{
throw $e;
}
return false;
}
/**
* Deleta os dados persistidos na tabela de
* contato usando como referencia, o id da classe.
*/
public function delete()
{
if(!is_null($this->in_id))
{
$st_query = "DELETE FROM
tbl_contato
WHERE con_in_id = $this->in_id";
if($this->o_db->exec($st_query) > 0)
return true;
}
return false;
}
/**
* Cria tabela para armazernar os dados de contato, caso
* ela ainda no exista.
* @throws PDOException
*/
private function createTableContato()
{
/*
* No caso do Sqlite, o AUTO_INCREMENT automtico na chave primaria da tabela
* No caso do MySQL, o AUTO_INCREMENT deve ser especificado na criao do campo
*/
if($this->o_db->getAttribute(PDO::ATTR_DRIVER_NAME) === 'sqlite')
$st_auto_increment = '';
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
10/33
23/7/2014
}
}
?>
/**
* Setters e Getters da
* classe TelefoneModel
*/
public function setId( $in_id )
{
$this->in_id = $in_id;
return $this;
}
public function getId()
{
return $this->in_id;
}
public function setDDD( $in_ddd )
{
$this->in_ddd = $in_ddd;
return $this;
}
public function getDDD()
{
return $this->in_ddd;
}
public function setTelefone( $in_telefone )
{
$this->in_telefone = $in_telefone;
return $this;
}
public function getTelefone()
{
return $this->in_telefone;
}
public function setContatoId( $in_contato_id )
{
$this->in_contato_id = $in_contato_id;
return $this;
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
11/33
23/7/2014
}
public function getContatoId()
{
return $this->in_contato_id;
}
/**
* Retorna um array contendo os telefones
* de um determinado contato
* @param integer $in_contato_id
* @return Array
*/
public function _list( $in_contato_id )
{
$st_query = "SELECT * FROM tbl_telefone WHERE con_in_id = $in_contato_id";
$v_telefones = array();
try
{
$o_data = $this->o_db->query($st_query);
while($o_ret = $o_data->fetchObject())
{
$o_telefone = new TelefoneModel();
$o_telefone->setId($o_ret->tel_in_id);
$o_telefone->setDDD($o_ret->tel_in_ddd);
$o_telefone->setTelefone($o_ret->tel_in_telefone);
$o_telefone->setContatoId($o_ret->con_in_id);
array_push($v_telefones,$o_telefone);
}
}
catch(PDOException $e)
{}
return $v_telefones;
}
/**
* Retorna os dados de um telefone referente
* a um determinado Id
* @param integer $in_id
* @return TelefoneModel
*/
public function loadById( $in_id )
{
$v_contatos = array();
$st_query = "SELECT * FROM tbl_telefone WHERE tel_in_id = $in_id;";
try
{
$o_data = $this->o_db->query($st_query);
$o_ret = $o_data->fetchObject();
$this->setId($o_ret->tel_in_id);
$this->setDDD($o_ret->tel_in_ddd);
$this->setTelefone($o_ret->tel_in_telefone);
$this->setContatoId($o_ret->con_in_id);
return $this;
}
catch(PDOException $e)
{}
return false;
}
/**
* Salva dados contidos na instancia da classe
* na tabela de telefone. Se o ID for passado,
* um UPDATE ser executado, caso contrrio, um
* INSERT ser executado
* @throws PDOException
* @return integer
*/
public function save()
{
if(is_null($this->in_id))
$st_query = "INSERT INTO tbl_telefone
(
con_in_id,
tel_in_ddd,
tel_in_telefone
)
VALUES
(
$this->in_contato_id,
'$this->in_ddd',
'$this->in_telefone'
);";
else
$st_query = "UPDATE
tbl_telefone
SET
tel_in_ddd = '$this->in_ddd',
tel_in_telefone = '$this->in_telefone'
WHERE
tel_in_id = $this->in_id";
try
{
if($this->o_db->exec($st_query) > 0)
if(is_null($this->in_id))
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
12/33
23/7/2014
}
/**
* Deleta os dados persistidos na tabela de
* telefone usando como referencia, o id da classe.
*/
public function delete()
{
if(!is_null($this->in_id))
{
$st_query = "DELETE FROM
tbl_telefone
WHERE tel_in_id = $this->in_id";
if($this->o_db->exec($st_query) > 0)
return true;
}
return false;
}
/**
* Cria tabela para armazernar os dados de telefone, caso
* ela ainda no exista.
* @throws PDOException
*/
private function createTableTelefone()
{
/*
* No caso do Sqlite, o AUTO_INCREMENT automtico na chave primaria da tabela
* No caso do MySQL, o AUTO_INCREMENT deve ser especificado na criao do campo
*/
if($this->o_db->getAttribute(PDO::ATTR_DRIVER_NAME) === 'sqlite')
$st_auto_increment = '';
else
$st_auto_increment = 'AUTO_INCREMENT';
Depois das classes da camada de modelo implementadas, o prximo passo escrever o cdigo das
classes de controle referente ao fluxo de gerenciamento das classes acima. Elas tambm sero duas,
ContatoController e TelefoneController.
<?php
//incluindo classes da camada Model
require_once 'models/ContatoModel.php';
/**
* Responsvel por gerenciar o fluxo de dados entre
* a camada de modelo e a de visualizao
*
* @package Exemplo simples com MVC
* @author DigitalDev
* @version 0.1.1
*
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
13/33
23/7/2014
/**
* Gerencia a requisies de criao
* e edio dos contatos
*/
public function manterContatoAction()
{
$o_contato = new ContatoModel();
//verificando se o id do contato foi passado
if( isset($_REQUEST['in_con']) )
//verificando se o id passado valido
if( DataValidator::isNumeric($_REQUEST['in_con']) )
//buscando dados do contato
$o_contato->loadById($_REQUEST['in_con']);
if(count($_POST) > 0)
{
$o_contato->setNome(DataFilter::cleanString($_POST['st_nome']));
$o_contato->setEmail(DataFilter::cleanString($_POST['st_email']));
//salvando dados e redirecionando para a lista de contatos
if($o_contato->save() > 0)
Application::redirect('?controle=Contato&acao=listarContato');
}
$o_view = new View('views/manterContato.phtml');
$o_view->setParams(array('o_contato' => $o_contato));
$o_view->showContents();
}
/**
* Gerencia a requisies de excluso dos contatos
*/
public function apagarContatoAction()
{
if( DataValidator::isNumeric($_GET['in_con']) )
{
//apagando o contato
$o_contato = new ContatoModel();
$o_contato->loadById($_GET['in_con']);
$o_contato->delete();
//Apagando os telefones do contato
$o_telefone = new TelefoneModel();
$v_telefone = $o_telefone->_list($_GET['in_con']);
foreach($v_telefone AS $o_telefone)
$o_telefone->delete();
Application::redirect('?controle=Contato&acao=listarContato');
}
}
}
?>
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
14/33
23/7/2014
*
* Camada - Controladores ou Controllers
* Diretrio Pai - controllers
* Arquivo - TelefoneController.php
*/
class TelefoneController
{
/**
* Efetua a manipulao dos modelos necessrios
* para a aprensentao da lista de telefones do contato
*/
public function listarTelefonesAction()
{
if( isset($_REQUEST['in_con']) )
if( DataValidator::isNumeric($_REQUEST['in_con']) )
{
$o_contato = new ContatoModel();
$o_contato->loadById($_REQUEST['in_con']);
$o_telefone = new TelefoneModel();
$v_telefones = $o_telefone->_list($_GET['in_con']);
$o_view = new View('views/listarTelefones.phtml');
$o_view->setParams(array('o_contato' => $o_contato,'v_telefones' => $v_telefones));
$o_view->showContents();
}
}
/**
* Gerencia a requisies de criao
* e edio dos telefones do contato
*/
public function manterTelefoneAction()
{
$o_contato = new ContatoModel();
$o_telefone = new TelefoneModel();
if( isset($_REQUEST['in_con']) )
if( DataValidator::isInteger($_REQUEST['in_con']) )
$o_contato->loadById($_REQUEST['in_con']);
if( isset($_REQUEST['in_tel']) )
if( DataValidator::isInteger($_REQUEST['in_tel']) )
$o_telefone->loadById($_REQUEST['in_tel']);
if(count($_POST) > 0)
{
$o_telefone->setDDD(DataFilter::numeric($_POST['in_ddd']));
$o_telefone->setTelefone(DataFilter::numeric($_POST['in_telefone']));
$o_telefone->setContatoId($o_contato->getId());
if($o_telefone->save() > 0)
Application::redirect('?controle=Telefone&acao=listarTelefones&in_con='.$o_contato->getId());
}
$o_view = new View('views/manterTelefone.phtml');
$o_view->setParams(array('o_contato' => $o_contato,'o_telefone' => $o_telefone));
$o_view->showContents();
}
/**
* Gerencia a requisies de excluso de telefones do contato
*/
public function apagarTelefoneAction()
{
if( isset($_GET['in_tel']) )
if( DataValidator::isInteger($_GET['in_tel']))
{
$o_telefone = new TelefoneModel();
$o_telefone->loadById($_GET['in_tel']);
$o_telefone->delete();
Application::redirect('?controle=Telefone&acao=listarTelefones&in_con='.$_GET['in_con']);
}
}
}
?>
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
15/33
23/7/2014
</head>
<body>
<div align="center">
<table width="80%" border="1">
<tr>
<th>
ID
</th>
<th>
Nome
</th>
<th>
E-mail
</th>
<th colspan="3">
Ações
</th>
</tr>
<?php
foreach($v_contatos AS $o_contato)
{
?>
<tr>
<td>
<?php echo $o_contato->getId()?>
</td>
<td>
<?php echo $o_contato->getNome()?>
</td>
<td>
<?php echo $o_contato->getEmail()?>
</td>
<td align="center">
<a href='?controle=Telefone&acao=listarTelefones&in_con=<?php echo $o_contato->getId()?>'>Telefones</a>
</td>
<td align="center">
<a href='?controle=Contato&acao=manterContato&in_con=<?php echo $o_contato->getId()?>'>Editar</a>
</td>
<td align="center">
<a href='?controle=Contato&acao=apagarContato&in_con=<?php echo $o_contato->getId()?>'>Apagar</a>
</td>
</tr>
<?php
}
?>
</table>
<br />
<a href='?controle=Contato&acao=manterContato'>Novo Contato</a>
</div>
</body>
</html>
Arquivo listarTelefones.phtml
Diretrio Pai views
<?php
$v_params = $this->getParams();
$o_contato = $v_params['o_contato'];
$v_telefones = $v_params['v_telefones'];
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>
Agenda Teleônica - Exemplo de MVC com PHP
</title>
<link rel="stylesheet" type="text/css" href="template/css/default.css" />
</head>
<body>
<div align="center">
<table width="80%" border="1">
<tr>
<th colspan='3'>
Contato
</th>
</tr>
<tr>
<th>
ID
</th>
<th>
Nome
</th>
<th>
E-mail
</th>
</tr>
<tr>
<td>
<?php echo $o_contato->getId()?>
</td>
<td>
<?php echo $o_contato->getNome()?>
</td>
<td>
<?php echo $o_contato->getEmail()?>
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
16/33
23/7/2014
</td>
</tr>
</table>
<br />
<table width="50%" border="1">
<tr>
<th colspan="5">
Telefones
</th>
</tr>
<tr>
<th>
ID
</th>
<th>
DDD
</th>
<th>
Telefone
</th>
<th colspan="2">
Ações
</th>
</tr>
<?php
foreach($v_telefones AS $o_telefone)
{
?>
<tr>
<td align="center">
<?php echo $o_telefone->getId()?>
</td>
<td align="center">
<?php echo $o_telefone->getDDD()?>
</td>
<td align="center">
<?php echo $o_telefone->getTelefone()?>
</td>
<td align="center">
<a href='?controle=Telefone&acao=apagarTelefone&in_con=<?php echo $o_contato->getId()?>&in_tel=<?php echo $o_telefone
</td>
<td align="center">
<a href='?controle=Telefone&acao=manterTelefone&in_con=<?php echo $o_contato->getId()?>&in_tel=<?php echo $o_telefone
</td>
</tr>
<?php
}
?>
</table>
<br />
<a href='?controle=Index'>Voltar</a>
<a href='?controle=Telefone&acao=manterTelefone&in_con=<?php echo $o_contato->getId()?>'>Novo Telefone</a>
</div>
</body>
</html>
Arquivo manterContato.phtml
Diretrio Pai views
<?php
$v_params = $this->getParams();
$o_contato = $v_params['o_contato'];
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>
Agenda Telefônica - Exemplo de MVC com PHP
</title>
<link rel="stylesheet" type="text/css" href="template/css/default.css" />
</head>
<body>
<div align="center">
<form method='post'>
<table width="300" border="1">
<tr>
<th>
Nome
</th>
<th>
E-mail
</th>
<th colspan="2">
Ações
</th>
</tr>
<tr>
<td>
<input type='text' name='st_nome' value='<?php echo $o_contato->getNome()?>'>
</td>
<td>
<input type='text' name='st_email' value='<?php echo $o_contato->getEmail()?>'>
</td>
<td align="center">
<a href='?controle=Contato&acao=listarContato'>Cancelar</a>
</td>
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
17/33
23/7/2014
<td align="center">
<input type='hidden' name='controle' value='Contato'>
<input type='hidden' name='acao' value='manterContato'>
<input type='hidden' name='in_con' value='<?php echo $o_contato->getId()?>'>
<button type='submit'>Salvar</button>
</td>
</tr>
</table>
</form>
</div>
</body>
</html>
Arquivo manterTelefone.phtml
Diretrio Pai views
<?php
$v_params = $this->getParams();
$o_contato = $v_params['o_contato'];
$o_telefone = $v_params['o_telefone'];
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>
Agenda Telefônica - Exemplo de MVC com PHP
</title>
<link rel="stylesheet" type="text/css" href="template/css/default.css" />
</head>
<body>
<div align="center">
<table width="80%" border="1">
<tr>
<th colspan='3'>
Contato
</th>
</tr>
<tr>
<th>
ID
</th>
<th>
Nome
</th>
<th>
E-mail
</th>
</tr>
<tr>
<td>
<?php echo $o_contato->getId()?>
</td>
<td>
<?php echo $o_contato->getNome()?>
</td>
<td>
<?php echo $o_contato->getEmail()?>
</td>
</tr>
</table>
<br />
<form method='post'>
<table width="40%" border="1">
<tr>
<th colspan="4">
Telefones
</th>
</tr>
<tr>
<th>
DDD
</th>
<th>
Telefone
</th>
<th>
Ações
</th>
</tr>
<tr>
<td align="center">
<input type='text' name='in_ddd' value='<?php echo $o_telefone->getDDD()?>' size="5" maxlength="3">
</td>
<td align="center">
<input type='text' name='in_telefone' value='<?php echo $o_telefone->getTelefone()?>'>
</td>
<td align="center">
<input type='hidden' name='controle' value='Telefone'>
<input type='hidden' name='acao' value='manterTelefone'>
<input type='hidden' name='in_con' value='<?php echo $o_contato->getId()?>'>
<input type='hidden' name='in_tel' value='<?php echo $o_telefone->getId()?>'>
<button type='submit'>Salvar</button>
</td>
</tr>
</table>
</form>
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
18/33
23/7/2014
<br />
<a href='?controle=Telefone&acao=listarTelefones&in_con=<?php echo $o_contato->getId()?>'>Cancelar</a>
</div>
</body>
</html>
Cada mtodo (Action) da classe de controle (Controller) faz referncia um arquivo HTML (View).
Assim se cumpre a profecia de intermdio entre a camada de controle e a camada de visualizao. Onde
o controle faz consultas camada de modelo e repassa a resposta para a camada de visualizao.
Aps o cdigo implementado, para selecionar o Controlador e a Ao que quer executar, basta envialas via GET ou POST, como por exemplo ?controle=Contato&acao=listarContato. Com esses
parmetros, o mtodo listarContatoAction da classe ContatoController ser executado.
Para entender um pouco melhor o funcionamento desse programa, visualize o Diagrama de Sequncia
da funcionalidade Listar Contatos mostrado na Imagem 6 abaixo. Ele ser executado por padro
quando nenhum outro for requisitado pelo usurio.
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
19/33
23/7/2014
$st_dsn = "mysql:host=$st_host;dbname=$st_banco";
$this->o_db = new PDO
(
$st_dsn,
$st_usuario,
$st_senha
);
//Fim de conexo com MySQL
}
}
?>
Padres de criao
Abstract Factory, Builder, Factory Method, Prototype, Singleton
Padres estruturais
Adapter, Bridge, Composite, Decorator, Facade, Flyweight, Proxy
Padres comportamentais
Chain of Responsibility, Command, Interpreter, Iterator, Mediator, Memento, Observer, State, Strategy,
Template Method, Visitor
Classe,
Entendendo o MVC
encapsulam ento,
(Model-View herana, com posio Controller)
e agregao
Facebook 53
Intercalando cores
entre linhas de um a
tabela ou lista
usando CSS3
Twitter 7
Tags: Abstract Factory, Adapter, Bridge, Builder, Chain of Responsibility, Command, Composite,
Decorator, design patterns, Exemplos, Facade, Factory Method, Flyweight, Interpreter, Iterator,
Mediator, Memento, MVC, Observer, Padres de Projeto, Prototype, Proxy, Singleton, State,
Strategy, Template Method, Visitor
Sobre o autor
Tarcsio
Bacharel em Engenharia da Computao, programador C / C++ , especialista em PHP, MySQL,
PostgreSQL.
59 comentrios
1 meno
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
20/33
23/7/2014
1.
Isaac Sampaio
2.
Jorge Sampaio
1.
Tarcsio
2.
Eduardo
3.
Jack Makiyama
4.
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
21/33
23/7/2014
cassioroxssio
5.
cassiorox
1.
Tarcsio
6.
Amarildo Lucas
1.
Amarildo Lucas
1.
leandrofb
1.
leandrofb
22/33
23/7/2014
2.
leandrofb
2.
Tarcsio
7.
Almir
1.
Tarcsio
2.
Tarcsio
8.
leandrofb
23/33
23/7/2014
1.
Tarcsio
2.
Tarcsio
9.
Leonardo
10.
Victhor
11.
leandrofb
24/33
23/7/2014
try{
//Conectando ao banco de dados
//$this->o_db = new PDO($sqlite);
//$this->o_db->setAttribute ( PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION );
$this->o_db = new PDO($mysql, $username, $passwd) or print (mysql_error());
$this->o_db->setAttribute ( PDO::ATTR_ERRMODE , PDO::ERRMODE_EXCEPTION );
} catch (PDOException $e) {
echo $e->getMessage();
}
}
e mudei tb no arquivo Application.php a function loadRoute() onde estava index para Index
pq no abria a pagina principal.
12.
Edson
1.
Tarcsio
13.
zegildo
1.
Tarcsio
25/33
23/7/2014
14.
Srgio Novelli
1.
Tarcsio
2.
Tarcsio
15.
Roberto
1.
Tarcsio
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
26/33
23/7/2014
16.
Francis Rodrigues
1.
Tarcsio
1.
Francis Rodrigues
1.
Tarcsio
1.
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
27/33
23/7/2014
2.
Granhani
17.
Ernando A. Mendes
18.
Francis Rodrigues
1.
Tarcsio
1.
Francis Rodrigues
28/33
23/7/2014
2.
Tarcsio
19.
Cristiano Moura
20.
Fabiana Moura
21.
Riguel
22.
Augusto
23.
Dominus Farib
29/33
23/7/2014
crescer nos padres de projetos atuais. Muitos tm medo, mas com este post vemos que no
bicho de sete cabeas
Didaticamente seu post est timo, se algum criticar ou disser que esta faltando ajustes porque
est em outro nvel de conhecimento
Este link vai para meu blog
24.
Carlos Anders
25.
r23k
26.
Helede
27.
adrmasterCarlos Adriano
28.
batistafic
29.
RafaelFerreira
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
30/33
23/7/2014
1.
Tarcsio
1.
RafaelFerreira
30.
Danilo
1.
RafaelFerreira
31/33
23/7/2014
Olha muito simples divida sua view em trs arquivos config.php (define constantes com as
pastas usadas), header.php( cabealho), footer.php(rodap) ento na view independente
s chame o contedo da view incluindo sempre o config, header, o contedo da view atual
e footer se necessrios.. estou fazendo assim
1.
Danilo
Categorias
Programao
PHP
C / C++
JavaScript / Ajax
Banco de Dados
MySQL
PostgreSQL
Frameworks
HTML / XHTML
CSS
Android SDK
MVC
JavaScript / Ajax
Web Servers
Linux
344
views
70 views
32/33
23/7/2014
Encontre-nos no Facebook
DigitalDev
Curtir
ltimos Comentrios
leonepgn em Instalando e configurando o
Zend Framework
Gustavo em Usando mesmo HD externo
no Mac OS X, Windows e Ubuntu
Joo Carlos Almeida em Usando mesmo
HD externo no Mac OS X, Windows e
Ubuntu
Parceiros
Anotaes por Elaine Naomi
Tags
Ambiente de
Programao Banco de dados C++ Classes
Composio Construtores css design patterns
Agregao Ambiente de Desenvolvimento
Projeto
PHP
Copyright
2014 DigitalDev.
Voltar ao topo
Powered by WordPress and the Graphene Theme.
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/
33/33