Anteriormente, falamos sobre Response Type Redirect e como utilizá-lo para fazer um redirecionamento de uma Rota A para uma Rota B. Neste artigo, vamos falar sobre Magento 2 Controller Forward.
Magento 2 Controller Forward
O response type Forward é utilizado para fazer um redirecionamento interno. Enquanto que no response type Redirect vimos como fazer um redirecionamento de uma Rota A para uma Rota B, havendo a mudança de URL, no response type Forward temos o redirecionamento da Rota A para uma Rota B sem ocorrer a mudança de URL. Ou seja, a rota A redireciona para a Rota B, exibindo o conteúdo da Rota B, mas permanece a URL da Rota A, isso é o redirecionamento interno.
Então, voltando a nosso Controller, temos as seguintes modificações:
<?php namespace ForMage\Learning\Controller\Page; use Magento\Framework\App\Action\Context; use Magento\Framework\View\Result\PageFactory; use Magento\Framework\Controller\Result\JsonFactory; use Magento\Framework\Controller\Result\Raw; use Magento\Framework\Controller\Result\RedirectFactory; use Magento\Framework\Controller\Result\ForwardFactory; class ResponseType extends \Magento\Framework\App\Action\Action { protected $pageFactory; protected $jsonFactory; protected $raw; protected $redirectFactory; protected $forwardFactory; public function __construct( Context $context, PageFactory $page, JsonFactory $jsonFactory, Raw $raw, RedirectFactory $redirectFactory, ForwardFactory $forwardFactory ) { parent::__construct($context); $this->pageFactory = $page; $this->jsonFactory = $jsonFactory; $this->raw = $raw; $this->redirectFactory = $redirectFactory; $this->forwardFactory = $forwardFactory; } public function execute() { // return $this->pageFactory->create(); // return $this->jsonFactory->create()->setData(['name' => 'Abraão', 'city' => 'Rio de Janeiro', 'customer' => [ // 'name' => 'customer name', // 'email' => 'customer email' // ]]); // return $this->raw->setContents('That is my raw content'); // $result = $this->redirectFactory->create(); // return $result->setPath('learning/page/newroute'); $forwardFactory = $this->forwardFactory->create(); return $forwardFactory->setModule('learning')->setController('page')->forward('newroute'); } }
Fizemos um use Magento\Framework\Controller\Result\ForwardFactory;
e modificamos o nosso construtor:
public function __construct( Context $context, PageFactory $page, JsonFactory $jsonFactory, Raw $raw, RedirectFactory $redirectFactory, ForwardFactory $forwardFactory ) { parent::__construct($context); $this->pageFactory = $page; $this->jsonFactory = $jsonFactory; $this->raw = $raw; $this->redirectFactory = $redirectFactory; $this->forwardFactory = $forwardFactory; }
E modificamos o nosso execute()
:
public function execute() { // return $this->pageFactory->create(); // return $this->jsonFactory->create()->setData(['name' => 'Abraão', 'city' => 'Rio de Janeiro', 'customer' => [ // 'name' => 'customer name', // 'email' => 'customer email' // ]]); // return $this->raw->setContents('That is my raw content'); // $result = $this->redirectFactory->create(); // return $result->setPath('learning/page/newroute'); $forwardFactory = $this->forwardFactory->create(); return $forwardFactory->setModule('learning')->setController('page')->forward('newroute'); }
Criamos a nossa fábrica para o forward $forwardFactory = $this->forwardFactory->create();
.
return $forwardFactory->setModule('learning')->setController('page')->forward('newroute');
Em $forwardFactory->setModule('learning')
setamos o nosso módulo. Em ->setController('page')
setamos o nosso Controller e em ->forward('newroute');
setamos o controller para o qual ocorrerá o redirecionamento interno.
Ao acessar a nossa rota learning/page/responsetype ocorre o redirecionamento interno para a rota learning/page/newroute sem ocorrer a mudança de URL.
Para se aprofundar nos seus estudos sobre Controller no Magento 2
Dúvidas? Posta aí!
Um abraço!