Your Web News in One Place

Help Webnuz

Referal links:

Sign up for GreenGeeks web hosting
November 16, 2021 12:39 pm GMT

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

Share this article:    Share on Facebook
View Full Article

Dev To

An online community for sharing and discovering great ideas, having debates, and making friends

More About this Source Visit Dev To