Você está na página 1de 33

23/7/2014

Busca

Exemplo de MVC com PHP e outros padres de projeto

Busca

DigitalDev
Para quem gosta de programar
Incio
Linguagens, para que servem?

DigitalDev > Padres de Projeto > MVC > Exemplo de MVC com PHP

Entendendo o MVC (Model-View-Controller)


DigitalDev na Campus Party 2013
jan 22

Exemplo de MVC com PHP


Categorias:
MVC, Padres de Projeto
por Tarcsio

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

Exemplo de MVC com PHP e outros padres de projeto

Imagem 1 Hierarquia de Diretrios e Pastas

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.

Implementao das Classes das Camadas


Classes Primrias ou Genricas
Depois de todos os diretrios explicados, mostrarei a implementao de algumas classes necessrias
para a separao do sistemas em camadas (Modelo Model, Viso View , Controlador
Controller). A primeira delas que mostrarei, a de controlador genrico, no diretamente ligado s
regras de negcio do sistema de Agenda Telefnica. Veja o exemplo abaixo.
<?php
/**
* Controlador que dever ser chamado quando no for
* especificado nenhum outro
*
* @package Exemplo simples com MVC
* @author DigitalDev
* @version 0.1.1
*
* Camada - Controladores ou Controllers
* Diretrio Pai - controllers
* Arquivo - IndexController.php
*/
class IndexController
{
/**
* Ao que dever ser executada quando
* nenhuma outra for especificada, do mesmo jeito que o
* arquivo index.html ou index.php executado quando nenhum
* referenciado
*/
public function indexAction()
{
//redirecionando para a pagina de lista de contatos
header('Location: ?controle=Contato&acao=listarContato');
}
}
?>

http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/

2/33

23/7/2014

Exemplo de MVC com PHP e outros padres de projeto

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

Exemplo de MVC com PHP e outros padres de projeto


throw new Exception("Classe '$st_class' nao existe no arquivo '$st_controller_file'");
//verificando se o metodo existe
$st_method = $this->st_action.'Action';
if(method_exists($o_class,$st_method))
$o_class->$st_method();
else
throw new Exception("Metodo '$st_method' nao existe na classe $st_class'");

}
/**
* 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

Exemplo de MVC com PHP e outros padres de projeto


return $this->st_view;

}
/**
* 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

Exemplo de MVC com PHP e outros padres de projeto


$st_senha
);
//Fim de conexo com MySQL
*/

}
}
?>

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

Exemplo de MVC com PHP e outros padres de projeto

*/
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.

Imagem 2 Hierarquia de Diretrios e Pastas

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

Exemplo de MVC com PHP e outros padres de projeto

Imagem 3 Diagrama de Casos de Uso


Diagrama de Classe
Nesse diagrama, apenas documentarei as classes diretamente ligadas ao sistema de Agenda Telefnica,
a diagramao das classes que implementei acima no ser abordada.

Imagem 4 Diagrama de Classes


Diagrama de Entidade Relacionamento
Pelo fato da necessidade da persistir os dados de contato e dos telefones, ser necessrio duas tabelas
para guardar os dados das classes. Veja o Diagrama de Entidade Relacionamento (DER) abaixo.

Imagem 5 Diagrama de Entidade Relacionamento


