ElePHPant (Eu tenho um desses! :D)

Mas afinal, o que é o MVC?

Model–view–controller (MVC) is a software architecture pattern that separates the representation of information from the user’s interaction with it.

Wikipedia

MVC é um padrão de arquitetura de software que separa a informação (e as suas regras de negócio) da interface com a qual o usuário interage.

É uma forma de estruturar seu projeto/aplicação de forma que a interface de interação (view) esteja separada do controle da informação em si (models), separação essa que é intermediada por uma outra camada controladora (controllers).

Não vou entrar em detalhes profundos sobre a arquitetura de um sistema baseado no MVC nem vou – por enquanto! – mostrar como criar um MVC do zero, mas vou tentar explicar cada uma das três camadas e dar exemplos de código do CakePHP, que é um framework de PHP que – ao meu ver – faz um bom uso do MVC.

Model (ou modelo)

O model é a camada que representa os seus dados, provendo meios de acesso (leitura e escrita) à esses dados.

A regra é simples: tudo que diz respeito à escrita, validação e leitura dos dados está dentro da camada model, não necessariamente dentro do model em si, mas dentro da camada model.

Vemos aqui um exemplo de model de produtos (que vai prover o acesso à tabela products, no banco de dados) no arquivo Product.php:

Aqui temos um model bem simples, onde definimos as regras de validação e um método que vai auxiliar a encontrar os produtos mais recentes.

Não vou entrar nos detalhes do CakePHP, além do mais acho que o código é bem auto-explicativo.

Somente através desse model será possível cadastrar e buscar produtos, e quando um usuário for cadastrar ou editar uma notícia, aquelas regras de validação devem ser respeitadas, ou seja:

  • O título não pode ser vazio
  • A descrição não pode ser vazia nem ter menos de 100 caracteres
  • O preço precisa ser no formato decimal, com 2 casas decimais

Para saber mais sobre models no CakePHP, consulte a documentação: http://book.cakephp.org/2.0/en/models.html

Agora podemos partir para a camada que vai fazer uso desse model, pedindo uma lista de produtos..

Controller (ou controlador)

No controller você tem métodos públicos que são chamados de actions, cada action é responsável por uma “página” do seu site/sistema. É o controller quem decide:

  1. Qual model usar;
  2. Quais pedidos fazer pro model;
  3. Qual combinação de views será usada para exibir os dados retornados pelo model.

Atente que não é o controller que busca os dados (responsabilidade do model) e nem é ele quem exibe os dados (responsabilidade da view)… ele está ali justamente pra controlar os dois e a aplicação como um todo.

Vamos à um exemplo de controller no arquivo ProductsController.php:

Aqui temos duas actons:

  • Uma action (index) vai pedir (para o model) a lista de produtos mais recentes;
  • Outra action (view) vai pedir (para o model) os dados de um único produto.

Para saber mais sobre controllers no CakePHP, consulte a documentação: http://book.cakephp.org/2.0/en/controllers.html

Agora podemos exibir esses dados na camada responsável por isso…

View (ou visualização)

É na view que o seu sistema interage com o usuário. Tudo que ele ver (HTML / XML / RSS / CSV) deve ser gerado e exibido através dessa camada. A view, por sua vez, tem como responsabilidade:

  • Manipular os dados para – e apenas para – exibição;
  • Exibir os dados

Mas a view não faz nenhum tipo de escrita/persistência no seu sistema… ela não salva dados no banco, na sessão e etc.. E ela também não busca esses dados, pois eles devem – obrigatoriamente – serem entregues pela camada controller.

Vamos ver então um exemplo de listagem dos produtos, no arquivo index.ctp:

Aqui temos uma mistura de HTML e PHP, e também fazemos uso do NumberHelper, um Helper do CakePHP para ajudar na formatação de números.

Se você quiser saber mais sobre views no CakePHP, consulte a documentação: http://book.cakephp.org/2.0/en/views.html

Conclusão

Com o MVC você conseguirá organizar seu projeto de forma que tudo tenha seu lugar, e cada camada com sua responsabilidade, permitindo um trabalho muitos mais “centrado” e modularizado.

Espero que você tenha gostado dessa breve explicação sobre o MVC, e que ela tenha despertado a fagulha de curiosidade/interesse que vai fazer você correr atrás de mais conteúdo sobre o assunto… Te garanto que isso é só a ponta do iceberg.

Momento jabá!

Assando Sites, curso online de CakePHP

Gostou dos exemplos e quer aprender um pouco mais sobre CakePHP? E se eu te disser que tenho um curso que é online e ao vivo, e você aprende sem sair de casa?

Gostou? Então inscreva-se na próxima turma e aprenda a assar sites como um cozinheiro de primeira: Assando Sites, curso online de CakePHP

11 ideias sobre “Mas afinal, o que é o MVC?

  1. Iago

    Muito bom.
    Estou com uma dúvida. A reponsabilidade de manipulação do cabeçalho(variavéis GET,POST) – receber e enviar(header) – é do controller ? Ou não é considerada uma camada e apenas uma classe estática ?

  2. Pingback: MVC | Gabriel Medeiros

  3. Rubens Takiguti Ribeiro

    Thiago, bacana o post. Embora eu não concorde com essa frase sobre a view: “E ela também não busca esses dados, pois eles devem – obrigatoriamente – serem entregues pela camada controller”. Pelo que entendo, isso é uma característica do MVA (Model View Adapter), que é uma variação do MVC. A descrição de MVC é muito ampla e diz que a view pode acessar o model para “consulta”. De fato, o MVA é a variação mais comum de MVC no meio da web, mas é mais restritiva. O importante, no final das contas, é que cada “camada” trabalhe exatamente com suas responsabilidades. O MVA tem seus prós e contras em relação ao MVC “tradicional”.

  4. Mauro

    Vamos ver se eu entendi então no model que terá todas ações de gravações e edições do etc…
    E o controle apenas irá redirecionar para qual página será exibido ?

  5. João Lindoso

    Como sempre, SUPER DIDÁTICO!!! Você e fantástico! Fiz um curso de MVC no Imasters, mas as explicações não foram tão boas quanto as suas. Parabéns! Aqui no trabalho (ministério público do Maranhão) usamos Zend, mas acho muito complicado. Gostaria muito de conhecer o cakephp, mas no momento estou sem tempo. De qualquer forma, muito obrigado pelo post. Bastante didático e elucidativo para quem está dando os primeiros passos em MVC.

Os comentários estão fechados.