Promoção no ar
Tempo restante da oferta:
03 Horas
33 Min
50 Seg
Assinar →

Middlewares adicionais para o Zend Expressive 2

Veremos neste artigo como adicionar uma camada de retorno usando middleware, com o objetivo de flexibilizar futuros retornos no Zend Expressive.

Redação Treinaweb 10 anos atrás

Por se tratar de um micro framework totalmente baseado em middlewares o Zend Expressive 2 nos permite inicialmente trabalhar no middleware de aplicação e posteriormente adicionarmos camadas comuns ao projeto.

Faremos um middleware genérico que analisará o header Accept enviado pela requisição, adicionaremos um middleware após a execução da ação principal da rota, e o mesmo formatará a saída de acordo com o solicitado.

Curso Zend Expressive - Microframework PHP Conhecer o curso

Para entendermos melhor os exemplos, trabalharemos na versão do framework usando o skeleton inicial e definindo a opção “Minimal”, da qual somente a estrutura de configuração base vem pronto.

Usaremos as implementações direto nos arquivos config: routes.php e pipeline.php, o que pode ser facilmente substituído por definições de factories no contêiner de serviços.

Show me the code!

Começamos com uma simples rota ela será somente um exemplo de implementação de persistência de um livro em uma API de livraria.

Veja o código:

$app->post('/api/livros', function ($request, $delegate) {
    
    // Implementação de persistência retorno da identificação do livro
    $data['livro_id'] = 12;

    // A Resposta é delegada para o proximo middleware 
    // formatar a resposta xml ou json
    $response = $delegate->process($request->withAttribute('data', $data));

    // Response já implementado
    return $response;
});

Ao ser delegado ao próximo middleware, o mesmo precisará existir, para isso podemos colocá-lo na rota ou na pipeline, ao colocar na pipeline criaremos um modelo de retorno que sempre vai validar a existência de Accept, caso exista, será lido e retornado o tipo pedido, caso contrário retorna JSON.

A seguir colocamos em pipeline.php, após o dispatch dos middlewares de aplicação, o middleware que cuidará das respostas, veja o código a seguir:

// Register the dispatch middleware in the middleware pipeline
$app->pipeDispatchMiddleware();

use ZendDiactorosResponseJsonResponse;
use ZendDiactorosResponseEmptyResponse;

$app->pipe(function ($request, $delegate) {
    // Recebe o tipo de retorno aceito
    $type = $request->getHeaderLine('Accept');
    switch ($type) {
        case 'application/xml':
            // Implementação de resposta xml
            // não implementada!
            return new EmptyResponse(501);
            break;
        case 'application/json':
        default:
            // Implementação de resposta json
            return new JsonResponse($request->getAttribute('data'));
            break;
    }
});

// At this point, if no Response is return by any middleware, the
// NotFoundHandler kicks in; alternately, you can provide other fallback
// middleware to execute.
$app->pipe(NotFoundHandler::class);

Conclusão

Conseguimos dessa forma isolar a implementação de retorno, que pode futuramente ter mais opções, inclusive podemos implementar posteriormente o padrão Strategy, para que a lógica de cada tipo de formatação fique definida por sua classe seguindo um contrato único.

Observe que o middleware de resposta vai procurar pelo atributo data que deverá existir e precisa ser validado.

Com este exemplo, você poderá facilmente partir para outros middlewares adicionais como validação, permissão, classificação etc.

Quer adentrar ainda mais no assunto? Veja o nosso curso de Zend Expressive 2:

Curso Zend Expressive - Microframework PHP Conhecer o curso

Até a próxima!

Continue lendo

Artigos relacionados

Um ano de acesso total para você viver de programação.

Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro console.log ao mercado de trabalho.

  • 1 ano de acesso a todos os cursos
  • Cursos novos toda semana
  • Suporte direto com professores
  • Plano de carreira personalizado
  • Certificados digitais inclusos
  • Aplicativos para Android e iOS, com acesso offline
Garantia incondicional de satisfação

Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

Acesso completo a todos os cursos e dezenas de Formações.

12 meses
Economize R$ 840,00 54% OFF

de 12x R$ 129,00 por apenas

12x R$ 59,00

sem juros no cartão de crédito ou R$ 599,00 à vista

Oferta termina em 03h 33min 50s

  • Acesso imediato e ilimitado durante 1 ano.
  • Plano de carreira personalizado.
  • Suporte direto com professores.
  • E muito mais!
Matricule-se agora