Redirect Magento2:从观察者重定向

Redirect Magento2:从观察者重定向,redirect,magento2,observers,Redirect,Magento2,Observers,对于magento 1.x版本,我们已经知道如何从观察者重定向 但是对于magento 2,我们不知道如何从观察者强制执行重定向 我用谷歌搜索过,但没有得到任何答案。是的,我自己做了一项研究,找到了一个解决方案 如果您想这样做,那么在类观察器的函数\uu construct()上,必须注入两个类 首先,\Magento\Framework\App\ResponseFactory谁负责 重定向 另一个类将生成url 为了那个重定向 然后为ResponseFactory创建对象,并使用 setRe

对于magento 1.x版本,我们已经知道如何从观察者重定向

但是对于magento 2,我们不知道如何从观察者强制执行重定向


我用谷歌搜索过,但没有得到任何答案。

是的,我自己做了一项研究,找到了一个解决方案

如果您想这样做,那么在类观察器的
函数
\uu construct()
上,必须注入两个类

  • 首先,
    \Magento\Framework\App\ResponseFactory
    谁负责 重定向
  • 另一个类将生成url 为了那个重定向
  • 然后为
    ResponseFactory
    创建对象,并使用
    setRedirect($YourUrl)->sendResponse()重定向到所需的url
观察者
是的,我自己通过研究找到了一个解决方案

如果您想这样做,那么在类观察器的
函数
\uu construct()
上,必须注入两个类

  • 首先,
    \Magento\Framework\App\ResponseFactory
    谁负责 重定向
  • 另一个类将生成url 为了那个重定向
  • 然后为
    ResponseFactory
    创建对象,并使用
    setRedirect($YourUrl)->sendResponse()重定向到所需的url
观察者
重定向到管理控制器

  namespace sample\test\Observer;
  use \Magento\Framework\Event\Observer;
  use \Magento\Framework\Event\ObserverInterface;


  class SendSecurityCode implements ObserverInterface {


protected $_responseFactory;
protected $_url;


public function __construct(         

    \Magento\Framework\App\ResponseFactory $responseFactory,
    \Magento\Framework\UrlInterface $url

     ) {

          $this->_responseFactory = $responseFactory;
          $this->_url = $url;
     }


public function execute(Observer $observer) {
        $event = $observer->getEvent();
        $RedirectUrl= $this->_url->getUrl('welcome/code/index');
        $this->_responseFactory->create()->setRedirect($RedirectUrl)->sendResponse();

}
}

重定向到管理控制器

  namespace sample\test\Observer;
  use \Magento\Framework\Event\Observer;
  use \Magento\Framework\Event\ObserverInterface;


  class SendSecurityCode implements ObserverInterface {


protected $_responseFactory;
protected $_url;


public function __construct(         

    \Magento\Framework\App\ResponseFactory $responseFactory,
    \Magento\Framework\UrlInterface $url

     ) {

          $this->_responseFactory = $responseFactory;
          $this->_url = $url;
     }


public function execute(Observer $observer) {
        $event = $observer->getEvent();
        $RedirectUrl= $this->_url->getUrl('welcome/code/index');
        $this->_responseFactory->create()->setRedirect($RedirectUrl)->sendResponse();

}
}

在这里,我写了一些代码的购物车页面重定向。 在模块中创建一个events.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd"> 
    <event name="controller_action_predispatch_checkout_cart_index">
        <observer name="my_predispatch_checkout_cart" instance="Namespace\Module\Observer\PredispatchCheckoutCart"/>
    </event>
</config>

在您的观察者文件中yourmodule\observer\PredispatchCheckoutCart.php

<?php
    namespace Namespace\Module\Observer;
    use Magento\Framework\Event\ObserverInterface;

    class PredispatchCheckoutCart implements ObserverInterface{
        protected $_objectManager;

        public function __construct(
            \Magento\Framework\ObjectManagerInterface $objectManager,
            \Magento\Checkout\Helper\Cart $_cartHelper
        ) {
            $this->_objectManager = $objectManager;
            $this->_cartHelper = $_cartHelper;
        }

        public function execute(\Magento\Framework\Event\Observer $observer){
                //redirect to cart
                $redirectUrl = $this->_cartHelper->getCartUrl();
                $observer->getControllerAction()->getResponse()->setRedirect($redirectUrl);

            }
    }

