An Interest In:
Web News this Week
- March 21, 2024
- March 20, 2024
- March 19, 2024
- March 18, 2024
- March 17, 2024
- March 16, 2024
- March 15, 2024
Tipos de Controllers no Magento 2
Contextualizando
O que um controlador?
Um controlador faz parte da camada de controle do padro de arquitetura de software MVC (Model-Controller-View).
Um controlador responsvel por intermediar as requisies enviadas pela camada de visualizao (View) com as respostas fornecidas pela camada de modelo (Model), processando os dados que o usurio informou e repassando para outras camadas.
Cdigo
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 mtodo execute()
.
Caso esteja utilizando uma verso anterior a 2.4.0 do magento, a interface
\Magento\Framework\App\ActionInterface
no estar disponvel, ento dever estender a classe\Magento\Framework\App\Action\Action
e ajustar o construtor com suas heranas.
Json
As classes Controllers (controladores) podem retornar objetos Json com o tipo mime na resposta.
<?phpnamespace {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{ protected JsonFactory $jsonResultFactory; public function __construct( JsonFactory $jsonResultFactory ) { $this->jsonResultFactory = $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 contedos binrios.
<?phpnamespace {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{ protected RawFactory $rawResultFactory; public function __construct( RawFactory $rawResultFactory ) { $this->rawResultFactory = $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 pgna como retorno.
<?phpnamespace {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{ protected RedirectFactory $redirectResultFactory; public function __construct( RedirectFactory $redirectResultFactory ) { $this->redirectResultFactory = $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 usurio faa uma segunda solicitao.
<?phpnamespace {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{ protected ForwardFactory $forwardResultFactory; public function __construct( ForwardFactory $forwardResultFactory ) { $this->forwardResultFactory = $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 conveno que no mtodo setModule()
seja definido o nome do diretrio do mdulo, o setController()
deve ser o nome do diretrio dentro do diretrio Controller do mdulo e o forward()
o nome da classe que ir ser renderizada atravs do controller forward.
possvel passar parmetros atravs de um array. Caso o nome do mdulo no seja seja fornecido, o Magento ir assumir que ser o mdulo 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 pgina.
<?phpnamespace {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{ protected PageFactory $resultPageFactory; public function __construct( PageFactory $resultPageFactory ) { $this->resultPageFactory = $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. Alm disso o Layout tambm podem renderizar o HTML de blocos especficos.
<?phpnamespace {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{ protected LayoutFactory $resultLayoutFactory; public function __construct( LayoutFactory $resultLayoutFactory ) { $this->resultLayoutFactory = $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 mtodo execute()
.
<?phpnamespace {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{ protected PageFactory $resultPageFactory; public function __construct( Context $context, PageFactory $resultPageFactory ) { parent::__construct($context); $this->resultPageFactory = $resultPageFactory; } 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 implementao do cdigo.
Habilitando as alteraes
Execute o comando PHP para gerar a configurao das injees de dependncia e todas as classes ausentes que precisam ser geradas (proxys, interceptors, etc).
php bin/magento setup:di:compile
Diretrios e Arquivos
Segue a a lista de diretrios e arquivos que devem ser criados.
- app/ - code/ - {Vendor}/ - {Module}/ - Controller/ - {ControllerDirectory}/ - {ControllerName}.php - etc/ - module.xml - registration.php - composer.json
Original Link: https://dev.to/santanaluc94/tipos-de-controllers-no-magento-2-2j68
Dev To
An online community for sharing and discovering great ideas, having debates, and making friendsMore About this Source Visit Dev To