exemplo de mvc com php
TRANSCRIPT
-
7/22/2019 Exemplo de MVC Com PHP
1/40
Exemplo de MVC com PHP
MVC,Padres de Projeto
porTarcsio
Nesse artigo irei demonstrar na prtica, a aplicao do padro de projeto MVC comPHP. Para isso, construirei um aplicativo de Agenda de Contatos Telefnicosconforme requisitos funcionais, diagramas e cdigo que sero mostrados ao longo dessetexto. Mas, antes de comear, aconselho a vocs que leiam o artigo de introduo aMVC, o mesmo poder ser visualizado acessando o linkEntendendo 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.
Imagem 1Hierarquia de Diretrios e Pastas
Diretrio controllers
http://www.digitaldev.com.br/category/padroes-de-projeto/mvc/http://www.digitaldev.com.br/category/padroes-de-projeto/mvc/http://www.digitaldev.com.br/category/padroes-de-projeto/http://www.digitaldev.com.br/category/padroes-de-projeto/http://www.digitaldev.com.br/category/padroes-de-projeto/http://www.digitaldev.com.br/author/tarcisio/http://www.digitaldev.com.br/author/tarcisio/http://www.digitaldev.com.br/author/tarcisio/http://www.digitaldev.com.br/2012/08/14/entendendo-o-m%E2%80%A6iew-controllerhttp://www.digitaldev.com.br/2012/08/14/entendendo-o-m%E2%80%A6iew-controllerhttp://www.digitaldev.com.br/2012/08/14/entendendo-o-m%E2%80%A6iew-controllerhttp://www.digitaldev.com.br/2012/08/14/entendendo-o-m%E2%80%A6iew-controllerhttp://www.digitaldev.com.br/wp-content/uploads/2012/11/Captura-de-Tela-2012-11-16-as-13.51.08.pnghttp://www.digitaldev.com.br/wp-content/uploads/2012/07/MVC1.jpghttp://www.digitaldev.com.br/wp-content/uploads/2012/11/Captura-de-Tela-2012-11-16-as-13.51.08.pnghttp://www.digitaldev.com.br/wp-content/uploads/2012/07/MVC1.jpghttp://www.digitaldev.com.br/2012/08/14/entendendo-o-m%E2%80%A6iew-controllerhttp://www.digitaldev.com.br/2012/08/14/entendendo-o-m%E2%80%A6iew-controllerhttp://www.digitaldev.com.br/author/tarcisio/http://www.digitaldev.com.br/category/padroes-de-projeto/http://www.digitaldev.com.br/category/padroes-de-projeto/mvc/ -
7/22/2019 Exemplo de MVC Com PHP
2/40
Conforme se pode deduzir pelo nome, irei us-lo para guardar as classes da camada decontrole do sistema, as famosas classes controladoras ou controllers, responsveis porfazer 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 etelefones usando um banco de dadosSQLite, nesse diretrio que o arquivo referenteao 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 porexemplo, classes de filtros de dados, validaes genricas, helpers (caso haja algum),interfaces e abstraes no ligadas camada de negcio do sistema. Se estivesseconstruindo 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 denegcio do sistema, como por exemplo, as classes Contato e Telefone, entre outras.
Diretrio views
Esse o diretrio onde guardarei os arquivosHTML do sistema, tais arquivosrepresentam a camada de visualizao (view), da qual foi falada no artigo de introduoao 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 classesnecessrias para a separao do sistemas em camadas (ModeloModel, VisoView ,ControladorController). A primeira delas que mostrarei, a de controlador genrico,no diretamente ligado s regras de negcio do sistema de Agenda Telefnica. Veja oexemplo abaixo.
1234
-
7/22/2019 Exemplo de MVC Com PHP
3/40
56789
1011121314151617181920
2122232425262728
* @package Exemplo simples com MVC* @author DigitalDev* @version 0.1.1** Camada - Controladores ou Controllers* Diretrio Pai - controllers
* Arquivo - IndexController.php*/classIndexController{
/*** 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*/publicfunctionindexAction(){
//redirecionando para a pagina de lista de contatos
header('Location: ?controle=Contato&acao=listarContato');
}}?>
Conforme vocs devem ter visto acima, usei o sufixo Controller no nome da classe eAction no nome do mtodo. Esse o padro de nomenclatura que irei utilizar em todasas outras classes da camada Controle e seus mtodos. Alm disso, nomearei os arquivosque iro conter as classes com o mesmo nome da prpria classe.
A segunda classe que implementarei ser a Application. A responsabilidade da mesmaser a de verificar qual classe da camada de controle (Controller) e qual mtodo daclasse (Action) o usurio deseja executar. D uma olhada no cdigo abaixo, espero queele seja simples o suficiente para esclarecer seu modo de funcionamento.
12
345678910111213
1415
-
7/22/2019 Exemplo de MVC Com PHP
4/40
1617181920
2122232425262728293031
323334353637383940414243444546474849505152
5354555657585960616263
6465
* Verifica qual classe controlador (Controller) o usurio desejachamar* e qual mtodo dessa classe (Action) deseja executar * Caso o controlador (controller) no seja especificado, oIndexControllers 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**/classApplication{
/*** 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*/privatefunctionloadRoute(){
/** 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*/publicfunctiondispatch()
-
7/22/2019 Exemplo de MVC Com PHP
5/40
6667686970
7172737475767778798081
828384858687888990919293949596979899100101102
103104105
{$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
thrownewException('Arquivo '.$st_controller_file.' naoencontrado');
//verificando se a classe existe$st_class= $this->st_controller.'Controller';if(class_exists($st_class))
$o_class= new$st_class;else
thrownewException("Classe '$st_class' nao existe noarquivo '$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
thrownewException("Metodo '$st_method' nao existe naclasse $st_class'");
}
/*** Redireciona a chamada http para outra pgina* @param string $st_uri*/staticfunctionredirect( $st_uri){
header("Location: $st_uri");}
}?>
Apesar da classe acima no ter semelhana alguma com a classe IndexController queescrevi, ela tambm faz parte da camada de controle (Controller), mas est num nvelmais acima. O fato dela ser responsvel por verificar qual controlador (Controller) equal mtodo (Action) ir executar, faz da mesma o corao do sistema.
A terceira classe que irei implementar ser responsvel por cuidar da camada devisualizao. Apesar de cdigo um pouco extenso, ela uma classe sem muitas
funcionalidade, mas poder ser enriquecida de acordo com nossas necessidades futuras.
-
7/22/2019 Exemplo de MVC Com PHP
6/40
12345
678910111213141516
171819202122232425262728293031323334353637
3839404142434445464748
4950
-
7/22/2019 Exemplo de MVC Com PHP
7/40
5152535455
5657585960616263646566
676869707172737475767778798081828384858687
8889909192939495969798
99100
exists");}
/*** Retorna o nome do arquivo que deve ser renderizado* @return string
*/publicfunctiongetView(){
return$this->st_view;}
/*** Define os dados que devem ser repassados view* @param Array $v_params*/publicfunctionsetParams(Array $v_params){
$this->v_params = $v_params;
}
/*** Retorna os dados que foram ser repassados ao arquivo de
visualizao* @return Array*/publicfunctiongetParams(){
return$this->v_params;}
/*** Retorna uma string contendo todo* o conteudo do arquivo de visualizao** @return string*/publicfunctiongetContents(){
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*/publicfunctionshowContents(){
echo$this->getContents(); exit;
}}?>
-
7/22/2019 Exemplo de MVC Com PHP
8/40
101102103104105
106107108109110111112113
Os dados de algumas classes da camada de modelo deveropersistirno banco de dados,para isso, ser necessrio a implementao de pequeno bloco de cdigo responsvel
pela conexo entre o sistema e oSGDB. A alternativa que adotarei ser a deimplementar uma classe abstrata, que dever ser herdada pelas classes em que os dadosdevero ser armazenados no banco de dados. Veja cdigo da classe abstrata a seguir.
123456
7891011121314151617
1819202122232425262728
2930
-
7/22/2019 Exemplo de MVC Com PHP
9/40
3132333435
3637383940414243444546
474849
$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*/
}}?>
Conforme Vocs j devem ter visto, a classe PersistModelAbstract faz referncia aoarquivo db.sq3 dentro do diretrio databases, esse arquivo ser o responsvel porguardar nossos dados. Irei mostrar isso na prtica com o continuar desse artigo.
Implementarei tambm, duas outras pequenas classes, a primeira ser usada para filtraros dados passados via POST e GET e a segunda ser usada para validar os dados. Ireicham-las de DataFilter e DataValidator, respectivamente.
123456789
1011121314151617181920
2122
-
7/22/2019 Exemplo de MVC Com PHP
10/40
2324252627
2829303132333435363738
39404142434445464748
* @return string*/staticfunctionnumeric( $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*/staticfunctioncleanString( $st_string){
returnaddslashes(strip_tags($st_string)); }}
?>
12345678
910111213141516171819
2021
-
7/22/2019 Exemplo de MVC Com PHP
11/40
2223242526
2728293031323334353637
3839404142434445464748495051525354
* Verifica se o dado passado e um numero* @param mixed $mx_value;* @return boolean*/staticfunctionisNumeric( $mx_value){
$mx_value= str_replace(',', '.', $mx_value);if(!(is_numeric($mx_value))) returnfalse;
returntrue;}
/*** Verifica se o dado passado e um numero inteiro* @param mixed $mx_value;* @return boolean*/staticfunctionisInteger( $mx_value){
if(!DataValidator::isNumeric($mx_value)) returnfalse;
if(preg_match('/[[:punct:]&^-]/', $mx_value) > 0)returnfalse;
returntrue;}
}?>
Por fim, irei implementaro cdigo do arquivo index.php, o mesmo serextremamente simples. Veja abaixo.
1234567891011
1213
-
7/22/2019 Exemplo de MVC Com PHP
12/40
1415161718
19202122
error_reporting(E_ALL);
require_once'lib/Application.php'; $o_Application= newApplication();$o_Application->dispatch(); ?>
Nesse estgio de desenvolvimento, a hierarquia de diretrios e arquivos deve se darcomo a Imagem 2 mostrada abaixo.
Imagem 2Hierarquia de Diretrios e Pastas
A Camada de Negcios
Agora, com as classes do sistema implementadas, irei finalmente me preocupar com asregras 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/wp-content/uploads/2012/11/Captura-de-Tela-2012-11-16-as-14.54.45.png -
7/22/2019 Exemplo de MVC Com PHP
13/40
Imagem 3Diagrama de Casos de Uso
Diagrama de Classe
Nesse diagrama, apenas documentarei as classes diretamente ligadas ao sistema deAgenda Telefnica, a diagramao das classes que implementei acima no serabordada.
http://www.digitaldev.com.br/wp-content/uploads/2012/08/diag_cu.jpg -
7/22/2019 Exemplo de MVC Com PHP
14/40
Imagem 4Diagrama de Classes
Diagrama de Entidade Relacionamento
Pelo fato da necessidade da persistir os dados de contato e dos telefones, ser necessrioduas tabelas para guardar os dados das classes. Veja o Diagrama de EntidadeRelacionamento (DER) abaixo.
Imagem 5Diagrama 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 mereferendo 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 classePersistModelAbstract.
12
34
-
7/22/2019 Exemplo de MVC Com PHP
15/40
56789
1011121314151617181920
212223242526272829303132333435363738394041
4243444546474849505152
5354
* Responsvel por gerenciar e persistir os dados dos* Contatos da Agenda Telefnica** @package Exemplo simples com MVC* @author DigitalDev* @version 0.1.1
** Camada - Modelo ou Model.* Diretrio Pai - models* Arquivo - ContatoModel.php**/classContatoModel extendsPersistModelAbstract {
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*/
publicfunctionsetId( $in_id){
$this->in_id = $in_id;return$this;
}
publicfunctiongetId(){
return$this->in_id;}
publicfunctionsetNome( $st_nome){
$this->st_nome = $st_nome;
return$this;}
publicfunctiongetNome(){
return$this->st_nome;}
publicfunctionsetEmail( $st_email){
$this->st_email = $st_email;return$this;
}
publicfunctiongetEmail()
-
7/22/2019 Exemplo de MVC Com PHP
16/40
5556575859
6061626364656667686970
717273747576777879808182838485868788899091
9293949596979899100101102
103104
{return$this->st_email;
}
/*** Retorna um array contendo os contatos
* @param string $st_nome* @return Array*/publicfunction_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= newContatoModel();$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*/publicfunctionloadById( $in_id){
$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
-
7/22/2019 Exemplo de MVC Com PHP
17/40
105106107108109
110111112113114115116117118119120
121122123124125126127128129130131132133134135136137138139140141
142143144145146147148149150151152
153154
* @return integer*/publicfunctionsave(){
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= "UPDATEtbl_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 doPDO::lastInsertId() no funciona com sqlite*/if($this->o_db-
>getAttribute(PDO::ATTR_DRIVER_NAME) === 'sqlite'){
$o_ret= $this->o_db->query('SELECTlast_insert_rowid() AS con_in_id')->fetchObject();
return$o_ret->con_in_id; }else
return$this->o_db->lastInsertId(); }
elsereturn$this->in_id;}catch(PDOException $e){
throw$e;}returnfalse;
}
/*** Deleta os dados persistidos na tabela de* contato usando como referencia, o id da classe.
*/publicfunctiondelete(){
-
7/22/2019 Exemplo de MVC Com PHP
18/40
155156157158159
160161162163164165166167168169170
171172173174175176177178179180181182183184185186187188189190191
192193194195196197198199200201202
203204
if(!is_null($this->in_id)) {
$st_query= "DELETEFROMtbl_contato
WHERE con_in_id = $this->in_id";if($this->o_db->exec($st_query) > 0)
returntrue;}returnfalse;
}
/*** Cria tabela para armazernar os dados de contato, caso * ela ainda no exista.* @throws PDOException*/privatefunctioncreateTableContato() {
/*
* No caso do Sqlite, o AUTO_INCREMENT automtico na chaveprimaria 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_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;}
}}?>
-
7/22/2019 Exemplo de MVC Com PHP
19/40
205206207208209
210211212213214215216217218219220
221222223224225226
Agora a vez da classe TelefoneModel ser implementada.
1
23456789101112
1314151617181920212223
2425
-
7/22/2019 Exemplo de MVC Com PHP
20/40
2627282930
3132333435363738394041
424344454647484950515253545556575859606162
6364656667686970717273
7475
* Setters e Getters da* classe TelefoneModel*/
publicfunctionsetId( $in_id){
$this->in_id = $in_id;return$this;}
publicfunctiongetId(){
return$this->in_id;}
publicfunctionsetDDD( $in_ddd){
$this->in_ddd = $in_ddd;return$this;
}
publicfunctiongetDDD(){
return$this->in_ddd;}
publicfunctionsetTelefone( $in_telefone){
$this->in_telefone = $in_telefone;return$this;
}
publicfunctiongetTelefone(){
return$this->in_telefone; }
publicfunctionsetContatoId( $in_contato_id){
$this->in_contato_id = $in_contato_id;return$this;
}
publicfunctiongetContatoId(){
return$this->in_contato_id; }
/*** Retorna um array contendo os telefones* de um determinado contato* @param integer $in_contato_id* @return Array*/publicfunction_list( $in_contato_id)
{ $st_query= "SELECT * FROM tbl_telefone WHERE con_in_id =$in_contato_id";
-
7/22/2019 Exemplo de MVC Com PHP
21/40
7677787980
8182838485868788899091
9293949596979899100101102103104105106107108109110111112
113114115116117118119120121122123
124125
$v_telefones= array();try{
$o_data= $this->o_db->query($st_query);while($o_ret= $o_data->fetchObject()){
$o_telefone= newTelefoneModel();$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*/publicfunctionloadById( $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){}returnfalse;
}
/*** 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*/publicfunctionsave(){
if(is_null($this->in_id)) $st_query= "INSERT INTO tbl_telefone
(
con_in_id,tel_in_ddd,tel_in_telefone
-
7/22/2019 Exemplo de MVC Com PHP
22/40
126127128129130
131132133134135136137138139140141
142143144145146147148149150151152153154155156157158159160161162
163164165166167168169170171172173
174175
)VALUES(
$this->in_contato_id, '$this->in_ddd','$this->in_telefone'
);";else$st_query= "UPDATE
tbl_telefoneSET
tel_in_ddd = '$this->in_ddd',tel_in_telefone = '$this->in_telefone'
WHEREtel_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('SELECTlast_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;}returnfalse;
}/*** Deleta os dados persistidos na tabela de* telefone usando como referencia, o id da classe.*/publicfunctiondelete(){
if(!is_null($this->in_id)) {
$st_query= "DELETEFROMtbl_telefone
WHERE tel_in_id = $this->in_id";
if($this->o_db->exec($st_query) > 0)returntrue;}
-
7/22/2019 Exemplo de MVC Com PHP
23/40
176177178179180
181182183184185186187188189190191
192193194195196197198199200201202203204205206207208209210211212
213214215216217218219220221222223
224225
returnfalse;}
/*** Cria tabela para armazernar os dados de telefone, caso* ela ainda no exista.* @throws PDOException*/privatefunctioncreateTableTelefone() {
/** 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;}
}}?>
-
7/22/2019 Exemplo de MVC Com PHP
24/40
226227228229230
231232233234235236237238239240241
242243244245246247248
Depois das classes da camada de modelo implementadas, o prximo passo escrever ocdigo das classes de controle referente ao fluxo de gerenciamento das classes acima.Elas tambm sero duas, ContatoController e TelefoneController.
123456789
10111213141
51
-
7/22/2019 Exemplo de MVC Com PHP
25/40
61718
19202122232
425262728293031323334
35363738394
04
//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= newView('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
*/publicfunctionmanterContatoAction() {
$o_contato= newContatoModel();
//verificando se o id do contato foi passadoif( isset($_REQUEST['in_con']) )
//verificando se o id passado validoif( 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 decontatos
if($o_contato->save() > 0)Application::redirect('?controle=Contato&acao=listarC
ontato');}
$o_view= newView('views/manterContato.phtml'); $o_view->setParams(array('o_contato' => $o_contato));$o_view->showContents();
}
/*** Gerencia a requisies de excluso dos contatos*/publicfunctionapagarContatoAction() {
if( DataValidator::isNumeric($_GET['in_con']) ){
//apagando o contato$o_contato= newContatoModel();$o_contato->loadById($_GET['in_con']);
-
7/22/2019 Exemplo de MVC Com PHP
26/40
14243
44454647484
950515253545556575859
60616263646
56
$o_contato->delete();
//Apagando os telefones do contato$o_telefone= newTelefoneModel();$v_telefone= $o_telefone->_list($_GET['in_con']);foreach($v_telefone AS $o_telefone)
$o_telefone->delete(); Application::redirect('?controle=Contato&acao=listarContato');
}}
}?>
-
7/22/2019 Exemplo de MVC Com PHP
27/40
66768
69707172737
475767778798081828384
85868788899
09
-
7/22/2019 Exemplo de MVC Com PHP
28/40
19293
94
e por sua vez a classe TelefoneController
123456
789101112131415161718
19202122232
42
-
7/22/2019 Exemplo de MVC Com PHP
29/40
52627
28293031323
334353637383940414243
44454647484
95
$o_telefone= newTelefoneModel();
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= newView('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*/
publicfunctionapagarTelefoneAction() {if( isset($_GET['in_tel']) )
if( DataValidator::isInteger($_GET['in_tel'])){
$o_telefone= newTelefoneModel(); $o_telefone->loadById($_GET['in_tel']); $o_telefone->delete(); Application::redirect('?controle=Telefone&acao=listar
Telefones&in_con='.$_GET['in_con']); }
}}
?>
-
7/22/2019 Exemplo de MVC Com PHP
30/40
05152
53545556575
859606162636465666768
69707172737
47
-
7/22/2019 Exemplo de MVC Com PHP
31/40
57677
78798081828
384858687
Arquivos de visualizao ou views
As classes implementadas acima esto fazendo referncia arquivos HTML contidos nacamada de visualizao, para esse programa funcionar, ser preciso implement-los.Isso o que irei fazer agora.
ArquivolistarContatos.phtmlDiretrio Paiviews
12
345678910111213
1415
Agenda Telefnica - Exemplo de MVC com PHP
http://www.w3.org/TR/html4/loose.dtdhttp://www.w3.org/TR/html4/loose.dtdhttp://www.w3.org/TR/html4/loose.dtd -
7/22/2019 Exemplo de MVC Com PHP
32/40
1617181920
2122232425262728293031
323334353637383940414243444546474849505152
5354555657585960616263
ID
Nome
E-mail
Aes
Novo
Contato
-
7/22/2019 Exemplo de MVC Com PHP
33/40
ArquivolistarTelefones.phtmlDiretrio Paiviews
12
34567891011121314151617181920212223
2425262728293031323334
3536373839404142434445
4647
Agenda Telenica - Exemplo de MVC com PHP
Contato
ID
Nome
E-mail
Telefones
ID
http://www.w3.org/TR/html4/loose.dtdhttp://www.w3.org/TR/html4/loose.dtdhttp://www.w3.org/TR/html4/loose.dtd -
7/22/2019 Exemplo de MVC Com PHP
34/40
4849505152
5354555657585960616263
646566676869707172737475767778798081828384
8586878889909192939495
9697
DDD
Telefone
Aes
Voltar
-
7/22/2019 Exemplo de MVC Com PHP
35/40
ArquivomanterContato.phtmlDiretrio Paiviews
12
34567891011121314151617181920212223
2425262728293031323334
3536373839404142434445
4647
Agenda Telefnica - Exemplo de MVC com PHP
Nome
E-mail
Aes
-
7/22/2019 Exemplo de MVC Com PHP
36/40
484950
ArquivomanterTelefone.phtml
Diretrio Paiviews
12345678910111213141516171819
2021222324252627282930
3132333435363738394041
4243
Agenda Telefnica - Exemplo de MVC com PHP
Contato
ID
Nome
E-mail
http://www.w3.org/TR/html4/loose.dtdhttp://www.w3.org/TR/html4/loose.dtdhttp://www.w3.org/TR/html4/loose.dtd -
7/22/2019 Exemplo de MVC Com PHP
37/40
4445464748
4950515253545556575859
606162636465666768697071727374757677787980
818283848586
Telefones
DDD
Telefone
Aes
-
7/22/2019 Exemplo de MVC Com PHP
38/40
Aps o cdigo implementado, para selecionar o Controlador e a Ao que querexecutar, basta envia-las via GET ou POST, como por exemplo?controle=Contato&acao=listarContato . Com esses parmetros, o mtodolistarContatoAction da classe ContatoController ser executado.
Para entender um pouco melhor o funcionamento desse programa, visualize oDiagrama de Sequncia da funcionalidade Listar Contatos mostrado na Imagem 6abaixo. Ele ser executado por padro quando nenhum outro for requisitado pelousurio.
Imagem 6Diagrama de Sequncia do Caso de Uso Listar Contatos
Quer ver isso funcionando? Acesse o linkhttp://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 oarquivo lib/PersistModelAbstract.php e deix-lo como abaixo, preenchendo apenas osdados da sua conexo e credenciais referentes.
12
34
-
7/22/2019 Exemplo de MVC Com PHP
39/40
56789
1011121314151617181920
212223242526272829303132333435363738394041
42434445464748
* @package Exemplo simples com MVC* @author DigitalDev* @version 0.1.1** Diretrio Pai - lib* Arquivo - PersistModelAbstract.php
*/abstractclassPersistModelAbstract {
/*** 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 = newPDO(
$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 umMini-Framework no padro MVC com PHP. Para acessar esse videos, clique emCriando um Mini Framework PHP 5 com MVC
http://www.videoaulasbrasil.com.br/tag/criando-um-mini-framework-PHP-5-com-MVC/http://www.videoaulasbrasil.com.br/tag/criando-um-mini-framework-PHP-5-com-MVC/http://www.videoaulasbrasil.com.br/tag/criando-um-mini-framework-PHP-5-com-MVC/ -
7/22/2019 Exemplo de MVC Com PHP
40/40
Mais sobre Padres de Projeto
O MVC um dos Padres de Projetos mais importantes hoje em dia, mas no estsozinho. Existem vrios outros padres por ai, eles nos ajudam a organizar o cdigo,resolver problemas que costumamos enfrentar no dia-dia da Programao Orientada aObjeto. Sendo assim, vale muito a pena estudar sobre eles, pois um bom programadorno aquele que apenas codifica solues excepcionais, mas tambm o que consegueorganizar com clareza seu cdigo. Veja uma lista de alguns padres organizados porsuas 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