MVC (Model – View – Controller)

30 de março de 2009, em Passos Iniciais, por

Esquema visual do MVC (model - view-controller).

O MVC (Model – View – Controller) já foi citado no artigo sobre padrões de projeto e no artigo introdutório sobre CodeIgniter; foi citado que o MVC é um dos padrões que o CodeIgniter implementa em seu core. Também foi dito que não é preciso saber tanto sobre o que ou como o CodeIgniter implementa os padrões de projeto. Bem, esta é a regra geral. O MVC é uma exceção a isso! É muito importante saber o que é e como funciona o padrão MVC no CodeIgniter a fim de saber como tirar o melhor proveito do framework!

Na verdade, saber sobre o conceito e como funciona o MVC é imprescindível para que você possa mexer, o mínimo que seja, com o CodeIgniter, já que todo o funcionando do framework se dá a partir da lógica e estrutura do MVC.

Por que “MVC”?

Atualmente muitos – muitos, mesmo – softwares utilizam o padrão MVC como base de funcionamento e, no caso, não é à toa, pois a abordagem é realmente muito boa e a lógica por trás faz “valer a pena” adotar o MVC.

O MVC pode ser entendido como uma divisão de tarefas em um aplicativo. Cada um dos 3 – Model, View e Controller – tem sua função bem definida (na teoria) e executa exatamente o que deve; nada além, nada aquém.

Com o desenvolvimento e evolução dos programas e, consequentemente, da forma de se fazer os programas, novas abordagens tiveram que ser pensadas para facilitar a programação e garantir que os softwares, depois de prontos, fossem mais facilmente manuteníveis. A partir disso surgiu o conceito de dividir tarefas, de garantir com que cada “camada” da aplicação tenha seu próprio escopo e definição e que a comunicação entre todas elas se dê de maneira eficiente e controlada.

Façamos uma analogia interessante envolvendo o HTML e o advento do CSS. “Antigamente”, a parte “estética” dos sites era controlada diretamente via tags HTML; se se queria um título na cor vermelho, colocava-se a tag para cores em vermelho; se se quisesse a fonte de tamanho “x”, colocava-se a tag para o texto ficar deste tamanho; e assim por diante. O problema era quando havia um site com 20 páginas ou mais e era preciso alterar o tamanho e a cor de todos os títulos…

Pensando nisso, Håkon Wium Lie teve a brilhante ideia de criar as folhas de estilo em cascata, tão conhecidas hoje em dia como “CSS”. Com CSS, a “aparência” do site, apesar de ser intrinsecamente relacionada com seu conteúdo, pode (e deve) ser controlada de forma independente, em arquivos separados, de forma a garantir a manutenção de um sem intervir no campo de atuação do outro.

E, mais ou menos da mesma maneira, se dá com o padrão MVC: existem funções/objetivos/escopos diferentes para o Model, para o View e para o Controller e cada um destes pode ser alterado, separadamente, por pessoas diferentes, sem interferir/intervir na “área de atuação” do outro! É algo fantástico!

Entendendo o Model, o View e o Controller

Na maioria das fontes que você pesquisar sobre MVC, geralmente vai encontrar primeiramente a explicação de “View” – provavelmente por ser a mais fácil de entender e/ou para não “assustar” muito no primeiro contato com o padrão de projeto. Mas, para seguir corretamente o acrônimo, serão apresentados, respectivamente, o Model (“Modelo”), o View (“Visualização”) e o Controller (“Controle”).

  • Model. Tenha uma coisa em mente: quando pensar em Model, pense em estruturas de dados! Num software baseado em MVC, é o Model que tem o contato com as informações armazenadas e que são mostradas, estejam elas em um banco de dados, arquivo XML, ou onde quer que estejam. É no Model e somente no Model que as operações de CRUD devem acontecer.
  • View. É a apresentação, é o que aparece, é o que é visualizado por quem usa o sistema. É no View que as informações, sejam elas quais forem e de de qual lugar tenha vindo, serão exibidas para a pessoa – logicamente acompanhadas de um bom design, uma boa estrutura organizacional, um ambiente agradável para quem está vendo, e muitos outros.
  • Controller. Como sugere o nome, é responsável por controlar todo o fluxo do programa. É o “cérebro” e o “coração” do aplicativo; é no Controller que se decide “se”, “o que”, “quando”, “onde” e tudo o mais que faz com que a lógica funcione. Desde o que deve ser consultado no banco de dados à tela que vai ser exibida para quem usa o programa/sistema, é no Controller que tudo isso deve ser definido.

Certamente com estas breves descrições não é possível ter um entendimento satisfatório sobre o MVC. Então, leia a definição de MVC da Wikipédia, uma explicação sobre MVC de José Carlos Macoratti e uma explicação de MVC de Maikon Portela. Com essas leituras você certamente vai entender melhor sobre a o padrão MVC. Para facilitar ainda mais, veja esta representação esquemática do modelo MVC (com o perdão da “tradução mais ou menos” que fiz a partir da imagem do Streek):

Estrutura MVC, Model, View, Controller

Como dito, o CodeIgniter utiliza fortemente o padrão MVC para seu funcionamento e o MVC é parte importantíssima de seu “fluxo” de funcionamento; e existem muitos outros, como Bibliotecas (libraries), “Ajudantes” (helpers), Extensões (plugins) e outros. Mas isso é assunto para outro artigo!  ;-)

