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();
        }
      }