DEV Community

Lucas Teixeira dos Santos Santana
Lucas Teixeira dos Santos Santana

Posted on • Edited on

Tipos de Controllers no Magento 2

Contextualizando

O que é um controlador?

Um controlador faz parte da camada de controle do padrão de arquitetura de software MVC (Model-Controller-View).

Um controlador é responsável por intermediar as requisições enviadas pela camada de visualização (View) com as respostas fornecidas pela camada de modelo (Model), processando os dados que o usuário informou e repassando para outras camadas.


Código

Controllers da loja devem seguir a estrutura de pastas \{Vendor}\{Module}\Controller\{ControllerDirectory}\{ControllerName} e implementar a interface \Magento\Framework\App\ActionInterface, que obriga a classe a implementar o método execute().

Caso esteja utilizando uma versão anterior a 2.4.0 do magento, a interface \Magento\Framework\App\ActionInterface não é estará disponível, então deverá estender a classe \Magento\Framework\App\Action\Action e ajustar o construtor com suas heranças.

Json

As classes Controllers (controladores) podem retornar objetos Json com o tipo mime na resposta.

<?php namespace {Vendor}\{Module}\Controller\{ControllerDirectory}; use Magento\Framework\Controller\Result\JsonFactory; use Magento\Framework\App\ActionInterface; use Magento\Framework\Controller\Result\Json; class {ControllerName} implements ActionInterface { public function __construct( protected JsonFactory $jsonResultFactory ) { } public function execute(): Json { $data = [ '{param}' => '{value}', 'message' => __('{Message to return}'), 'error' => false ]; $jsonResult = $this->jsonResultFactory->create(); $jsonResult->setData($data); return $jsonResult; } } 
Enter fullscreen mode Exit fullscreen mode

Raw

As classes Controllers (controladores) podem ter retorno do tipo string ou conteúdos binários.

<?php namespace {Vendor}\{Module}\Controller\{ControllerDirectory}; use Magento\Framework\Controller\Result\RawFactory; use Magento\Framework\App\ActionInterface; use Magento\Framework\Controller\Result\Raw; class {ControllerName} implements ActionInterface { public function __construct( protected RawFactory $rawResultFactory ) { } public function execute(): Raw { $rawResult = $this->rawResultFactory->create(); $rawResult->setContents('{Custom message}'); return $rawResult; } } 
Enter fullscreen mode Exit fullscreen mode

Redirect

As classes Controllers (controladores) podem ter uma string com a rota de redirecionamento para outra págna como retorno.

<?php namespace {Vendor}\{Module}\Controller\{ControllerDirectory}; use Magento\Framework\Controller\Result\RedirectFactory; use Magento\Framework\App\ActionInterface; use Magento\Framework\Controller\Result\Redirect; class {ControllerName} implements ActionInterface { public function __construct( protected RedirectFactory $redirectResultFactory ) { } public function execute(): Redirect { $redirectResult = $this->redirectResultFactory->create(); $redirectResult->setPath('{router_name}/{controller_directory}/{className}') ->setHttpResponseCode(301); return $redirectResult; } } 
Enter fullscreen mode Exit fullscreen mode

Forward

As classes Controllers (controladores) podem ter retorno com um encaminhamento interno para outro controlador sem que o usuário faça uma segunda solicitação.

<?php namespace {Vendor}\{Module}\Controller\{ControllerDirectory}; use Magento\Framework\Controller\Result\ForwardFactory; use Magento\Framework\App\ActionInterface; use Magento\Framework\Controller\Result\Forward; class {ControllerName} implements ActionInterface { public function __construct( protected ForwardFactory $forwardResultFactory ) { } public function execute(): Forward { $forwardResult = $this->forwardResultFactory->create(); $forwardResult->setModule('{module_name}') ->setController('{controller_directory}') ->forward('{controller_name}') ->setParams(['{param}' => '{value}']); return $forwardResult; } } 
Enter fullscreen mode Exit fullscreen mode

A convenção é que no método setModule() seja definido o nome do diretório do módulo, o setController() deve ser o nome do diretório dentro do diretório Controller do módulo e o forward() é o nome da classe que irá ser renderizada através do controller forward.
É possível passar parâmetros através de um array. Caso o nome do módulo não seja seja fornecido, o Magento irá assumir que será o módulo presente no controller do forward.

Page

As classes Controllers (controladores) podem ter retorno em forma de HTML com um arquivo layout vinculado ao controlador que renderizará a página.

<?php namespace {Vendor}\{Module}\Controller\{ControllerDirectory}; use Magento\Framework\View\Result\PageFactory; use Magento\Framework\App\ActionInterface; use Magento\Framework\View\Result\Page; class {ControllerName} implements ActionInterface { public function __construct( protected PageFactory $resultPageFactory ) { } public function execute(): Page { return $this->resultPageFactory->create(); } } 
Enter fullscreen mode Exit fullscreen mode

Layout

As classes Controllers (controladores) podem ter retorno em forma de HTML e pode ser usado como o Page. Além disso o Layout também podem renderizar o HTML de blocos específicos.

<?php namespace {Vendor}\{Module}\Controller\{ControllerDirectory}; use Magento\Framework\View\Result\LayoutFactory; use Magento\Framework\App\ActionInterface; use Magento\Framework\View\Result\Layout; class {ControllerName} implements ActionInterface { public function __construct( protected LayoutFactory $resultLayoutFactory ) { } public function execute(): Layout { return $this->resultLayoutFactory->create() ->getLayout() ->getBlock('{block.name}') ->toHtml(); } } 
Enter fullscreen mode Exit fullscreen mode

Admin

Controllers do admin devem seguir a estrutura de pastas \{Vendor}\{Module}\Controller\Adminhtml\{ControllerDirectory}\{ControllerName} e estender a classe abstrata \Magento\Backend\App\AbstractAction, que obriga a classe a implementar o método execute().

<?php namespace {Vendor}\{Module}\Controller\Adminhtml\{ControllerDirectory}; use Magento\Framework\View\Result\PageFactory; use Magento\Backend\App\AbstractAction; use Magento\Backend\App\Action\Context; use Magento\Framework\View\Result\Page; class {ControllerName} extends AbstractAction { public function __construct( Context $context, protected PageFactory $resultPageFactory ) { parent::__construct($context); } public function execute(): Page { return $this->resultPageFactory->create(); } } 
Enter fullscreen mode Exit fullscreen mode

O exemplo mostra como declarar um controller do tipo Page na área administrativa no Magento, mas pode ser utilizado qualquer um dos tipos de controllers.


Finalizando

Valores entre chaves ({test}) devem ser alterados na implementação do código.

Habilitando as alterações

Execute o comando PHP para gerar a configuração das injeções de dependência e todas as classes ausentes que precisam ser geradas (proxys, interceptors, etc).

php bin/magento setup:di:compile 
Enter fullscreen mode Exit fullscreen mode

Diretórios e Arquivos

Segue a a lista de diretórios e arquivos que devem ser criados.

- app/ - code/ - {Vendor}/ - {Module}/ - Controller/ - {ControllerDirectory}/ - {ControllerName}.php - etc/ - module.xml - registration.php - composer.json 
Enter fullscreen mode Exit fullscreen mode

Top comments (0)