Publicidade   
 você está aqui: phpbrasil.com    artigos    artigo  
 
:: novos artigos ::

:: recomendado ::

Crie um Site B2C com PHP 4 e MySQL

Compre esse livro no Submarino.com.br

:: publicidade ::


:: novos scripts ::

:: elenco phpbrasil ::

Wagner Quedi Rosa
Pontos: 2533

Visite a página de perfil de Daniel RibeiroProgramando em MVC com PHP
por Daniel Ribeiro
Lista de Categorias  |  Contribua um Novo Artigo  |  Entre em Contato Conosco

Muita gente me pergunta sobre a maneira que eu programo usando MVC com PHP. É claro que já existem vários frameworks que utilizam essa técnica no desenvolvimento PHP. Porém eu resolvi apresentar aqui o conceitual do que eu uso que pode ser de material de auxílio para outros programadores também.
Vote aqui!
Média de Votos Atual: 9.23
Total de Votos: 26
Nota:   

Uma aplicacao MVC nada mais eh do que classes principais de:

M - Model - Utilizada como o negocio da sua aplicacao, tudo o que for utilizado para armazenamento de dados ou obtencao dos dados da aplicacao)
V - View - Utilizada para exibir para o usuario tudo o que a aplicacao produz
C - Controller - Utilizada para realizar o controle integrando o Model e View (� aqui e controlamos o fluxo da aplicacao)

Bem se sabemos que o Model Interage com o banco de dados, entao criamos uma classe model principal com os metodos
principais que ele tem

PS: O exemplo que estou colocando aqui eh so mero exemplo, pra você ter uma ideia, eh claro que uma classe model existem
mais metodos, dependendo da sua aplicacao


<?php
class Model
{
    
public function conectar()
    {
        
// codigo pra conectar ao banco de dados
    
}

    
public function query()
    {
        
// codigo pra executar uma query
    
}

    
public function desconectar()
    {
        
// codigo pra desconectar do banco
    
}
}
?>


Bem agora temos a classe View:


<?php
class View
{
    
public function mostrarNaTela($template)
    {
        
// mostra na tela usando o template escolhido,
        // aqui vem o codigo pra ele dar include em 
        // algum arquivo html modificando os valores 
        // que ja estao atribuidos a View e etc...
    
}

    
public function atribuirValor($var$valor)
    {
        
// codigo pra atribuir valores na view
    
}
}
?>


Se você perceber, o Smarty segue um critério semelhante, não sei se você já usou Smarty, mas ele funciona mais ou menos assim:


<?php
$smarty 
= new Smarty();
// em nossa View o metodo atribuirValor()
$smarty->assign('var1'$var1);
$smarty->assign('var2'$var1);
// em nossa View o metodo mostrarNaTela()
$smarty->display('template.tpl');
?>


Já que temos métodos semelhantes, podemos então aplicar em nossa view todos os métodos do Smarty, para não ter que se preocupar em trabalhar com manipulação de templates. Ficaria mais ou menos assim a nossa view:


<?php
class View
{
    
// declaro a propriedae Smarty aqui dentro da nossa 
    // view (veja que eh uma propriedade private, pois 
    // somente a classe View pode acessar ela
    
private $smarty

    
public function __construct()
    {
        
// quando entao for chamado o contrutor da 
        // classe, ele instancia o objeto Smarty
        
$this->smarty = new Smarty();
    }

    
public function mostrarNaTela($template)
    {
        
// chama o metodo do smarty pra exibir o 
        // template na tela
        
$this->smarty->display($template); 
    }

    
public function atribuirValor($var$valor)
    {
        
// chama o metodo do smarty para atribuir 
        // o valor a variavel
        
$this->smarty->assign($var$valor);
    }
}
?>


Talvez você esteja se perguntando "Então se eu vou usar o Smarty, pq então eu tenho que criar uma View? E usar os metodos do Smarty dentro da view? Não poderia usar diretamente o Smarty?"

Poderia, mas digamos que você posteriormente não queira mais utilizar o Smarty, e sim outro gerenciador de templates. Você teria nesse caso que mexer em sua aplicação inteira, não é? Fazendo uma classe dessa forma, você só mexe na classe View, e programa a classe View pra usar outro gerenciador de templates.

Passamos para a classe Controller, que contém os metodos básicos que farão a sua aplicação funcionar. Até mesmo métodos genéricos que você utiliza dentro da sua aplicação.


