Middlewares adicionais para o Zend Expressive 2 \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 02 Horas 

 30 Min 

 21 Seg 

   Tempo restante da oferta: 02 30 21 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Middlewares adicionais para o Zend Expressive 2  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

# 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 ](https://www.treinaweb.com.br/blog/autor/redacao-treinaweb) 10 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2017/06/middlewares-adicionais-para-o-zend-expressive-2.png)  

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.

[  ![Zend Expressive - Microframework PHP](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/zend-expressive.svg)   Curso Zend Expressive - Microframework PHP Conhecer o curso ](https://www.treinaweb.com.br/curso/zend-expressive-completo)

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:

```php
$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:

```php
// 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](https://www.treinaweb.com.br/curso/zend-expressive-completo):

[  ![Zend Expressive - Microframework PHP](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/zend-expressive.svg)   Curso Zend Expressive - Microframework PHP Conhecer o curso ](https://www.treinaweb.com.br/curso/zend-expressive-completo)

Até a próxima!

- [ #PHP ](https://www.treinaweb.com.br/blog/tag/php)
- [ #Zend Expressive ](https://www.treinaweb.com.br/blog/tag/zend-expressive)
- [ #Middleware ](https://www.treinaweb.com.br/blog/tag/middleware)

Autor

 ![Redação Treinaweb](//secure.gravatar.com/avatar/662942287935c97e547cfc12c04be6e5?d=mm)

## Redação Treinaweb

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/redacao-treinaweb)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/09/17132411/middlewares-aspnet-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     8 anos atrás

    ##  [ Compreendendo os middlewares no ASP.NET Core ](https://www.treinaweb.com.br/blog/compreendendo-os-middlewares-no-asp-net-core) 

     Veja como os middlewares funcionam em uma aplicação ASP.NET Core.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/09/17132411/middlewares-aspnet-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     8 anos atrás

    ##  [ Criando um middleware customizado para ASP.NET Core ](https://www.treinaweb.com.br/blog/criando-um-middleware-customizado-para-asp-net-core) 

     Aprenda como criar e conheça as opções de configuração de um middleware customizado no ASP.NET Core.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/05/03175136/NET-CORE-2.1-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     8 anos atrás

    ##  [ Novos recursos do ASP.NET Core 2.1 ](https://www.treinaweb.com.br/blog/novos-recursos-do-asp-net-core-2-1) 

     Conheça os novos recursos do ASP.NET Core 2.1.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/08/14131229/HEALTH-CHECKS-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     7 anos atrás

    ##  [ Verificando a integridade da aplicação ASP.NET Core com Health Checks ](https://www.treinaweb.com.br/blog/verificando-a-integridade-da-aplicacao-asp-net-core-com-health-checks) 

     Verificar e monitorar a integridade de uma aplicação web é algo essencial, principalmente em ambientes distribuídos. O ASP.NET Core facilita esta tarefa através de Health Checks, como você verá neste artigo.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/ASP-NET-ODATA-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     6 anos atrás

    ##  [ Adicionando OData em uma API ASP.NET Core ](https://www.treinaweb.com.br/blog/adicionando-odata-em-uma-api-asp-net-core) 

     OData é um padrão de boas práticas para a criação de API. Veja os recursos que este padrão fornece para uma API ASP.NET Core.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/04/13172051/CORS-400x280.png)  [ Javascript ](https://www.treinaweb.com.br/blog/categoria/javascript) 

     7 anos atrás

    ##  [ O que é CORS e como resolver os principais erros ](https://www.treinaweb.com.br/blog/o-que-e-cors-e-como-resolver-os-principais-erros) 

     Nesse artigo vamos entender o que é CORS, quais os principais erros relacionados com ele, suas principais causas e como resolve-los corretamente.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/04/16095041/OCELOT-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     8 anos atrás

    ##  [ Criando um API Gateway com ASP.NET Core e Ocelot ](https://www.treinaweb.com.br/blog/criando-um-api-gateway-com-asp-net-core-e-ocelot) 

     Conheça o conceito de API Gateway e veja como criá-lo em uma aplicação ASP.NET utilizando a biblioteca Ocelot.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2017/07/checklist-de-seguranca-para-autenticacao-400x280.png)  [ Segurança da Informação ](https://www.treinaweb.com.br/blog/categoria/seguranca-da-informacao) 

     10 anos atrás

    ##  [ Checklist de segurança para autenticação ](https://www.treinaweb.com.br/blog/checklist-de-seguranca-para-autenticacao) 

     Cuidar da segurança é um dos pilares para a sustentação de qualquer aplicação na web. Sem o mínimo não é possível nem mesmo garantir uma razoável disponibilidade.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/05/TRATAMENTO-ERROS-ASP-NET-CORE-C-SHARP-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     6 anos atrás

    ##  [ Tratando erros em uma API ASP.NET Core com Middleware ](https://www.treinaweb.com.br/blog/tratando-erros-em-uma-api-asp-net-core-com-middleware) 

     Tratamento de erros é uma parte importante de qualquer aplicação. No ASP.NET Core, isso pode ser facilitado com o uso de Middlewares.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/08/camadas-e-componentes-do-padrao-arquitetural-porto-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     6 anos atrás

    ##  [ Camadas e componentes do padrão arquitetural Porto ](https://www.treinaweb.com.br/blog/camadas-e-componentes-do-padrao-arquitetural-porto) 

     Conheça as camadas e componentes do padrão arquitetural Porto. Nesse artigo vamos aprender como cada camada se comunica e a responsabilidade dos componentes.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/11/03160827/NANCY-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     8 anos atrás

    ##  [ Criando uma API RESTful com o NancyFx e .NET Core ](https://www.treinaweb.com.br/blog/criando-uma-api-restful-com-o-nancyfx-e-net-core) 

     O NancyFX é um leve framework para o C#. Veja como utilizá-lo para criar uma API RESTful.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/03/05155024/php-reflection-400x280.png)  [ PHP ](https://www.treinaweb.com.br/blog/categoria/php) 

     7 anos atrás

    ##  [ API de Reflexão do PHP ](https://www.treinaweb.com.br/blog/api-de-reflexao-do-php) 

     Veja como usar a API de reflexão do PHP para extrair e até mesmo alterar características internas de classes, interfaces, métodos etc, em tempo de execução.

     Ler artigo

## 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  **02h 30min 21s**

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

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
