Você já deve ter ouvido falar em microframeworks, mas qual o propósito deles? Qual a diferença entre eles e os full-stack frameworks que estamos acostumados (Symfony, Zend, CodeIgniter….)? Eles resolvem todos os problemas?
Nesse artigo iremos mergulhar em um universo que irá desvendar esses mistérios….
Então vamos lá :D
O que são?
Os microframeworks vieram com um propósito totalmente diferente dos full-stack. Muitas pessoas pensam que eles foram feitos para projetos pequenos (o que iremos ver que não é verdade). Eles foram projetados para diferentes arquiteturas…. Mas como assim?
Os full-stack frameworks muitas vezes nos prendem a uma determinada arquitetura ou estrutura da aplicação onde podemos ter uma grande dificuldade quando queremos modifica-la, mesmo que hoje a moda seja frameworks modulares, eles ainda definem a estrutura dos módulos, classes, e outras partes específicas. Isso não é ruim, mas em determinados cenários eles podem não ajudar muito.
Já os microframeworks trabalham de forma independente de arquiteturas ou restrições de estruturas de pastas, isso não quer dizer que não tenham organização, mas sim que você pode criar sua estrutura. Isso é possível porque eles foram feitos para não resolver todos os problemas existentes, existe um foco, eles foram criados para resolver problemas específicos (ou quebra-los em pedaços menores). Umas das aplicações mais famosas para os microframeworks é a criação de webservices em cima da arquitetura REST, que iremos abordar mais a frente.
Definição Pessoal: Os microframeworks permitem a definição de vários componentes onde podemos anexa-los a uma arquitetura flexível, ou seja, podemos criar uma arquitetura (REST, Restful, MVC, Camadas, Modular, etc…) e utilizar os componentes que desejamos (ORM, Log, OAuth, etc…) como “plugins” para criarmos uma solução robusta, mas ao mesmo tempo simples de implementar.
Como funcionam?
Basicamente quase todos funcionam da maneira mais simples possível. Vamos ver um exemplo escrito em Silex (não se preocupe iremos abordar outros também):
Silex
Slim
Limonade
Notem que os comportamentos são muito parecidos entre eles. Com poucas linhas de código já temos um resultado, claro que vale lembrar que com essas poucas linhas temos uma gama de funcionalidades que eles disponibilizam para nós. Vamos utilizar o Silex para os exemplos a seguir.
A maioria dos microframeworks disponibilizam componentes que encapsulam as soluções e provem uma série de métodos para utilizarmos, por exemplo:
Para utilizarmos ORM em nossa aplicação:
Para utilizarmos ORM em nossa aplicação:
É muito elegante a forma que podemos trabalhar com acesso ao banco e suporte a ORM com poucas linhas escritas. O silex vem com diversos build-in Providers para você poder utilizar, confira aqui quais são.
Criando uma API Restful
Para não extendermos muito esse artigo, vou mostrar como podemos criar uma API Restful para o Silex.
Vamos criar nossa estrutura de pastas:
config/
src/
var/
test/
web/
composer.json
Na pasta config, crie dois arquivos:
dev.php
prod.php
Eles serão responsáveis pelas configurações da nossa aplicação:
Na pasta src, crie dois arquivos:
app.php
controllers.php
O arquivo app.php é responsável por registrar nossos providers e o controllers.php por conter nossa lógica.
E por fim na pasta web criamos dois arquivos também:
index.php
index_dev.php
No arquivo composer.json insira as seguintes linhas:
Nós estamos declarando as dependências do silex. Vamos rodar o comando composer install para instalarmos nossas dependências. Agora temos tudo pronto para desenvolvermos nossa API.
No arquivo index.php, insira:
No arquivo index_dev.php, insira:
O próximo passo é definirmos nossas configurações iniciais. Na pasta config/ editem o arquivo dev.php, nesse arquivo podemos definir as configurações que são de desenvolvimento.
Agora no nosso arquivo prod.php:
Pronto com isso temos as configurações iniciais da nossa API. Agora precisamos registrar os providers que iremos utilizar. Para isso editamos o arquivo src/app.php:
Notem que vamos utilizar apenas 3 providers do silex:
UrlGeneratorServiceProvider - geração de URls
SessionServiceProvider - gerenciador de sessão
SerializerServiceProvider - serialização de dados
Finalmente vamos editar o arquivo principal que é o src/controllers.php. Nele iremos criar as funcionalidades de nossa API Rest.
A primeira coisa a fazermos é entendermos o fluxo do Silex:
Ótimo, agora temos nosso fluxo definido. Vamos entender como o REST funciona:
Definição da API
Descrição: Criar uma API para acessar dados de usuários.
Method
Uri
Descrição
Retorno
GET
/users
Recupera todos os usuários
json-xml
POST
/user
Cria um usuário
json-xml
GET
/user/{id}
Visualiza um usuário
json-xml
PUT
/user/{id}
Edita um usuário
json-xml
DELETE
/user/{id}
Exclui um usuário
json-xml
Entendido oo que precisamos implementar, vamos começar pelo datasource, que será onde guardaremos os dados. Optei por utilizar a sessão para não deixar o exemplo complexo. Dessa forma no começo do arquivo colocamos:
Esses serão os dados iniciais utilizados, isso sumulará um Banco de dados. Com isso feito vamos criar a funcionalidade de listar os usuários, que irá responder a url /users
Para consumirmos esse serviço, no seu terminal faça um curl:
Resultado:
Para criarmos um novo usuário:
Para recuperar um usuário:
Notem que existe um método a mais chamado convert, ele é responsável por pegar o id do usuário e encontra-lo no datasource. Dessa forma podemos receber como parâmetro da nossa função anônima \PhpPb\Entity\User $user.
Para atualizar um usuário:
Para excluir um usuário:
Com isso temos uma API Restfull completamente funcional e simples. A medida que a aplicação vai crescendo vamos sentir a necessidade de separar mais as coisas. Em um artigo futuro irei mostrar como melhorarmos esse exemplo simples.
Para acessar o código completo com os testes e os converters completos, acessem: https://github.com/italolelis/silex-restful-example
Qualquer melhoria é aceita e será legal colaboramos para melhoramos esse código.
Agradeço a todos por terem acompanhado esse artigo. Até a próxima.