Agora que j tenho a arquitetura da camada de negcio j definida, o proximo passo implementar as
classes responsveis por gerenciar as mesmas. Isso mesmo, estou me referendo s classes Contato e
Telefone, e como eu j havia falado, os dados das mesmas devem persistir no banco de dados, por
esse motivo, elas devem herdar a classe PersistModelAbstract.
<?php
//incluindo o arquivo contendo a classe TelefoneModel
require_once 'models/TelefoneModel.php';
/**
* Responsvel por gerenciar e persistir os dados dos
* Contatos da Agenda Telefnica
*
* @package Exemplo simples com MVC

http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/

8/33

23/7/2014

Exemplo de MVC com PHP e outros padres de projeto

* @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

Exemplo de MVC com PHP e outros padres de projeto


$v_contatos = array();
$st_query = "SELECT * FROM tbl_contato WHERE con_in_id = $in_id;";
$o_data = $this->o_db->query($st_query);
$o_ret = $o_data->fetchObject();
$this->setId($o_ret->con_in_id);
$this->setNome($o_ret->con_st_nome);
$this->setEmail($o_ret->con_st_email);
return $this;

}
/**
* 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

Exemplo de MVC com PHP e outros padres de projeto


else
$st_auto_increment = 'AUTO_INCREMENT';
$st_query = "CREATE TABLE IF NOT EXISTS tbl_contato
(
con_in_id INTEGER NOT NULL $st_auto_increment,
con_st_nome CHAR(200),
con_st_email CHAR(100),
PRIMARY KEY(con_in_id)
)";
//executando a query;
try
{
$this->o_db->exec($st_query);
}
catch(PDOException $e)
{
throw $e;
}

}
}
?>

Agora a vez da classe TelefoneModel ser implementada.


<?php
/**
* Responsvel por gerenciar e persistir os dados de telefones dos
* Contatos da Agenda Telefonica
*
* @package Exemplo simples com MVC
* @author DigitalDev
* @version 0.1.1
*
* Camada - Models ou Modelo
* Diretrio Pai - models
* Arquivo - TelefoneModel.php
*/
class TelefoneModel extends PersistModelAbstract
{
private $in_id;
private $in_ddd;
private $in_telefone;
private $in_contato_id;
function __construct()
{
parent::__construct();
//executa mtodo de criao da tabela de Telefone
$this->createTableTelefone();
}

/**
* 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

Exemplo de MVC com PHP e outros padres de projeto

}
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

Exemplo de MVC com PHP e outros padres de projeto


{
/*
* 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 tel_in_id')->fetchObject();
return $o_ret->tel_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
* 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';

$st_query = "CREATE TABLE IF NOT EXISTS tbl_telefone


(
tel_in_id INTEGER NOT NULL $st_auto_increment,
con_in_id INTEGER NOT NULL,
tel_in_ddd CHAR(5),
tel_in_telefone CHAR(12),
PRIMARY KEY(tel_in_id)
)";
//executando a query;
try
{
$this->o_db->exec($st_query);
}
catch(PDOException $e)
{
throw $e;
}
}
}
?>

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

Exemplo de MVC com PHP e outros padres de projeto

* Camada - Controladores ou Controllers


* Diretrio Pai - controllers
* Arquivo - ContatoController.php
*
*/
class ContatoController
{
/**
* Efetua a manipulao dos modelos necessrios
* para a aprensentao da lista de contatos
*/
public function listarContatoAction()
{
$o_Contato = new ContatoModel();
//Listando os contatos cadastrados
$v_contatos = $o_Contato->_list();
//definindo qual o arquivo HTML que ser usado para
//mostrar a lista de contatos
$o_view = new View('views/listarContatos.phtml');
//Passando os dados do contato para a View
$o_view->setParams(array('v_contatos' => $v_contatos));
//Imprimindo cdigo HTML
$o_view->showContents();
}

/**
* 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');
}
}
}
?>

e por sua vez a classe TelefoneController


<?php
//incluindo classes da camada Model
require_once 'models/TelefoneModel.php';
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/

14/33

23/7/2014

Exemplo de MVC com PHP e outros padres de projeto

*
* 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']);
}
}
}
?>

Arquivos de visualizao ou views


As classes implementadas acima esto fazendo referncia arquivos HTML contidos na camada de
visualizao, para esse programa funcionar, ser preciso implement-los. Isso o que irei fazer agora.
Arquivo listarContatos.phtml
Diretrio Pai views
<?php
$v_params = $this->getParams();
$v_contatos = $v_params['v_contatos'];
?>
<!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&ocirc;nica - Exemplo de MVC com PHP
</title>
<link rel="stylesheet" type="text/css" href="template/css/default.css" />

http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/

15/33

23/7/2014

Exemplo de MVC com PHP e outros padres de projeto

</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&ccedil;&otilde;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&ocirc;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

Exemplo de MVC com PHP e outros padres de projeto

</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&ccedil;&otilde;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&ocirc;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&ccedil;&otilde;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

Exemplo de MVC com PHP e outros padres de projeto

<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&ocirc;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&ccedil;&otilde;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

Exemplo de MVC com PHP e outros padres de projeto

<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.

Imagem 6 Diagrama de Sequncia do Caso de Uso Listar Contatos


Quer ver isso funcionando? Acesse o link http://digitaldev.com.br/exemploMVC/
Quer fazer download do cdigo para estudar? Acesse o link
http://digitaldev.com.br/downloads/exemploMVC.zip

Conectando a agenda com o MySQL


Caso voc queira conectar a aplicao desenvolvida com o MySQL, basta editar o arquivo
lib/PersistModelAbstract.php e deix-lo como abaixo, preenchendo apenas os dados da sua conexo
e credenciais referentes.
<?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';

http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/

19/33

23/7/2014

Exemplo de MVC com PHP e outros padres de projeto

$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
}
}
?>

Mais sobre MVC com PHP


H um tempo atrs, encontrei um material em vdeo muito bom sobre como montar um Mini-Framework
no padro MVC com PHP. Para acessar esse videos, clique em Criando um Mini Framework PHP 5
com MVC

Mais sobre Padres de Projeto


O MVC um dos Padres de Projetos mais importantes hoje em dia, mas no est sozinho. Existem
vrios outros padres por ai, eles nos ajudam a organizar o cdigo, resolver problemas que costumamos
enfrentar no dia-dia da Programao Orientada a Objeto. Sendo assim, vale muito a pena estudar sobre
eles, pois um bom programador no aquele que apenas codifica solues excepcionais, mas tambm o
que consegue organizar com clareza seu cdigo. Veja uma lista de alguns padres organizados por suas
categorias abaixo, j um pontap inicial para se estudar. Espero ter ajudado.

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

Talvez voc tambm goste de ler sobre

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

Google

Pinterest

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

Exemplo de MVC com PHP e outros padres de projeto

Pular para o formulrio de comentrio

1.
Isaac Sampaio

25 de janeiro de 2013 em 0:45 (UTC -3)


Responder
Parabns amigo!! Muito bom
artigo!! nota 1000.

2.
Jorge Sampaio

4 de fevereiro de 2013 em 12:58 (UTC -3)


Responder
Cara!!!! Muito bom mesmo sua abordagem. Estou criando um aplicativo, porm, o cdigo j est
muito bagunado e de difcil assimilao, estou comeando a perder o controle do mesmo.
Observando a forma com que vc lidou com seu exemplo, hummmm, fique mais entusiasmado em
refazer o meu apoiado em sua tima explicao. Fico alegre por vc compartilhar seu
conhecimento a favor de outros. Novamente, muito obrigado e at.

1.
Tarcsio

4 de fevereiro de 2013 em 13:31 (UTC -3)


Responder
Obrigado Jorge. Se tiver alguma dvida, entre em contato que eu tentarei ajudar.

2.
Eduardo

2 de dezembro de 2013 em 9:38 (UTC -3)


Responder
Fao das palavras do Jorge Sampaio as minhas. Obrigado por compartilhar tal informao
que, muitos dos que esto comeando OOP tem muita dificuldade.

3.
Jack Makiyama

10 de maro de 2013 em 21:18 (UTC -3)


Responder
Ol Tarcsio obrigado pelo belo material publicado, parabns, foi muito esclarecedor e
didtico.
Nunca trabalhei com phpoo(tirando os web services) nem mvc, mas tenho uma noo. Mas
mesmo depois de ler sua publicao e varias outras que j li, no consigo visualizar eu
trabalhando com mvc. Talvez por falta de conhecimento, ou falta daquele estalo que da na nossa
mente pra cair a fixa. Mesmo conseguindo compreender o que foi proposto. =/.
Estou nessa busca de conseguir entender o suficiente pra mudar minha rotina de trabalho sem que
caia a produo. Mas talvez, s usando mesmo pra sacar a ideia.
Teria algo referente a isso pra me dizer/recomendar?
Mais uma vez, parabns pelo material e obrigado por compartilhar.
o/

4.
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/

21/33

23/7/2014

Exemplo de MVC com PHP e outros padres de projeto

cassioroxssio

4 de abril de 2013 em 12:45 (UTC -3)


Responder
Parabns, empaquei no meu projeto, acredito que o estudo desse cdigo ir me auxiliar!

5.
cassiorox

4 de abril de 2013 em 12:51 (UTC -3)


Responder
Como tenho MySql e no SQLlite, no consegui rodar aqui :S
Vou tentar colocar no MySQL

1.
Tarcsio

18 de julho de 2013 em 15:02 (UTC -3)


Responder
Boa tarde Cassio, eu revisei o cdigo e alterei o mesmo para possibilitar tanto a conexo
com MySQL, quanto com SQLite. Se houver mais alguma dvida, entre em contato.

6.
Amarildo Lucas

7 de abril de 2013 em 13:13 (UTC -3)


Responder
Ol Tarcsio,
Tentei refazer o seu exemplo igualzinho mas usando mysql, no me ocorre erro algum, mas ao
correr o projecto (http://localhost:8888/mvcExemplo/?controle=Usuario&acao=listarUsuario) o
browser fica todo em branco, como se no ocorresse nada. Ainda acredito que o erro est na
forma como lidei para tratar os dados com mysql. Pode me ajudar com esta dvida? Como
estaria a minha classe PersistModelAbstract.php usando mysql?

1.
Amarildo Lucas

11 de abril de 2013 em 8:56 (UTC -3)


Responder
Ok! J consegui resolver. Obrigado!

1.
leandrofb

15 de abril de 2013 em 21:44 (UTC -3)


Responder
Fala Amarildo to tentando usar o MySQL tb e aparece o mxm erro como vc
corrigiu ? vlw

1.
leandrofb

15 de abril de 2013 em 21:56 (UTC -3)


Responder
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/

22/33

23/7/2014

Exemplo de MVC com PHP e outros padres de projeto

Deixa quieto j resolvi tb era besteira uma varivel escrita errado.

2.
leandrofb

15 de abril de 2013 em 22:08 (UTC -3)


Responder
Achei q tinha resolvido mas continua, minha tela est td branca

2.
Tarcsio

18 de julho de 2013 em 15:05 (UTC -3)


Responder
Boa tarde Amarildo, eu revisei o cdigo e alterei o mesmo para possibilitar tanto a conexo
com MySQL, quanto com SQLite. Se houver mais alguma dvida, entre em contato.

7.
Almir

16 de abril de 2013 em 16:15 (UTC -3)


Responder
Boa tarde Tarcsio!
Acabei de ler o seu artigo e ficou muito bom, parabns!
Apenas a classe TelefoneController esta com o codigo da ContatoController.
[]s
Almir

1.
Tarcsio

16 de abril de 2013 em 16:25 (UTC -3)


Responder
Opa Almir, vou verificar os cdigos trocadosObrigado

2.
Tarcsio

18 de julho de 2013 em 15:13 (UTC -3)


Responder
Almir, revisei o cdigo e coloquei as classes em seus devidos lugares. Obrigado pela
observao. Qualquer outro problema, s falar.

8.
leandrofb

16 de abril de 2013 em 17:46 (UTC -3)


Responder
No estou conseguindo fazer funcionar com o MySQL, na hora de salvar a tela fica td branca e
no salva.
Alguem conseguiu fazer funcionar com MySQL ?
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/

23/33

23/7/2014

Exemplo de MVC com PHP e outros padres de projeto

1.
Tarcsio

16 de abril de 2013 em 17:48 (UTC -3)


Responder
No ta mostrando mensagem de erro alguma leandro? Voc consegue fazer selects ou t
quebrando tudo?

2.
Tarcsio

18 de julho de 2013 em 15:07 (UTC -3)


Responder
Boa tarde Leandro.
Revisei e alterei o cdigo, agora ele se conecta tanto com MySQL quanto com SQLite.
Se houver mais alguma dvida, entre em contato

9.
Leonardo

29 de abril de 2013 em 21:25 (UTC -3)


Responder
Cara. Show de bola a sua explicao. A melhor e mais clara que achei na net. Parabns.

10.
Victhor

9 de maio de 2013 em 17:30 (UTC -3)


Responder
Parabens , otimo post, conseg converte para outro banco de dados de uma forma extremamente
simples, show de boa

11.
leandrofb

16 de maio de 2013 em 22:48 (UTC -3)


Responder
Para mim aparece o seguinte erro qd eu aponto para o mysql:
Erro no servidor
O site encontrou um erro ao recuperar http://www.polesystem.com.br/mvc/?
controle=Telefone&acao=manterTelefone&in_con=0. Ele pode estar em manuteno ou
configurado incorretamente.
Veja algumas sugestes:
Recarregue esta pgina da web mais tarde.
Erro HTTP {500 (Internal Server Error): Ocorreu uma condio inesperada enquanto o servidor
tentava completar a solicitao.
Pode acessar a o link para ver tb:
http://www.polesystem.com.br/mvc
o que eu mudei do arquivos foi somente a function no arquivo PersistModelAbstract.php para :
function __construct()
{
$mysql = host;
$username = user;
$passwd = senha;
$sqlite = sqlite:./databases/db.sq3;
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/

24/33

23/7/2014

Exemplo de MVC com PHP e outros padres de projeto

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

17 de maio de 2013 em 15:17 (UTC -3)


Responder
Ola, bom artigo,muito esclarecedor. Sou novado em OO e baixei os arquivos e na hora de
executar, quando rodo a pagina index.php estou com o seguinte erro:
Uncaught exception Exception with message Arquivo controllers/indexController.php nao
encontrado in /home/u810533697/public_html/mvc/lib/Application.php:75 Stack trace: #0
/home/u810533697/public_html/mvc/index.php(7): Application->dispatch() #1 {main} thrown in
/home/u810533697/public_html/mvc/lib/Application.php on line 75
Algum aqui teve esse problema?
Grato

1.
Tarcsio

18 de julho de 2013 em 15:10 (UTC -3)


Responder
Edson, o cdigo foi revisado e o bug foi corrigido. Alem disso, adicionei algumas
alteraes que permitem conectar a aplicao tanto com MySQL quanto com SQLite. Se
achar mais alguma coisa errada ai, entre em contato. Obrigado

13.
zegildo

1 de junho de 2013 em 19:41 (UTC -3)


Responder
Oi, parabns pelo artigo! Apena uma dvida *Model no deveria chamar *DB e a calsse
DataBase realizar as operaes no banco? Ento no *Model eu poderia ter o conceito de
transao interessante para algumas aplicaes. O que voc acha?

1.
Tarcsio

3 de junho de 2013 em 9:42 (UTC -3)


Responder
Bom dia Zegildo.
Tentei usar classes mais simples para demonstrar o funcionamento, evitando assim a diviso
da Camada Model em mais Subcamadas. Mas, conforme a experincia do programador,
vlido a diviso da camada de Model em vrias outras. Eu geralmente costumo criar
classes com sufixo DAO (Data Access Object), onde as mesmas so responsveis pela
persistncia dos dados das classes com sufixo Entity (Entidades como contato, telefone,
endereo).
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/

25/33

23/7/2014

Exemplo de MVC com PHP e outros padres de projeto

14.
Srgio Novelli

7 de junho de 2013 em 14:33 (UTC -3)


Responder
Tarcsio, primeiramente, parabns pelo cdigo.
Estou tentando rodar esse cdigo, mas estou tendo o seguinte erro:
Fatal error: Class PersistModelAbstract not found in
D:\wamp\www\maisumteste\models\TelefoneModel.php on line 15
O fato que no consegue encontrar a classe PersistModelAbstract, porm ela existe. A nica
alterao realizada foi fazer a conexo com mysql:
abstract class PersistModelAbstract {
protected $o_db;
function __construct() {
try{
$this->o_db = new PDO(mysql:host=localhost;dbname=testemvc, root, ,
array(PDO::ATTR_PERSISTENT => true)) or print (mysql_error());
$this->o_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
}
catch (PDOException $e) {
echo $e->getMessage();
}
}
}
Poderia me dar uma dica do que est acontecendo? O uso da classe PDO est correto?
Obrigado.

1.
Tarcsio

18 de junho de 2013 em 13:40 (UTC -3)


Responder
Vou testar o cdigo com o mysql e te dou retorno.

2.
Tarcsio

18 de julho de 2013 em 15:04 (UTC -3)


Responder
Sergio, eu retestei e revisei o cdigo para corrigir alguns pequenos erros. Esse erro
relatado por voc foi corrigido. Obrigado.

15.
Roberto

18 de junho de 2013 em 0:03 (UTC -3)


Responder
Boa noite Tarcsio, fico no aguardo do cdigo repetido. (TelefoneController) Tentei fazer mas
no consegui muito sucesso. Abraos e valeu pelo grande post!

1.
Tarcsio

http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/

26/33

23/7/2014

Exemplo de MVC com PHP e outros padres de projeto

18 de julho de 2013 em 15:09 (UTC -3)


Responder
Roberto, revisei o cdigo e alterei o post. Agora a classe est no seu devido lugar.
Se achar mais alguma inconsistncia, entre em contato.

16.
Francis Rodrigues

18 de junho de 2013 em 10:26 (UTC -3)


Responder
Gostei muito da estrutura MVC que voc desenvolveu.
Tem algo em mente pra colocar .htaccess nisso pra deixar com query string e url amigvel
tambm?
Esse mtodo de jogar instrues SQL tambm no gostei, mas no sei uma forma de usar meta
queries como o CakePHP faz. Alguma idia?

1.
Tarcsio

18 de junho de 2013 em 13:35 (UTC -3)


Responder
Esse cdigo um exemplo focado em MVCapenas para que programadores iniciantes
entendam como funciona a estrutura. No um projeto de um framework ou algo do tipo.
O SQL no meio do Model apenas para diminuir o nmero de classes e divises da
camada de Modelo, mantendo assim, o foco no entendimento do MVC. Por esse motivo,
no implementei url amigvel.

1.
Francis Rodrigues

28 de junho de 2013 em 23:44 (UTC -3)


Responder
Tarcsio programadores iniciantes?
Essa foi boa hahaha.
Sua estrutura est at melhor que a de muitos frameworks de ponta que diversas
comunidades os usam.
Precisamos criar um parse no html como templates, para evitar usar tanto php junto
com o html, criar rotas de url e deixando as urls amigvels ou no, como o
wordpress e joomla tem, acesso a url com query string ou com modo rewrite tudo
ativo.
Estou interessado em continuar essa estrutura em projeto, quem sabe no criamos
uma estrutura em que muitos podero seguir.
Se estiver interessado, entre em contato.
Abrao.

1.
Tarcsio

30 de junho de 2013 em 12:46 (UTC -3)


Responder
Quando digo Iniciantes, quero dizer que tentei deixar a explicao mais clara
possvel, sem ir muito alem nas estruturas. Porque se eu deixasse o modelo
completo, do jeito que eu trabalho, ficaria mais difcil pro pessoal entender.

1.

http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/

27/33

23/7/2014

Exemplo de MVC com PHP e outros padres de projeto


Francis Rodrigues

1 de julho de 2013 em 9:51 (UTC -3)


Entendi.
Mas podemos subir isso num repositrio como projeto.
Considerando depois como uma arquitetura MVC open de sua autoria.

2.
Granhani

29 de outubro de 2013 em 4:36 (UTC -3)


Responder
Tarcsio show de bola seu post!! parabns mesmo!!!
a questo foi que tive a mesma ideia do Francis Rodrigues
e dei uma fuada no seu cdigo!!!
adicionei o .htaccess pra gerenciar as url amigvel, e algumas outras mudanas pra isso
funcionar!!!
se o Francis Rodrigues ainda nao fez essas mudanas
segue o link para download
https://copy.com/OBL46UmwxyIC

17.
Ernando A. Mendes

30 de junho de 2013 em 13:11 (UTC -3)


Responder
Fala Tarcsio, tudo bem? Muito bom esse material, tudo bem comentado, timo para mim que
sou iniciante em MVC.

18.
Francis Rodrigues

1 de julho de 2013 em 9:48 (UTC -3)


Responder
Tem um erro aqui:
Fatal error: Class PersistModelAbstract not found in
/home/ubuntu/projeto/models/TelefoneModel.php on line 16

1.
Tarcsio

1 de julho de 2013 em 10:32 (UTC -3)


Responder
Vou verificar

1.
Francis Rodrigues

1 de julho de 2013 em 20:58 (UTC -3)


Responder
que faltou incluir require_once(lib/PersistModelAbstract.php);
e View.php tambm.
Vai dar um monte de erro seguindo o exemplo.
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/

28/33

23/7/2014

Exemplo de MVC com PHP e outros padres de projeto

Vou ver se no cdigo do download est tudo normal.

2.
Tarcsio

18 de julho de 2013 em 15:16 (UTC -3)


Responder
Francis, o post foi corrigido
Foi adicionado uma funo __autoload no arquivo Application.php, com ela todas as
classes da pasta lib sero automaticamente carregadas, inclusive essa em questo.
Obrigado pela observao.

19.
Cristiano Moura

18 de julho de 2013 em 7:29 (UTC -3)


Responder
Parabns pelo artigo, est perfeito!

20.
Fabiana Moura

2 de outubro de 2013 em 2:04 (UTC -3)


Responder
Curti muito sua explicao!

21.
Riguel

27 de outubro de 2013 em 21:48 (UTC -3)


Responder
Tarcisio
Cara sou iniciante e estou com uma duvida pois estou utilizando o seu projeto para estudo
contudo no estou conseguindo passar os valores dos campos e resgatalos no lado do server d
um erro dizendo que no existe, estou utilizando $POST['xxx'] teria como me dar uma fora ou
me explicar como realmente funciona o set e get params?? obrigado e realmente muito bom o
projeto

22.
Augusto

28 de outubro de 2013 em 14:28 (UTC -3)


Responder
Gostei muito do artigo!!! gostaria de saber como implementar autenticao usando esse modelo
mvc?

23.
Dominus Farib

31 de outubro de 2013 em 0:00 (UTC -3)


Responder
Muito bom mesmo, parabns!
So de posts assim que muitos programadores PHP estruturais no Brasil precisam para
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/

29/33

23/7/2014

Exemplo de MVC com PHP e outros padres de projeto

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

6 de novembro de 2013 em 22:37 (UTC -3)


Responder
Muito bom o tutorial, o padro de projeto GRASP MVC est bem definido no php, facilita muito
a vida programar orientado a objetos, principalmente web, muitos programadores realmente
precisam aprender com solues simples e prticas, parabens.

25.
r23k

24 de novembro de 2013 em 20:43 (UTC -3)


Responder
muito bom o seu artigo.

26.
Helede

12 de dezembro de 2013 em 15:51 (UTC -3)


Responder
Muito bom mesmo cara, parabns. Vou iniciar um novo projeto e vou basear em MVC. Achei
sua explicao muito boa.

27.
adrmasterCarlos Adriano

17 de dezembro de 2013 em 9:39 (UTC -3)


Responder
Opa, muito bom, isso quase um framework a parte. Estou usando num projeto. E se eu quiser
passar parmetro para uma view redirecionada por exemplo: header(Location: ?
controle=Contato&acao=listarContato); Se eu precisar passar parametros para o listarContato,
como procedo?

28.
batistafic

19 de janeiro de 2014 em 13:20 (UTC -3)


Responder
Muito obrigado por compartilhar seu conhecimento. O tutorial um dos melhores e mais
didticos que eu j li.

29.
RafaelFerreira

24 de janeiro de 2014 em 15:46 (UTC -3)


Responder
Ol e em que camada coloco as excees personalizadas que criar?

http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/

30/33

23/7/2014

Exemplo de MVC com PHP e outros padres de projeto

1.
Tarcsio

24 de janeiro de 2014 em 16:12 (UTC -3)


Responder
Boa tarde Rafael.
As excees personalizadas podem ficar em qualquer camada. Por exemplo, se voc
quiser lanar uma exceo por um erro de banco de dados, provavelmente isso ficar na
camada de modelo, j se voc quiser lanar uma exceo porque o cara chamou um
comando / mtodo que no existe, essa ficaria na camada de controle. O que voc tem que
fazer tratar as excees camada a camada, ou seja, se voc chamar a camada de modelo
dentro da camada de controle e a mesma lanar uma exceo personalizada, o certo
tratar com try{}catch( Exception ){} para ignorar a mesma ou at mesmo mostrar uma
mensagem de erro ao usurio.

1.
RafaelFerreira

24 de janeiro de 2014 em 17:02 (UTC -3)


Responder
Obrigado pela ateno, outra questo, eu coloco os arquivos/classes de exceo na
pasta da camada ou dentro da camada eu coloco uma pasta de exception prpria
tipo
models/exception/ClasseException.php
ou
models/ClasseExceptions.php
Qual o mais correto?

30.
Danilo

24 de fevereiro de 2014 em 18:19 (UTC -3)


Responder
Ol Tarcsio, tudo bom???
Seguinte, comecei a pouco numa nova empresa e o pessoal daqui criou nosso sistema
inteiramente baseado neste seu exemplo Porem, ningum da equipe tinha muita experincia
com o modelo MVC Ento alguns problemas surgiram
O maior deles para mim agora esta no layout Todos os demais membros da equipe
implementaram seus HTML/CSS em cada uma das views de suas telas Porem isso insano!!!
Quando precisarmos, e vamos precisar, dar manuteno no layout teremos um ENORME
problema!!!
Eu ainda sou novo no MVC tbm Mas j trabalhei em outra empresa com um j montado.
Enfim, minha dvida quanto a criao de uma view master com o layout padro do site. Para
que as demais views tenham APENAS o contedo interno de cada aplicao.
Ser q vc poderia me dar uma luz em como procedo nisto?? Nem que seja me indicar algum
outro site com alguma luz sobre o assunto!
Desde j agradeo pela fora! Seu MVC foi fundamental para ns aqui!
Grande abrao
Danilo

1.
RafaelFerreira

25 de fevereiro de 2014 em 10:32 (UTC -3)


Responder
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/

31/33

23/7/2014

Exemplo de MVC com PHP e outros padres de projeto

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

26 de fevereiro de 2014 em 17:45 (UTC -3)


Responder
Hmmm,
Eu j estou fazendo assim nas minhas aplicaes e alguns outros membros tbm
fizeram isso. Entretanto eles ainda fizeram arquivos (topo, rodape, etc) proprios.
Mas com a mesma cara
Mas isso no o ideal. Eu queria mesmo era criar um template master e aplicar as
views dentro dele Invertendo essa logica. Ou seja, ao inves deu colocar o include
dos arquivos em cada view, eu incluiria cada view num template.
Mas enfim, eu ja convenci o pessoal a migrar para um framework MCV mais
completo. Pois creio que teremos mais desafios la pra frente
Abs
1. Entendendo o MVC (Model-View-Controller) | DigitalDev
23 de janeiro de 2013 em 8:29 (UTC -3) Link para este comentrio
Responder
[...] Exemplo de MVC com PHP [...]

Deixe uma dvida, resposta ou sugesto


Escreva o seu comentrio aqui...

Categorias
Programao
PHP
C / C++
JavaScript / Ajax
Banco de Dados
MySQL
PostgreSQL
Frameworks
HTML / XHTML
CSS
Android SDK
MVC
JavaScript / Ajax
Web Servers
Linux

Mais populares da semana


Usando mesmo HD externo no Mac OS 396
views
X, Windows e Ubuntu
Exemplo de MVC com PHP

344
views

Comunicando-se com o Facebook 207


views
usando PHP
Instalando e Configurando o
Ambiente de Programao C /
C++

70 views

Android: Usando a internet do 68 views


seu computador com USB
http://www.digitaldev.com.br/2013/01/22/exemplo-de-mvc-com-php/

32/33

23/7/2014

Exemplo de MVC com PHP e outros padres de projeto

Encontre-nos no Facebook

DigitalDev
Curtir

290 pessoas curtiram DigitalDev.

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

Eclipse Encapsulamento Facebook


Framework Herana Injeo SQL jQuery linux
Metodologias MinGW MVC MySQL OOP Padres de
Destrutores

Projeto

PHP

PHP/FI PHP/FI 2.0 PHP 3 PHP 4 PHP

5 POO Programao Orientada a Objeto Rasmus Lerdorf

Segurana Singleton SQL SQL Injection T estes de


Software

Tutoriais Tutorial Validao de Dados

Zend Engine Zend Framework ZF

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

Você também pode gostar