Middleware e Zend Expressive

Introdução

Neste post vou falar um pouco sobre Middleware, Zend Stratigility, Zend Expressive e dois exemplos reais de middleware que fiz: LosRateLimit e LosLog.

Middleware

Muito tem se falado ultimamente sobre Middleware, mas o que é?

Middleware, no mundo do PHP, nada mais é que um código que recebe uma requisição HTTP, uma resposta HTTP, um callable e faz “alguma coisa” com eles. Os middlewares PHP ganharam força com a aprovação do PSR-7, onde temos requisições e respostas http padronizadas e cada vez mais frameworks estão se adequando.

Como sou uma pessoa que entende melhor as coisas através de exemplos, vamos ver um middleware bem simples que apenas adiciona um cabeçalho à requisição:

Primeiro pegamos a resposta e adicionamos um novo header a ela. Em seguida, chamamos o próximo middleware, se existir, ou retornamos a resposta.

Uma grande vantagem dos middlewares, é que eles tendem a ser “framework-agnostic”, ou seja, independem de framework. A medida que as frameworks seguem mais os padrões, como o PSR-7, mais fácil fica para usarmos componentes middleware em qualquer uma. O exemplo acima poderia ser usado em qualquer framework php que aceite PSR-7.

Mas o que fazer com isso? Onde isso se encaixa na minha aplicação?

Um middleware deve seguir o princípio “Faça apenas uma coisa e faça bem”. Então na verdade uma aplicação seria um conjunto de middlewares trabalhando juntos. Por exemplo:

Este seria um exemplo de um site usando middlewares, onde cada middleware fica responsável por uma “rota”. Poderíamos acrescentar um middleware de autorização que roda em primeiro lugar:

Mas para montarmos uma aplicação completa, precisamos de mais algumas coisas, e aí entram o Zend Stratigility e Zend Expressive!

Zend Stratigility

O Zend Stratigility é uma biblioteca que permite criar aplicações usando middlewares.

Vamos ver uma aplicação bem simples usando o zend-stratigility:

Neste exemplo, temos 2 middlewares.

O primeiro, escuta o caminho raiz. Se a url for “/” ou vazia, ele escreve “Hello world!” na tela e sai. Se a url for diferente, ele chama o próximo middleware da fila.

O segundo escuta a rota “/foo” e escreve “FOO!” na tela.

Bem simples não é? Vamos reescrever o exemplo das rotas mostrado anteriormente no zend-stratigility:

Normalmente uma aplicação “real” não é tão simples, temos rotas com parâmetros (alguns opcionais), banco de dados, templates, etc. O Zend Expressive entra para nos ajudar nesta junção.

Zend Expressive

O Zend Expressive é uma microframework PHP baseada no Zend Statigility. Ela te dá liberdade de escolher os componentes que você quiser usar, mas já trás algumas opções.

O Zend Framework 3, deve usar o Zend Expressive internamente para tratar os middlewares.

Vamos iniciar criando um novo projeto:

Em seguida, vamos iniciar um servidor php pelo console na nossa aplicação:

E abrir no nosso navegador o endereço: http://localhost:8080

expressive1

Vamos clicar no link “Ping Test” na barra superior e ver o retorno:

Vamos analisar como isso funciona internamente?

Olhando o arquivo config/autoload/routes.global.php:

Nos diz que para a rota /api/ping será executado o middleware PingAction:

Que retorna apenas um json com o ack. Muito fácil, rápido e prático.

Como gera a Home? Primeiro vamos ver o src/Action/HomePageFactory.php:

Como por padrão podemos escolher qual roteador e templates usar, ele busca as configurações e cria o Middleware HomePageAction em si ( que mostro aqui de forma simplificada:

Se você for fazer um site ou sistema pequenos ou uma api simples, o Zend Expressive é uma ótima pedida.

LosRateLimit

Como exemplo real de um middleware, eu precisei escrever um limitador de acesso para uma API e, como ela foi escrita usando o Zend Expressive, criei o limitador como middleware e também o uso num projeto em ZF2:

https://github.com/Lansoweb/LosRateLimit

Ele é chamado no começo da requisição e controla quantos acessos foram feitos pelo usuário num espaço de tempo, se exceder um limite configurado, o acesso é negado retornando um erro 429.

O código principal do middleware está em aqui e o middleware mantém a filosofia que citei acima: Ele é responsável apenas por controlar a quantidade de acessos por tempo e bloquear se necessário, não importando o que veio antes nem o que será executado depois.

LosLog

Também atualizei o LosLog para a versão 2.0, adicionando um middleware e várias mudanças internas.

Pode conferir o módulo no github aqui.

Até a próxima!

Leandro Silva

PHP developer since 1997, loves movies, music and dogs.

4 Comentários para: “Middleware e Zend Expressive

  1. Olá Leandro, tudo bem?

    Tenho uma dúvida…

    No caso…

    $app = new MiddlewareRunner();
    $app->add(new AuthorizationMiddleware());
    $app->add(‘/contact’, new ContactFormMiddleware());
    $app->add(‘/forum’, new ForumMiddleware());
    $app->add(‘/blog’, new BlogMiddleware());
    $app->add(‘/store’, new EcommerceMiddleware());
    $app->run($request, $response);

    o blog poderia ser um wordpress,
    O store ser um magento

    e por ai vai…

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

*