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:
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.
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:
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:
O código do arquivo view/index_view.php é o seguinte:
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:
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 é:
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:
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.
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.
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().
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
Opinião dos Leitores
17 Nov 2008, 13:33
A comunicação entre cliente e servidor deverá utilizar conceitos de web services, to perdido se alguem puder me ajudar fico grato. Se precisarem de ajuda e eu puder retribuir podem contar. Blezzz
25 Ago 2008, 13:35
12 Fev 2008, 01:21
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
09 Jan 2008, 16:19
http://sourceforge.net/projects/izzyfw/
08 Jan 2008, 01:17
Parabéns e até mais.
26 Dez 2007, 11:48
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.
24 Dez 2007, 12:29