Fiquem ligados no CodeIgniter Brasil!

35 comentários em "MVC (Model – View – Controller)"

gravatar

Matheus  em 1 de abril de 2009

Show de bola o texto! Um dos passos mais importantes é justamente este: abstrair a idéia de MVC para que se possa aplicá-lo em sua correta forma potencializando seu projeto.

Há casos em que algumas pessoas falam que não precisam utilizar Models, pois o projeto/aplicação é pequeno e/ou não necessita de um tratamento de dados abrangente e por isso “enchem” os controllers…. até que ponto isso é legal?

Ontem ouvi pela primeira vez o termo MVC2, estou lendo um pouco a respeito.

Abraços!

gravatar

Tárcio Zemel  em 2 de abril de 2009

@ Matheus

Que bom que os textos estão sendo úteis, Matheus! Obrigado pela força!

Quanto a essa história dos Models, pessoalmente acredito ser conveniente respeitar o MVC independentemente do tamanho do projeto. Basta pensar que algo pequeno pode crescer muito rapidamente (principalmente em se tratando de projetos online), e ter um retrabalho desnecessário para acertar os Models seria frustrante e anti-produtivo.

"MVC2"?! Também não tinha ouvido falar! Vou pesquisar! Obrigado pela dica e por comentar!

gravatar

Nei  em 14 de dezembro de 2009

Só uma coisa, lendo os diversos artigos, tô tendo dificuldade com algumas imagens, mesmo usando o recurso do browser para aumentar a imagem (ctrl+), algumas ficam difíceis de ler ou entender.
fica aí a dica para linkar a imagem para o tamanho original com algum plugin do WP.

Tô entendendo melhor hein… indo pro próximo artigo…

gravatar

Marcelo Diniz  em 29 de janeiro de 2010

Tárcio, parabéns pelo que vi que vc vem fazendo por quem está querendo aprender, pois boas informações não são encontradas em todos os lugares, e aqui é um onde eu vi algumas informações boas, pelo menos por enquanto. :P

Hj já li alguns posts e vou continuar lendo sempre que der, enquanto eu não ler TODOS os seus posts na parte de passos-inicias não paro, claro, não é leitura para 1 dia, pelo menos para mim, mas vamos a luta, pois quanto antes eu ler, antes aprendo…….

[]’s

gravatar

Tárcio Zemel  em 1 de fevereiro de 2010

@ Nei

Algumas realmente não tem ampliaçã, mas, as que tem, já podem ser vistas em tamanho maior pelo plugin de lightbox que foi instalado. Obrigado pelo alerta! Att

@ Marcelo Diniz

Isso, Marcelo, vamos continuar estudando o CodeIgniter para facilitar nossas vidas de programadores! Assine o feed do CodeIgniter Brasil para não peder as novidades!

gravatar

mateus  em 21 de abril de 2010

Muito bom artigo !

gravatar

José Neto  em 8 de junho de 2010

Muito bom o post!
Optei recentemente por usar uma framework no desenvolvimento de pequenas aplicações necessárias no dia a dia na empresa que trabalho. Seu blog já está aqui em minhas referências parabéns!

gravatar

Tárcio Zemel  em 11 de junho de 2010


@ mateus,
@ José Neto

Obrigado, pessoal; bom saber que este artigo foi útil para vocês! Para não perder outros conteúdos, assinem o feed do CodeIgniter Brasil.

gravatar

Dayanne  em 25 de fevereiro de 2011

Muito bom este texto.:)

gravatar

debianx  em 1 de dezembro de 2011

Muito bom a explicação, algo simples e fácil de entender.

gravatar

Antonio  em 30 de maio de 2013

Caros amigos, to começando nesse mundo MVC e aqui deixo minha dúvida:
Imaginemos a seguinte situação. Estruturei minha pagina (site) e nela inclui: com $this->load->view() (o header, o menu, uma side-bar e footer). Considerando esses conteudos sao fixos, agora controler so preciso chamar a pagina( site ) passando o array de dados com algumas variaveis dinamica (tituloheading, titulo principal, etc) e tb uma variavel que dinamicamente vai chamar as paginas do site como tenho vistos em vários tutoriais. Até ai tudo bem. Mais minha duvida é asguinte: Imaginemos que no meu side-bar, sera mostrado um bloco com as ultimas noticia e outro bloco com as novidades. Nesta caso se eu criar essa consultas no Model, posso imprimir diretamente essa informações no meu side bar, ou é preciso obrigatoriamente passar essa informações sempre naquele array de dados que foi setado no controller, e que provavelmente vai estar em todos as sua funções?

gravatar

Tárcio Zemel  em 1 de junho de 2013

Não é obrigatório, mas é uma boa prática passar elas "naquele array de dados que foi setado no controller".

gravatar

Rafael Henrique  em 26 de dezembro de 2016

Obrigado por compartilhar, Tárcio. Me ajudou muito! Sempre tive dificuldade com MVC, entender o conceito, as responsabilidades entre as camadas. Excelente artigo

gravatar

Marcos Alberto  em 3 de julho de 2017

Valeu pelas dicas estou me batendo um pouco aqui codigniter mas graças alguns sites inclusive o seu a coisa esta andando

gravatar

Marcos Sales  em 4 de julho de 2017

Voces me ajudaram a entender bastante coisa, também venho de uma escola antiga de PHP e tenho alguma dificuldade com MVC. Muito bom o posto Diogo.

Comente!