Magento – Magento 2: Redirect from Observer Not Working on Category Page

ajaxcustomevent-observermagento2redirect

I have below code, which in not working from Category Listing Page.

Example: http://magento2-demo.nexcess.net/gear/bags.html

namespace Custom\Module\Observer;

use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Event\Observer;

class TestObserver implements ObserverInterface {
    protected $_responseFactory;
    protected $_url;
    protected $_objectManager;

    public function __construct(\Magento\Framework\App\ResponseFactory $responseFactory,\Magento\Framework\UrlInterface $url, \Magento\Framework\ObjectManagerInterface $objectManager)
    {
        $this->_responseFactory = $responseFactory;
        $this->_url = $url;
        $this->_objectManager = $objectManager;
    }

    public function execute(\Magento\Framework\Event\Observer $observer)
    {

        $controller = $observer->getControllerAction();
        $response = $observer->getResponse();
        $controllerAction = $observer->getEvent()->getControllerAction();
        $cartUrl = $this->_url->getUrl('checkout/index/index');     
        $observer->getResponse()->setRedirect($cartUrl);
        exit;

        $response = $observer->getEvent()->getData('response');
        $response->setRedirect($cartUrl)->sendResponse();
        exit;
        $observer->getEvent()->getFront()->getResponse()->setRedirect($cartUrl);
        //$observer->getResponse()->setRedirect($cartUrl);
        exit;

        $response = $observer->getEvent()->getResponse();
        $response->setRedirect($cartUrl);
        exit;
    }
}

It gives below error

Fatal error: Call to a member function setRedirect() on null in

In Plugin it works fine Magento 2: How to redirect to checkout page after product added to cart via Observer/Plugin from category page?

How to use same thing in Observer?

Best Answer

di.xml

<type name="Magento\Customer\Model\Account\Redirect">
    <plugin name="NewAcctRedirectPlug" type="<vendor_name>\<module_name>\Plugin\Redirect" disabled="false" sortOrder="1"/>
</type>

Redirect.php

<?php

namespace <vendor_name>\<module_name>\Plugin;

use Magento\Framework\Controller\ResultFactory;
use Magento\Framework\Registry;
use Magento\Framework\UrlInterface;

class Redirect
{
     protected $coreRegistry;

     protected $url;

     protected $resultFactory;

     public function __construct(Registry $registry, UrlInterface $url, ResultFactory $resultFactory)
     {
         $this->coreRegistry = $registry;
         $this->url = $url;
         $this->resultFactory = $resultFactory;
     }

     public function aroundGetRedirect ($subject, \Closure $proceed)
     {
        /** @var \Magento\Framework\Controller\Result\Redirect $result */
         $result = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);            
         $result->setUrl($this->url->getUrl('checkout/index/index'));

         return $result;
     }
 }
Related Topic