<?php
class Controller
{
    
public function redirect($url)
    {
        
header('Location: ' $url);
    }

    
public function error($error)
    {
        
// se algum erro acontecer, chamo esse metodo,
        // que vai fazer alguma coisa (mandar um email,
        // gravar log, etc )
        
$this->log($error);
    }

    
public function log($mensagem)
    {
        
// grava uma menagem de log em algum arquivo 
        // qualquer definido aqui
    
}
}
?>


Resumindo, a classe Controller irá utilizar métodos que são genéricos para todos os módulos de sua aplicação. Agora que ja temos o Model, View e Controller, vamos criar os modulos de nossa aplicação usando MVC.

Na próxima página veremos agora como criar os módulos de nossa aplicação extendendo as classes MVC que acabamos de criar...




<< Anterior 1 2 3 Próxima >>

 
Imprimir  |  Enviar para um Amigo


Comentários de Usuários

Um verdadeiro artigo sobre MVC
publicado por Marcio Muzi - 2007-08-20 05:39:05

Parabéns Daniel! Você foi pioneiro na comunidade do PHP a escrever um artigo exemplificando o que é de verdade a arquitetura MVC. Já vi alguns tentando isso, mas sem sucesso e por esse motivo cheguei a começar a escrever um artigo sobre MVC.

Programo utilizando essa arquitetura há 1 ano e meio. Sua forma de separar o código e nomenclatura, é muito semelhante a que uso, apenas utilizo mais uma camada, a Dao (ex. class UsuarioDao extends Dao), onde são montados as chamadas SQL ao banco de dados (Uma das aplicações que fiz conecta ao Oracle e ao PostgreSQL).

Concordo plenamente com o que você disse: "conceitual... que pode ser de material de auxílio para outros programadores também"

[]s

aaa
publicado por ZECAH - 2007-08-20 13:10:28

Eita plagio da porra eu divulguei esta parada a uns 3 anos atraz ate a estrutura e nomeclatura iguais

Ae marcio é Plagio do que a gente fez a um bom tempo atraz, lembra que eu ja usava esta parada antes da gente se conhecer... eu mandei uma documentação pra uma galera com esta estrutura. Ele deve ter achado em algum canto
Mesmo assim, massa divulgar a simplicidade...

Poderia ter citado a fonte
publicado por Marcio Muzi - 2007-08-21 04:19:44

Ae Zeca, lembro sim, foi você quem trouxe a tecnologia, até então nunca tinha visto na comunidade algo parecido.
Daniel, você continua de parabéns pela iniciativa, apenas reafirmo o conselho do meu amigo Zeca, de você citar a fonte quando algo não foi 100% idéia sua. Veja um artigo que escrevi no iMasters onde cito as fontes:
http://www.imasters.com.br/artigo/5214/

[]s

Como assim citar a fonte?
publicado por Daniel Ribeiro - 2007-08-21 05:34:32

