Na semana passada, dia 17/03 pra ser mais exato, foi feito um post no twitter oficial do Slim, pedindo que quem tem middlewares prontos para o slim v3.x, que postassem, então, como eu estou vendo hoje a lista vazia, resolvi escrever um postzinho sobre o que são esses middlewares, e como eles funcionam no slim.
Vamos lá, antes de mais nada, é importante dizer os middlewares só são possiveis pela implementação do Rack, que é uma arquitetura pipeline muito usada em frameworks Ruby. Com esta arquitetura você consegue acessar, analisar e modificar o ambiente da sua aplicação. Além de muito elegante é realmente muito funcional.
Existe uma ilustração, muito conhecida de quem desenvolve em slim, que esta em qualquer artigo sobre middleware:
O que for alterado ao ambiente, request e response serão imediatamente propagadas para todo o ambiente da sua aplicação, uma vez que o objeto da aplicação (nosso famoso $app) é compartilhado por toda a aplicação.
Além das referências a aplicação propriamente dita, o middleware tem uma referência a cada inferior a aplicação, através do método $this->next->call(), Assim é possível encerrar seu ciclo de vida explicitamente.
Na documentação do slim, temos um exemplo bem simples de um middleware, que vai deixar toda a saída em maiúsculo.
Para adicionar sua classe middleware á sua aplicação:
Quando eu vi esta funcionalidade, a primeira coisa na qual eu pensei foi em um middleware para autenticação, acho que todo mundo pensa..rs, mas muita coisa pode ser feita, mesmo a implementação em cache, CSRF, e por ai vai...
Pra finalizar esse assunto, venho em breve falar sobre os hooks.
Abraços a todos ai.
Vamos lá, antes de mais nada, é importante dizer os middlewares só são possiveis pela implementação do Rack, que é uma arquitetura pipeline muito usada em frameworks Ruby. Com esta arquitetura você consegue acessar, analisar e modificar o ambiente da sua aplicação. Além de muito elegante é realmente muito funcional.
Entendendo o Middleware
Uma aplicação no slim é a união de várias camadas, e cada camada dessa, é um middleware.Existe uma ilustração, muito conhecida de quem desenvolve em slim, que esta em qualquer artigo sobre middleware:
Essa ilustração, considera que você esta utilizando cache em sua aplicação.
Nessa ilustração, a página(ou o conteúdo que você busca), esta no centro, logo fica claro, que até que você tenha o seu conteúdo gerado, passaremos por todas as camadas anteriores. Essas camadas vnao dizer se prosseguimos na execução ou se desviamos para qq outro lugar.
Quanto a ilustração:
1 - É verificada a autenticação do usuário, se não estiver autenticado o fluxo será interrompido e geramos um erro (401);
2 - Verificamos depois se existe cache da página que esta sendo criada, se sim, mostramos o cache, e interrompemos o fluxo;
3 - Criamos o conteúdo da página solicitada e exibimos.
Bem simples né, da pra entender bem o funcionamento. Quando você cria o seu próprio middleware, ele se tornará uma nova camada desta aplicação, acima de todas as outras existentes.
Implementando o seu middleware
O objetivo do middleware é inspecionar, analisar ou modificar o ambiente de aplicação, solicitação e resposta antes e / ou após que a aplicação Slim é invocada. Dentro do middlware, você pode obter referências para a aplicação facilmente:
<?php class MeuMiddleware extends \Slim\Middleware { public function call() { //Acesso a aplicação $app = $this->app; //Acesso Ao ambiente $env = $app->environment; //Acesso ao objeto request $req = $app->request; //Acesso ao objeto response $res = $app->response; } }
O que for alterado ao ambiente, request e response serão imediatamente propagadas para todo o ambiente da sua aplicação, uma vez que o objeto da aplicação (nosso famoso $app) é compartilhado por toda a aplicação.
Além das referências a aplicação propriamente dita, o middleware tem uma referência a cada inferior a aplicação, através do método $this->next->call(), Assim é possível encerrar seu ciclo de vida explicitamente.
<?php class MeuMiddleware extends \Slim\Middleware { public function call() { //Chama o próximo middleware $this->next->call(); } }
Na documentação do slim, temos um exemplo bem simples de um middleware, que vai deixar toda a saída em maiúsculo.
<?php class AllCapsMiddleware extends \Slim\Middleware { public function call() { // Pegamos a referencia a aplicação aqui $app = $this->app; // Chamamos o proximo middleware $this->next->call(); // Aqui tornamos toda a resposta maiúscula $res = $app->response; $body = $res->getBody(); $res->setBody(strtoupper($body)); } }
Para adicionar sua classe middleware á sua aplicação:
<?php $app = new \Slim\Slim(); $app->add(new \AllCapsMiddleware()); $app->get('/foo', function () use ($app) { echo "Hello"; }); $app->run();
Quando eu vi esta funcionalidade, a primeira coisa na qual eu pensei foi em um middleware para autenticação, acho que todo mundo pensa..rs, mas muita coisa pode ser feita, mesmo a implementação em cache, CSRF, e por ai vai...
Pra finalizar esse assunto, venho em breve falar sobre os hooks.
Abraços a todos ai.