You are on page 1of 27

MVC com PHP

Nesse artigo irei demonstrar na prtica, a aplicao do padro de projeto MVC com PHP. Para isso,
construirei um aplicativo de Agenda de Contatos Telefnicos conforme requisitos funcionais, diagramas e
cdigo que sero mostrados ao longo desse texto. Mas, antes de comear, aconselho a vocs que leiam o
artigo de introduo a MVC, o mesmo poder ser visualizado acessando o link Entendendo 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 1 Hierarquia de Diretrios e Pastas

Diretrio controllers
Conforme se pode deduzir pelo nome, irei us-lo para guardar as classes da camada de controle do
sistema, as famosas classes controladoras ou controllers, responsveis por fazer 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 e telefones usando um banco de dados SQLite, nesse diretrio que o arquivo referente ao
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 por exemplo, classes
de filtros de dados, validaes genricas, helpers (caso haja algum), interfaces e abstraes no ligadas
camada de negcio do sistema. Se estivesse construindo 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 de negcio do
sistema, como por exemplo, as classes Contato e Telefone, entre outras.

Diretrio views
Esse o diretrio onde guardarei os arquivos HTML do sistema, tais arquivos representam a
camada de visualizao (view), da qual foi falada no artigo de introduo ao 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 classes
necessrias para a separao do sistemas em camadas (Modelo Model, Viso View , Controlador
Controller). A primeira delas que mostrarei, a de controlador genrico, no diretamente ligado s regras de
negcio do sistema de Agenda Telefnica. Veja o exemplo abaixo.

Conforme vocs devem ter visto acima, usei o sufixo Controller no nome da classe e Action no
nome do mtodo. Esse o padro de nomenclatura que irei utilizar em todas as outras classes da camada
Controle e seus mtodos. Alm disso, nomearei os arquivos que iro conter as classes com o mesmo nome
da prpria classe.

A segunda classe que implementarei ser a Application. A responsabilidade da mesma ser a de


verificar qual classe da camada de controle (Controller) e qual mtodo da classe (Action) o usurio deseja
executar. D uma olhada no cdigo abaixo, espero que ele seja simples o suficiente para esclarecer seu
modo de funcionamento.
Apesar da classe acima no ter semelhana alguma com a classe IndexController que escrevi, ela
tambm faz parte da camada de controle (Controller), mas est num nvel mais acima. O fato dela ser
responsvel por verificar qual controlador (Controller) e qual mtodo (Action) ir executar, faz da mesma
o corao do sistema.

A terceira classe que irei implementar ser responsvel por cuidar da camada de visualizao.
Apesar de cdigo um pouco extenso, ela uma classe sem muitas funcionalidade, mas poder ser
enriquecida de acordo com nossas necessidades futuras.
Os dados de algumas classes da camada de modelo devero persistir no banco de dados, para
isso, ser necessrio a implementao de pequeno bloco de cdigo responsvel pela conexo entre o
sistema e o SGDB. A alternativa que adotarei ser a de implementar uma classe abstrata, que dever ser
herdada pelas classes em que os dados devero ser armazenados no banco de dados. Veja cdigo da
classe abstrata a seguir.
Conforme Vocs j devem ter visto, a classe PersistModelAbstract faz referncia ao
arquivo db.sq3 dentro do diretrio databases, esse arquivo ser o responsvel por guardar nossos dados.
Irei mostrar isso na prtica com o continuar desse artigo.

Implementarei tambm, duas outras pequenas classes, a primeira ser usada para filtrar os dados
passados via POST e GET e a segunda ser usada para validar os dados. Irei cham-las
de DataFilter e DataValidator, respectivamente.
Por fim, irei implementar o cdigo do arquivo index.php, o mesmo ser extremamente simples.
Veja abaixo.
Nesse estgio de desenvolvimento, a hierarquia de diretrios e arquivos deve se dar como
a Imagem 2 mostrada abaixo.

A Camada de Negcios
Agora, com as classes do sistema implementadas, irei finalmente me preocupar com as regras 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

Diagrama de Classe

Nesse diagrama, apenas documentarei as classes diretamente ligadas ao sistema de Agenda


Telefnica, a diagramao das classes que implementei acima no ser abordada.
Diagrama de Entidade Relacionamento

Pelo fato da necessidade da persistir os dados de contato e dos telefones, ser necessrio duas tabelas para guardar
os dados das classes. Veja o Diagrama de Entidade Relacionamento (DER) abaixo.

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 me referendo 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 classe PersistModelAbstract.
Agora a vez da classe TelefoneModel ser implementada.
Depois das classes da camada de modelo implementadas, o prximo passo escrever o cdigo das classes
de controle referente ao fluxo de gerenciamento das classes acima. Elas tambm sero
duas, ContatoController e TelefoneController.
e por sua vez a classe TelefoneController
Arquivos de visualizao ou views
As classes implementadas acima esto fazendo referncia arquivos HTML contidos na camada de
visualizao, para esse programa funcionar, ser preciso implement-los. Isso o que irei fazer agora.

Arquivo listarContatos.phtml
Diretrio Pai views
Arquivo listarTelefones.phtml
Diretrio Pai views
Arquivo manterContato.phtml
Diretrio Pai views
Arquivo manterTelefone.phtml
Diretrio Pai views
Cada mtodo (Action) da classe de controle (Controller) faz referncia um arquivo HTML (View).
Assim se cumpre a profecia de intermdio entre a camada de controle e a camada de visualizao. Onde o
controle faz consultas camada de modelo e repassa a resposta para a camada de visualizao.

Aps o cdigo implementado, para selecionar o Controlador e a Ao que quer executar, basta
envia-las via GET ou POST, como por exemplo ?controle=Contato&acao=listarContato. Com esses
parmetros, o mtodo listarContatoAction da classe ContatoController ser executado.

Para entender um pouco melhor o funcionamento desse programa, visualize o Diagrama de


Sequncia da funcionalidade Listar Contatos mostrado na Imagem 6 abaixo. Ele ser executado por padro
quando nenhum outro for requisitado pelo usurio.
Quer ver isso funcionando? Acesse o link http://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 o
arquivo lib/PersistModelAbstract.php e deix-lo como abaixo, preenchendo apenas os dados da sua conexo e
credenciais referentes.

Mais sobre MVC com PHP


H um tempo atrs, encontrei um material em vdeo muito bom sobre como montar um Mini-Framework no padro MVC
com PHP. Para acessar esse videos, clique em Criando um Mini Framework PHP 5 com MVC
Mais sobre Padres de Projeto
O MVC um dos Padres de Projetos mais importantes hoje em dia, mas no est sozinho. Existem vrios outros
padres por ai, eles nos ajudam a organizar o cdigo, resolver problemas que costumamos enfrentar no dia-dia da
Programao Orientada a Objeto. Sendo assim, vale muito a pena estudar sobre eles, pois um bom programador no
aquele que apenas codifica solues excepcionais, mas tambm o que consegue organizar com clareza seu cdigo.
Veja uma lista de alguns padres organizados por suas 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

You might also like