Cursos Magento

O novo jeito de criar controllers no Magento 2

,

Publicado em 02 de novembro de 2020

O Magento está sempre em evolução, e como desenvolvedores devemos sempre estar atentos aos avisos de classes e métodos depreciados. Eles geralmente são removidos na versão seguinte e se nada fizermos, certamente teremos problemas.

Uma destas classes é a Magento\Framework\App\Action\Action. Ela é a classe que a maioria dos Controllers do Magento estendem. Nós falamos dela na Série sobre Controllers aqui no Magenteiro.

No entanto, à partir da versão 2.4 do Magento, ela passou a ser sinalizada como @deprecated (depreciada).

Class \Magento\Framework\App\Action\Action is deprecated

Em outras palavras, é chegada a hora de começar a escrever nossos novos controllers de outra forma.

Este artigo surgiu à partir da contribuição de Gabriel Ribeiro no grupo exclusivo de alunos, em seu feedback sobre a aula sobre Controllers do Magento 2: O Curso. Vem estudar com a gente!

Mudança esperada há muito tempo

Esta mudança foi muito esperada, e contou com a colaboração do Vinai Kopp – instrutor aqui do Magenteiro. Tudo começou ainda em 2018, mas só agora suas contribuições foram trabalhadas e colocadas em prática na nova versão do Magento.

Por padrão, todas as ações de Controllers no Magento implementavam \Magento\Framework\App\ActionInterface. Mas por conta de outros comportamentos do processamento do Magento (disparo de eventos, autorizações, etc) eram implementados dentro de classes como \Magento\Framework\App\Action\Action e \Magento\Backend\App\AbstractAction. Desta forma, se a action de um controller implementava a ActionInterface mas não herdava uma das classes acima, ela não funcionaria mais.

O principal objetivo da mudança foi:

  • fazer com que os desenvolvedores não precisem estender qualquer classe para criar um controller. Implementar \Magento\Framework\App\ActionInterface deveria ser suficiente.
  • depreciar (remover) controllers como \Magento\Backend\App\AbstractAction, \Magento\Framework\App\Action\Action, \Magento\Framework\App\Action\AbstractAction

Resumidamente o que a mudança traz é o fim do uso de herança para criação de um controller. Entre outros benefícios, isso reduz a duplicação de código, classes chumbadas, e outros problemas desse tipo de implementação.

Ok, chega de teoria.

Exemplo de um Controller no Magento 2 (Antes)

<?php

namespace Magenteiro\TestController\Controller\Test;
use Magento\Framework\View\Result\PageFactory;

class Index extends \Magento\Framework\App\Action\Action
{
    /**
     * @var PageFactory
     */
    private PageFactory $resultPageFactory;

    public function __construct(PageFactory $resultPageFactory)
    {
        $this->resultPageFactory = $resultPageFactory;
    }

    public function execute()
    {
        return $this->resultPageFactory->create();
    }
}

Exemplo da nova implementação (Depois)

<?php

namespace Magenteiro\TestController\Controller\Test;
use Magento\Framework\App\Action\HttpGetActionInterface;
use Magento\Framework\View\Result\PageFactory;

class Index implements HttpGetActionInterface
{
    /**
     * @var PageFactory
     */
    private PageFactory $resultPageFactory;

    public function __construct(PageFactory $resultPageFactory)
    {
        $this->resultPageFactory = $resultPageFactory;
    }

    public function execute()
    {
        return $this->resultPageFactory->create();
    }
}

Como você pode ver, ao invés de estender uma classe, agora implementamos uma interface.

Uau! Que bonito! Tem mais benefícios? Tem sim.

Benefícios de Performance

Além dos benefícios já mencionados acima, de acordo com os testes do autor há melhorias de performance e consumo de processamento.

  • Controllers como customer/account/logoutSuccess tiveram redução de 5% no uso de CPU durante sua geração.
image
  • Controllers mais complexos como customer/section/load tiveram redução de mais de 30% no tempo de uso de processamento.
image
  • Controllers comuns como catalog/category/view tiveram melhora de 10% no tempo de uso de processamento.
image

Quer saber mais? Confira os links e fontes usados neste artigo. Todos em Inglês.

Não deixe de conhecer os cursos de Magento do Magenteiro.com.

Últimos posts por Ricardo Martins (exibir todos)
Comentários

Deixe seu comentário

[fbcomments url="https://www.magenteiro.com/blog/magento-2/fim-do-app_action-nos-controllers/"]