Pessoal, vou colocar aqui o que eu escrevi para o nosso amigo zecah. Pelo que eu sei não é plágio não. Se já existe alguma material semelhante ao que eu escrevi, pode ter sido conhecidencia, eu mesmo nunca achei nenhum artigo mencionando sobre isso, por isso de certa forma resolve descrever. Pois trabalho com essa metodologia a uns 2 anos no qual desenvolvi para um cliente.
Se realmente tiver como constatar que é mesmo plágio, me indique a fonte que eu coloco os devidos créditos.
Marcio, eu li o seu artigo e achei interessante a idéia. Apenas reafirmo que não tenho que citar a fonte de um artigo no qual eu mesmo escrevi. É íncrivel como todo mundo está falando "é plágio, cite a fonte!" se não existe (pelo menos não encontrei) nenhum artigo publicado sobre o assunto.
Antes de comecar a desenvolver dessa maneira, eu procurei bastante sobre metodos de desenvolvimento MVC em PHP e achei muita coisa, no qual fiz um merge de tudo isso e desenvolvi minha própria maneira de programar.
Se é que existe alguma referencia, ou fonte a ser citada, agradeceria ao Joe Stamp no qual me apresentou um modelo (http://www.onlamp.com/pub/a/php/2005/09/15/mvc_intro.html) no qual ele utilizava e acabei tomando base para criar o meu próprio. Porém a metodologia que ele usa, é ainda um pouco mais abrangente do que a minha. Mas não vi a necessidade de abstrair tanto assim como ele faz, por isso em base do que ele já utilizava, resolvi criar a minha metodologia e escrever esse artigo.
Volto a salientar, se houver algum artigo que demonstre de igual maneira o conteúdo que eu abordei aqui, não vou deixar de dar os devidos créditos.

Esclarecimentos
publicado por ZECAH - 2007-08-21 06:05:25

Daniel de qualquer forma parabens.... o lance é que eu mandei pro email pra algumas pessoas e empresas que olharam e adoraram a metodologia, porem tinha mais detlahes como router entre outros conceitos mas a implementação de uma solucao é identica...

Mas pode ter acontecido uma coincidencia muito grande.. como aconteceu comigo e o pradro.. eu envolui o sistema fazendo um gerador de codigo 8 meses depois eu vi em uma revista falando da framework prado e fui olhar, na hora eu vi o quanto era identica a estrutura que eu tinha montando ate o layout era meio identico porem o deles mais bonito...

Mas rola coincidencias...
Parabens cara

Didático
publicado por guilherme_pl - 2007-08-22 05:36:21

Parabéns mesmo, muito bom. É bem didático, para explicar o que é MVC.

Titulo
publicado por Pablo Vanni - 2007-08-22 07:44:51

Bom gostei do artigo porem acho que o nome esta meio estranho o certo poderia ser "Programando em PHP com..."

Valew pela ortigo

Achei legal..
publicado por John Marques - 2007-08-23 06:54:34

poxa achei legal..
artigo.. confesso que ainda não conhecia..
heueheu
:D

Parabéns...
publicado por Wescley Costa - a.k.a Narixx - 2007-08-26 18:50:32

Parabéns Daniel...

Muito bom o seu artigo... ficou de uma forma bem didática, muito mais fácil para compreender!!!

Show demais... A comunidade agradece!!!

Valeu ae!!!

Boa
publicado por Fernando Lopes - 2007-08-30 10:06:20

Para quem está iniciando poo realmente é muito bom.

Muito bom...
publicado por Iuri Neumann - 2007-09-20 19:00:31

bem, independente de quem tenha feito o original, parabenizo aos 2 por terem tido iniciativa... e agradeço primeiramente ao daniel, pois é o artigo dele que estou lendo aqui... bem, admito também que até então nao utilizei este modelo de programaçao, mas que estou ansioso para aplicá-lo... Mais uma vez, parabéns pelo artigo...

Parabéns
publicado por Ricardo Augusto Pereira Gama - 2007-10-04 12:59:34

Muito bom script. seja de quem for a comunidade agradece... o pessoal tem que começar a abrir a cabeça pra mudar. essa forma de prgramar é muito boa... PARABÉNS

Dúvida
publicado por Alysson Rafael - 2007-10-22 07:33:21

ola. esse script e muito interessante e eu to utilizando ele num projeto. porem to tendo problemas com a linha eval('$objLogin->' . $_REQUEST['action']);... ta dando o seguinte erro q nao consigo resolver: "Parse error: syntax error, unexpected $end in C:\wamp\www\MVC\index.php(19) : eval()'d code on line 1
"... alguem pode me ajudar? Obrigado, Alysson

Parabéns
publicado por dudumendess - 2007-12-13 20:02:06

Adorei a métologia. Abriu minha cabeça. Sou programador iniciante e não conhecia essa estrutura. não foi difícil de entender. obrigado, em nome de todos da comunidade. Estou ciente de que posso contar com os artigos de qualidade desta cominidade. vlw :)

Perfeito!!!!!!!!!
publicado por fccd Esse usuário pertence aos 50 usuários mais ativos do site - 2008-01-10 11:03:23

Muito bom essa class com extends...
Parabéns!

ATENÇÃO!
publicado por hugorod - 2008-04-28 16:02:39

mnt bom o artigo, mas como o autor informa, é apenas conceptual.

Os menos experientes devem ter atenção e entender que o código que descrito, contem falhas graves de segurança...

<?php
...

// define uma acao default
if (!$_REQUEST['action']) {
// isso implica que todos os controllers
// terao que ter um metodo chamado acaoPadrao
$_REQUEST['action'] = 'acaoPadrao';
}

// agora eu executo o metodo passado via url
eval('$instancia' . $_REQUEST['action']);
?>

seria negativo se um usuário (mal intencionado) acedesse à página usando p/ex: ?action=login;phpinfo();

nesse caso é um exemplo inofensivo, mas acho que dá para terem ideia.

a solução é desenvolver um função + robusta de filtragem de parametros, aceitar apenas as conhecidadas, e usar o valor default para tudo o resto. (php.net/switch)

Publique os seus Comentários

Nome:
Email:
Título:
Comentário:

NOTA: Cadastre-se no site para poder publicar comentários.

 
webmaster: João Prado Maia   © 2000 - 2005 phpbrasil.com
Gerado em 0.872 segundos