Assine a Lista Dicas-L
Receba diariamente por email as dicas
de informática publicadas neste site
Para se descadastrar, clique aqui.
Miniframework PHP
Colaboração: Elton Luís Minetto
Data de Publicação: 08 de Janeiro de 2008
Nas últimas semanas fiz uma pesquisa para encontrar um framework PHP que
eu pudesse usar em meus aplicativos/sites. Encontrei vários frameworks
interessantes como:
- Symphony
- Prado
- Code Igniter
- Zend Framework
Depois de ver vários deles uma pergunta me ocorreu: "realmente preciso de
um framework?". Realmente utilizar um destes frameworks auxilia bastante o
desenvolvimento, evitando que você refaça coisas que já existem. Mas muitas
vezes estes frameworks possuem alguns problemas:
- são muito maiores do que você precisa;
- a documentação é confusa;
- poucos estão suficientemente maduros;
- é preciso aprender uma nova sintaxe ou maneira de se desenvolver;
- você fica engessado , é difícil fazer coisas mais avançadas ou que saem do padrão CRUD;
Então pensei que o que eu preciso é somente uma maneira de separar a lógica
da apresentação, uma maneira de facilitar o acesso a bancos de dados e algo
que me ajude a trabalhar com AJAX. Assim, peguei algumas idéias que vi nas
documentações que li e algumas coisas que já utilizava e uni tudo para suprir
minhas necessidades.
Modelo de aplicação
MVC Architecture?
Segundo Rasmus Lerdorf, criador da linguagem PHP, MVC é palavra do momento
em arquiteturas de aplicação web. Ela vem do design de aplicações para desktop
orientadas a eventos e não se aplica muito bem no design de aplicações web. Mas
felizmente ninguém sabe exatamente o que MVC significa, então você pode chamar
seu mecanismo de separação de camada de apresentação de MVC e seguir em frente.
Então, o que estou usando aqui é somente um mecanismo de separar o layout
(html+css) do código PHP. Ao invés de usar as três camadas do MVC eu resumi
para duas, Visão e Controle.
A parte da visão é representada por templates. Seguindo outra tendência que
percebi em outros frameworks a parte de visão é representada por simples
scripts PHP ao invés de utilizar uma das ferramentas de Templates como Fast
Template, Smarty, etc. É mais simples de trabalhar e não é necessário aprender
uma nova sintaxe.
Para a parte do controle eu desenvolvi uma classe chamada app. Nesta classe
eu controlo as ações do usuário. Ela age como o controlador das aplicações
testando qual ação o usuário escolheu e invocando o método correto (que
deverá ser reescrito nas suas subclasses, as novas aplicações). A idéia é
que cada aplicação seja uma subclasse da classe app.
Este é o código da classe app:
Classe app
Outra classe desenvolvida é a classe tabela. Esta classe é responsável por
abstrair e facilitar a manipulação de tabelas de bancos de dados. Seu código
fonte é descrito abaixo.
Classe tabela
Exemplo de aplicação
Para ilustrar o funcionamento eu criei uma pequena aplicação com as classes. A
aplicação é um sistema de blog, com posts e comentários.
A estrutura de diretórios ficou assim:
| classes/ |
diretório com as classes |
| classes/app.php |
classe app |
| classes/tabela.php |
classe tabela para tratamento de tabelas no banco de dados |
| classes/adodb |
classes adodb para abstração de bancos de dados. necessário para a classe tabela. |
| classes/JSON.php |
para utilizar JSON, usado por algumas páginas que usam AJAX |
| blog/ |
diretório da aplicação |
| blog/index.php |
subclasse da classe app |
| blog/view/ |
diretório com as visões |
| blog/view/index_view.php |
visão inicial |
| blog/view/login_view.php |
visão da página de login |
| blog/view/comentario_view.php |
visão dos comentários |
| blog/view/admin_view.php |
visão da página de administração |
| blog/view/estilo.css |
arquivo com as definições de CSS para as visões |
| blog.sql |
arquivo sql com os comandos para criar as tabelas da aplicação |
A primeira tarefa é criar a base de dados e as tabelas que serão utilizadas
no exemplo. Para isso foram executados os seguintes comandos sql (gravados
no arquivo blog.sql):
create database blog;
use blog;
create table post (id_post int primary key auto_increment, tit_post varchar(255), ds_post text, dt_post date);
create table comentario(id_com int primary key auto_increment,ds_com text, email_com varchar(100), id_post int);
A base de dados usada neste exemplo é o MySQL.
O código do arquivo index.php do diretório blog deve ser uma subclasse da classe app. O código inicial ficou desta forma:
index.php inicial
O primeiro método a ser escrito é o método index(). Este método é o método
inicial da aplicação. O construtor da classe app sempre vai invocar este
método caso não tenha sido escolhida outra opção. Complementando o código:
index.php - metodo index()
O código do arquivo view/index_view.php é o seguinte:
index_view.php
O método showView da classe app vai transformar cada índice do vetor $dados
em uma variável ou em um novo vetor. Então o script index_view.php vai
simplesmente imprimir seus valores. Uma nova linha deve ser adicionada no
final do arquivo index.php :
$blog = new blog( mysql://root:@localhost/blog );
Nesta linha é instanciado um novo objeto da classe blog criada. Como
parâmetro para o construtor da classe é enviado a string de conexão com
a base dados. Esta string é no formato usado pelo ADODB e a sintaxe para
diversos bancos de dados podem ser encontradas no site da ferramenta.
Todas as definições de cores, fontes e estilos foram adicionadas no arquivo
estilo.css utilizando-se as técnicas de CSS. Desta forma, os arquivos de visão
não possuem formatações de estilo e sim somente informações dos dados que
devem ser gerados. A parte de formatação fica em separado, o que facilitaria
caso fosse necessário alterar as definições de layout da aplicação. O código
do arquivo estilo.css é o seguinte:
estilo.css
O próximo passo é criar as outras ações da aplicação. Por exemplo, quando
o usuário clicar no link comentários ele será direcionado para:
http://localhost/blog/index.php?op=comentarios&id_post=15
Como a variável op controla a ação que o usuário escolheu precisamos definir
um novo método na classe blog para atender a esta requisição. Então o seguinte
código deve ser adicionado aos métodos da classe blog (arquivo index.php):
index.php - método comentario()
O método comentarios() faz uso da visão comentario_view.php. Seu código é:
comentario_view.php
Assim, quando o usuário clicar no link Adicionar comentário na página
inicial serão apresentados os comentários existentes e um formulário para
adição de um novo comentário, conforme a imagem abaixo ilustra:
Quando o usuário submeter os dados do novo comentário a ação addComentario
será executada, como indicado pelo input hidden chamado op na linha 26 do
comentario_view.php. Para que esta ação seja executada o seguinte código
deve ser adicionado no arquivo index.php.
index.php - método addComentario()
Quando o usuário clica no link Admin da página inicial ele é redirecionado
para a visão que mostra o formulário de login. O método da classe blog que
realiza esta ação é:
index.php - método mostraLogin()
E o código fonte do arquivo login_view.php pode ser visualizado abaixo:
login_view.php
O método login da classe blog é responsável pela validação do usuário e
por mostrar a visão de administração. Neste exemplo não é feito nenhuma
validação específica, isso é deixado a cargo do leitor, podendo implementar
algum método de autenticação que seja pertinente.
index.php - método login()
A visão de administração é a mais complexa de todas. Além de mostrar os
posts já cadastrados na tabela ela fornece opções de exclusão e de alteração
dos mesmos. Para melhorar a interação com o usuário é usado técnicas de
AJAX para buscar os dados do post antes do usuário realizar a alteração.
O código do arquivo admin_view.php é mostrado abaixo, com seus comentários.
admin_view.php
Quando o usuário clica no link Alterar uma conexão assíncrona é
aberta com o servidor via AJAX solicitando os dados do post. Os dados
são codificados no formato JSON. JSON é um formato leve para troca de
informações. É facil para humanos lerem e escreverem. E é fácil para
as máquinas processar e gerar. Uma espécie de XML ligth. É baseado na
notação de objetos do JavaScript, o que cai como uma luva para usar com
o XMLHttpRequest. A classe blog utiliza o include JSON.php para gerar os
dados neste formato. Este script pode ser encontrado no repositório PEAR,
no endereço http://pear.php.net/pepr/pepr-proposal-show.php?id=198 e mais
informações sobre o JSON podem ser encontrados no http://www.json.org.
Abaixo é mostrado o código final da classe blog com todos os métodos comentados
acima e os métodos restantes, addPost(), del(), altPost() e buscaPost().
index.php - arquivo final
Tenho usado estas classes em alguns novos projetos que estou desenvolvendo
e o ganho de produtividade tem sido interessante. Se ajudar para alguém fica
aí minha contribuição.
Veja a relação completa dos artigos de Elton Luís Minetto
Referências Adicionais
Referências adicionais sobre os assuntos abordados neste site podem ser encontradas em nossa Bibliografia.
Avalie esta dica
- Currently 3.02/5
- 1
- 2
- 3
- 4
- 5
Avaliação:
3.0 /5
(450 votos)
Opinião dos Leitores
Wagner
25 Ago 2008, 13:35
Elton, seu trabalho é espetacular ! Vc merece o reconhecimento do resto dos programadores pela sua visão e simplicidade. Acredito que se todos trabalharmos em seu mcvPHP, a sua solução poderia se tornar Universal e oferecer uma alternativa ao fasttemplate,smarttemplate, só para começar...parabéns !!
Jean Ferri
12 Fev 2008, 01:21
Olá Elton,
Concordo contigo que sempre é útil usar um framework mas diante da enxurrada de web frameworks que existe hoje, se cada desenvolvedor for fazer o seu próprio framework o negócio perde o sentido.
Sem desconsiderar o seu excelente trabalho, acredito que valha mais a pena a gente tentar localizar um framework que se encaixe em nossas necessidades e ajudar a melhorar esse framework.
O framework "tiny" que você construiu é parecido com o que eu gosto de usar no Zope, o CMFFormController, que permite separar a apresentação, lógica de controle e lógica de validação dos forms.
Fica aí a dica, quem sabe você gosta. Python também é muito legal! ;-)
Abraço
Daniel Angelone
09 Jan 2008, 16:19
da uma olhada nesse framework criado por um brasileiro Muito bom o que esta faltando mesmo é um manual
http://sourceforge.net/projects/izzyfw/
joaoborges
08 Jan 2008, 01:17
Parabéns pelo excelente trabalho, concordo com vc sobre a utilização dos frameworks e acredito que este seu trabalho possa ser estendido para um excelente tiny-framework, claro que sempre mantendo esta filosofia de simplicidade e consistência.
Parabéns e até mais.
rodrigo saraiva
26 Dez 2007, 11:48
Olá Elton,
concordo com você que a maioria dos frameworks de desenvolvimento para PHP não são maduros.
porém não concordo que alguns deles engessem a aplicação.
os melhores que eu conheço são: code igniter e zendframework (mais trabalhoso para configurar).
um pouco mais de calma e você começará a utilizar um deles além do crud.
vantagem grande desses é que os templates são baseados em html com php, o que não implica em aprender outra sintaxe para templates (smarty é coisa do demo). e o prado não sei como tem gente que utiliza aquele lixo ainda.
guigouz
24 Dez 2007, 12:29
Já passei pelo mesmo problema :) se quiser dar uma testada, http://code.google.com/p/influx