我在这里为购物车页面重定向编写一些代码。
在模块中创建一个events.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd"> 
    <event name="controller_action_predispatch_checkout_cart_index">
        <observer name="my_predispatch_checkout_cart" instance="Namespace\Module\Observer\PredispatchCheckoutCart"/>
    </event>
</config>

在您的观察者文件中yourmodule\observer\PredispatchCheckoutCart.php

<?php
    namespace Namespace\Module\Observer;
    use Magento\Framework\Event\ObserverInterface;

    class PredispatchCheckoutCart implements ObserverInterface{
        protected $_objectManager;

        public function __construct(
            \Magento\Framework\ObjectManagerInterface $objectManager,
            \Magento\Checkout\Helper\Cart $_cartHelper
        ) {
            $this->_objectManager = $objectManager;
            $this->_cartHelper = $_cartHelper;
        }

        public function execute(\Magento\Framework\Event\Observer $observer){
                //redirect to cart
                $redirectUrl = $this->_cartHelper->getCartUrl();
                $observer->getControllerAction()->getResponse()->setRedirect($redirectUrl);

            }
    }

注入
\Magento\Framework\App\ActionFlag$ActionFlag
$this->\u ActionFlag->set(“”、\Magento\Framework\App\Action\Action::FLAG\u NO\u DISPATCH,true)是强制Magento停止处理进一步事件并从观察者处重定向的方式,特别是在使用predispatch事件的情况下

下面是示例代码

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

    /** @var \Magento\Customer\Controller\Account\LoginPost\Interceptor $controller_action */
    $controller_action = $observer->getData( 'controller_action' );
    $parameters = $controller_action->getRequest()->getParams();
    $session = $this->customerSession;

    if({yourcondition}){


        // setting an action flag to stop processing further hierarchy
        $this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);



        /// redirecting back to its referred url
        $observer->getControllerAction()->getResponse()->setRedirect($this->_redirectInterface->getRefererUrl());
        $session->setCustomerFormData($parameters);

    }

    return $this;


}

注入
\Magento\Framework\App\ActionFlag$ActionFlag
$this->\u ActionFlag->set(“”、\Magento\Framework\App\Action\Action::FLAG\u NO\u DISPATCH,true)是强制Magento停止处理进一步事件并从观察者处重定向的方式,特别是在使用predispatch事件的情况下

下面是示例代码

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

    /** @var \Magento\Customer\Controller\Account\LoginPost\Interceptor $controller_action */
    $controller_action = $observer->getData( 'controller_action' );
    $parameters = $controller_action->getRequest()->getParams();
    $session = $this->customerSession;

    if({yourcondition}){


        // setting an action flag to stop processing further hierarchy
        $this->_actionFlag->set('', \Magento\Framework\App\Action\Action::FLAG_NO_DISPATCH, true);



        /// redirecting back to its referred url
        $observer->getControllerAction()->getResponse()->setRedirect($this->_redirectInterface->getRefererUrl());
        $session->setCustomerFormData($parameters);

    }

    return $this;


}

以上代码是否适用于您,我尝试了您的建议。它没有发生。是的,它一直在工作。你能分享你的代码吗。。。我将检查die或退出不符合magneto2规则注意:如果您观察到
控制器\u操作\u postdispatch\u*
事件,则无法使用此方法(使用
ResponseFactory
),非常感谢您,我错过了die(),使用此方法后,我的问题得到了解决…非常感谢。以上代码对您有效吗,我尝试了您的建议。它没有发生。是的,它一直在工作。你能分享你的代码吗。。。i will checkdie or exit不应作为magneto2规则注意:如果您观察到
控制器的动作\u postdispatch.*
事件,则无法使用此方法(使用
ResponseFactory
),非常感谢您,我错过了die(),使用此方法后,我的问题得到了解决…非常感谢。为什么接受此答案?它不起作用。只需从列表页面检查它。错误答案获取此致命错误:在Null上调用成员函数getResponse()注意:如果观察到
控制器\u操作\u后调度*
事件,则无法使用此方法(使用
ResponseFactory
)?它不起作用。只需从列表页面进行检查即可。错误答案获取此致命错误:在Null上调用成员函数getResponse()。注意:如果观察到
控制器\u操作\u后调度*
事件,则无法使用此方法(使用
ResponseFactory