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; } }
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; } }
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; } }
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; } }
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(); } }
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(); } }
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(); } }
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
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
Top comments (0)