Zend Expressive

Laminas: O futuro do Zend Framework

Se você acompanha os principais frameworks em PHP já deve ter ouvido falar sobre o Laminas. Para quem não sabe, esse é o novo nome do já conhecido Zend Framework, um dos mais antigos frameworks em PHP com um foco no mercado de soluções enterprise. Antes de falar sobre essa mudança de Laminas para Zend, vamos começar falando sobre a história do Zend Framework.

História do Zend Framework

Quem programa com PHP faz algum tempo já deve ter usado ou pelo menos ter ouvido falar sobre o Zend Framework. Para uma introdução sobre o que é o Zend Framework leia esse artigo no link. Lançado em março de 2006, o Zend Framework 1 foi um dos primeiros frameworks PHP de todos os tempos, e até o momento a versão com maior tempo de suporte de todos os frameworks em PHP, totalizando um pouco mais de 10 anos de suporte.

De 2006 pra cá, o Zend Framework acompanhou e contribuiu com a evolução do ecossistema do PHP, seja suportando novas versões da linguagem, adicionando suporte ao Composer e melhorando seu comportamento interno. Em 2012 foi lançado o Zend Framework 2, que iniciou o processo de modernização do framework em componentes menores e independentes, cada qual com seu próprio ciclo de vida além de outras melhorias.

Essa quebra do core do framework permitiu que projetos derivados pudessem ser criados, como o Apigility, um pacote de ferramentas especializado no desenvolvimento de API e também o Expressive, um micro framework modular baseado na PSR-7 que te permite escolher quais componentes você quer utilizar, suportando tanto componentes do Zend Framework como outros componentes mantidos pela comunidade.

Zend Expressive - Microframework PHP
Curso de Zend Expressive - Microframework PHP
CONHEÇA O CURSO

Além da ajuda da comunidade, tudo isso aconteceu com o suporte da Zend, empresa fundada em 1999 por Andi Gutmans e Zeev Suraski depois que eles redesenharam o até então PHP-FI, escrito originalmente pelo Rasmus Lerdorf. Em 1998 eles lançaram o Zend Engine, que se tornou o PHP 4 e desde então tornou a base da linguagem que utilizamos hoje em dia (claro, com muitas melhorias e evoluções se comparado com aquela época).

O fim do Zend Framework

Não podemos negar a importância histórica que a Zend trouxe para o ecossistema do PHP, tanto com o Zend Framework como com outras iniciativas da empresa. Porém, em Outubro de 2015, a Zend Technologies foi adquirida pela Rogue Wave Software. Tudo ia bem com o suporte ao Zend Framework. Foi nessa época inclusive que foi lançado o Zend Framework 3, junto com Expressive, consolidando a visão de um framework baseados em componentes individuais e com um ciclo de vida próprio.

Mas isso mudou quando a Rogue Wave Software foi adquirida pela Perforce em Janeiro de 2019. Nessa época, a companhia decidiu rever seu portfólio de projetos e infelizmente continuar suportando o Zend Framework não estava em seus planos. Porém o projeto em si não seria abandonado, em Abril do mesmo ano foi anunciado a transição do Zend Framework para a Linux Foundation, sob o nome de The Laminas Project.

A Linux Foundation é uma organização sem fins lucrativos especializada em projetos open source. Além de ajudar a manter e padronizar o Linux, outros projetos que fazem parte da Linux Foundation incluem o Kubernetes, Jenkins, GraphQL e até NodeJS. Isso da até uma segurança maior para nós, desenvolvedores e também para as empresas, pois temos uma garantia ainda maior na continuidade da evolução do projeto, agora gerido por um modelo de governança que já foi provado que funciona.

O início do Laminas

Após esse anúncio, iniciou o processo de migração do Zend Framework para o Laminas. Por questões de copyright, acredito eu, o nome Zend precisou ser abandonado em favor do Laminas. Com isso, todos os componentes que antes estavam sob o guarda-chuva da Zend passaram para a organização do Laminas dentro do GitHub.

Apesar de ser uma grande mudança, que pode envolver alterar as dependências dos seus pacotes no Composer, essa fase de transição (que já começou e ainda está acontecendo) tem como objetivo garantir uma migração mais suave o possível. O mesmo líder de projeto responsável por manter o Zend Framework, o Matthew Weier O’Phinney, manteve sua função no projeto, agora como líder do Laminas.

Para auxiliar nessa migração, você pode utilizar uma ferramenta de migração em seu projeto que será responsável por atualizar todas as dependências do Zend gerenciadas pelo Composer para a dependência correspondente no Laminas, entregando assim uma maneira de migrar projetos inteiros em alguns poucos comandos, incluindo também suporte para migrar projetos antes desenvolvidos com Expressive e Apigility.

Falando sobre Expressive e Apigility, eles também foram renomeados para Laminas Mezzio e Laminas API Tools, respectivamente, aproveitando assim o momento de alteração do projeto principal.

Subprojetos do Laminas

Desenvolvedor PHP Sênior
Formação: Desenvolvedor PHP Sênior
Nesta formação você aprenderá aspectos avançados da linguagem PHP e de seu ecossistema, conhecimentos essenciais para se tornar um desenvolvedor diferenciado, e com isso, você terá conhecimento para desenvolver aplicações PHP usando as práticas mais modernas do mercado.
CONHEÇA A FORMAÇÃO

Status atual da migração para o Laminas

Nesse momento, já estamos em uma fase bem avançada da migração para o Laminas. Os componentes do Zend já foram migrados para os novos repositórios na organização do Laminas e as referências dos componentes no Composer já podem ser utilizados.

Inclusive, ao tentar utilizar um componente do Zend, você receberá uma mensagem informando que o mesmo foi abandonado e que você deve atualizar suas dependências para utilizar o componente do Laminas:

Componentes do Zend Framework descontinuados

Composer - Gerenciador de dependências para PHP
Curso de Composer - Gerenciador de dependências para PHP
CONHEÇA O CURSO

Já podemos acessar a documentação dos componentes do Laminas em um novo domínio, bem como do Mezzio e do Laminas MVC. Ainda não está disponível a documentação do Laminas API Tools, mas num futuro próximo já deve estar disponível.

Estou começando um novo projeto, ou quero migrar um projeto existente, o que eu faço?

Então, se você estiver pensando em construir uma nova aplicação com Zend Framework, recomendo já começar utilizando o Laminas MVC ou o Mezzio. Ambos já tem tutoriais na documentação mostrando como criar projetos do zero com essas ferramentas.

Para você que já tem um projeto desenvolvido com Zend Framework, consulte a documentação sobre a migração para o Laminas. Com poucos comandos pode ser possível você migrar toda sua aplicação de forma bastante automatizada e intuitíva.

Pessoalmente estou bastante animado com essa migração, principalmente pelas novas possibilidades que estão sendo adicionadas ao Laminas, como o suporte oficial ao Swoole para desenvolvimento assíncrono no PHP.

Para conhecer mais sobre o Swoole, configura os artigos aqui do blog da TreinaWeb sobre introdução ao Swoole e trabalhando com corrotinas. Ter uma integração oficial com o Swoole no Laminas Mezzio é algo bem promissor! 😀

Middlewares adicionais para o Zend Expressive 2

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
Curso de Zend Expressive - Microframework PHP
CONHEÇA 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:

Zend Expressive - Microframework PHP
Curso de Zend Expressive - Microframework PHP
CONHEÇA O CURSO

Até a próxima!