Professional Documents
Culture Documents
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.
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.
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 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.
Diagrama de Classe
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.
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