+6

Programando em MVC com PHP

criado por Daniel Ribeiro em 16/08/2007 11:23am
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...

Comentários:

Mostrando 1 - 10 de 21 comentários
Achei muito bom o artigo, penço que se utilizarmos o PHP direto direcionado a um método de desenvolvimento no estilo MVC é mais confiável do que usar um framework diretamente pois você passa a ser dependente dele... com seus benefícios e problemas... Agraço a todos.
08/10/2012 8:43pm (~11 anos atrás)

Hm... Não gosto de seguir padrões pré-definidos.
Acho muito mais fácil criar um padrão próprio e seguí-lo :D
29/07/2012 9:59pm (~11 anos atrás)

Willian Silva disse:
Ainda não entendi para que serve o Smarty!
01/06/2009 11:21am (~15 anos atrás)

Dam disse:
Bom artigo.
20/11/2008 4:24am (~15 anos atrás)

Dam disse:
Bom artigo.
20/11/2008 4:24am (~15 anos atrás)

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)
28/04/2008 4:02pm (~16 anos atrás)

fccd disse:
Muito bom essa class com extends...
Parabéns!
10/01/2008 11:03am (~16 anos atrás)

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 :)
13/12/2007 8:02pm (~16 anos atrás)

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
22/10/2007 7:33am (~16 anos atrás)

Ricardo Gama disse:
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
04/10/2007 12:59pm (~16 anos atrás)

Novo Comentário:

(Você pode usar tags como <b>, <i> ou <code>. URLs serão convertidas para links automaticamente.)