Magento 2.0 如何在观察者中重定向

Magento 2.0 How to redirect in observer

我已声明 controller_action_postdispatch 事件的观察员。 在执行方法中,我检查客户是否登录。如果没有,他应该被重定向到登录页面。

public function execute(\Magento\Framework\Event\Observer $observer)
{
  # check if user is logged in
  $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
  $customerSession = $this->objectManager->get('Magento\Customer\Model\Session');

  if(!$customerSession->isLoggedIn())
  {
    $request = $this->objectManager->get('Magento\Framework\App\Request\Http');

    if(strpos($request->getPathInfo(), '/customer/account/') !== 0)
    {
       # redirect to /customer/account/login
    }
  }
}

如何将客户端重定向到另一个 URL?

这是可以做到的:

public function execute(\Magento\Framework\Event\Observer $observer)
{
  # check if user is logged in
  $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
  $customerSession = $objectManager->get('Magento\Customer\Model\Session');

  if(!$customerSession->isLoggedIn())
  {
    $request = $objectManager->get('Magento\Framework\App\Request\Http');
    //get instance for URL interface
    /** @var \Magento\Framework\UrlInterface $urlInterface */
    $urlInterface = $objectManager->get('Magento\Framework\UrlInterface');
    // URL to redirect to
    $url = $urlInterface->getUrl('customer/account/login');

    if(strpos($request->getPathInfo(), '/customer/account/') !== 0)
    {
        # redirect to /customer/account/login
        $observer->getControllerAction()
         ->getResponse()
         ->setRedirect($url);
    }
  }
}

就是这样。现在它将重定向到客户登录页面。我用事件 controller_action_predispatch

测试了这个

我已经尝试使用此代码从 phtml 页面重定向到其他页面

 # check if user is logged in
      $objectManager = \Magento\Framework\App\ObjectManager::getInstance();
      $customerSession = $objectManager->get('Magento\Customer\Model\Session');

      if(!$customerSession->isLoggedIn())
      {
        $request = $objectManager->get('Magento\Framework\App\Request\Http');
        //get instance for URL interface
        /** @var \Magento\Framework\UrlInterface $urlInterface */
        $urlInterface = $objectManager->get('Magento\Framework\UrlInterface');
        // URL to redirect to
        $url = $urlInterface->getUrl('customer/account/login');

        if(strpos($request->getPathInfo(), '/customer/account/') !== 0)
        {
            # redirect to /customer/account/login

             header('Location:'.$url );die();

        }
      }