Magento 2 - перенаправить пользователя на определенную страницу, если не вошел в систему

9

Мне нужно перенаправить пользователя на целевую страницу, если он не вошел в систему. По этой ссылке я нахожу аналогичную работу . Есть ли решение для Magento 2?

Павел
источник

Ответы:

21

Если мы хотим поймать controller_action_predispatch, мы можем следовать:

Приложение / код / ​​Vendor / модуль / и т.д. / events.xml


     <event name="controller_action_predispatch">
            <observer name="check_login_persistent" instance="Vendor\Module\Observer\CheckLoginPersistentObserver" />
     </event>

Приложение / код / ​​Vendor / модуль / наблюдатель / CheckLoginPersistentObserver.php

namespace Vendor\Module\Observer;
use Magento\Framework\Event\ObserverInterface;


class CheckLoginPersistentObserver implements ObserverInterface
{
         /**
         * @var \Magento\Framework\App\Response\RedirectInterface
         */
        protected $redirect;

        /**
         * Customer session
         *
         * @var \Magento\Customer\Model\Session
         */
        protected $_customerSession;

        public function __construct(
            \Magento\Customer\Model\Session $customerSession,
            \Magento\Framework\App\Response\RedirectInterface $redirect

        ) {

            $this->_customerSession = $customerSession;
            $this->redirect = $redirect;

        }

        public function execute(\Magento\Framework\Event\Observer $observer)
        {
            $actionName = $observer->getEvent()->getRequest()->getFullActionName();
            $controller = $observer->getControllerAction();

            $openActions = array(
                'create',
                'createpost',
                'login',
                'loginpost',
                'logoutsuccess',
                'forgotpassword',
                'forgotpasswordpost',
                'resetpassword',
                'resetpasswordpost',
                'confirm',
                'confirmation'
            );
            if ($controller == 'account' && in_array($actionName, $openActions)) {
                return $this; //if in allowed actions do nothing.
            }
            if(!$this->_customerSession->isLoggedIn()) {
                $this->redirect->redirect($controller->getResponse(), 'customer/account/login');
            }

        }

}
Хоа ТруонгДинь
источник
2
if ($controller == 'account' && in_array($action, $openActions)) { return $this; //if in allowed actions do nothing. }этот код никогда не выполнялся, это не переменная с именем действия в коде. также в __construct (вы поставили «,» в конце, что приводит к ошибке.
Ашиш Маданкар M2 Professiona
1
Как вы ссылаетесь на ваш конкретный контроллер для этого? Я скопировал код, но не совсем понимаю, как его запустить, когда ударил мой контроллер.
Харри
4

Существует гораздо более простое решение. Посмотрите на этот файл:

SRC / поставщик / Magento / модуль-продажи / и т.д. / di.xml

<type name="Magento\Sales\Controller\Order\History">
    <plugin name="authentication" type="Magento\Sales\Controller\Order\Plugin\Authentication"/>
</type>

Так что вам просто нужно использовать плагин аутентификации в вашем модуле di.xml

Бьерн
источник
4

Для большей оптимизации и работы кода вы можете выполнить следующие шаги.

  1. создать файл событий @ app \ code \ Vendor \ Module \ etc \ frontend \ events.xml

    <?xml version='1.0'?>
    <config xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xsi:noNamespaceSchemaLocation='../../../../../lib/internal/Magento/Framework/Event/etc/events.xsd'>
        <event name='controller_action_predispatch'>
            <observer
                    name='checklogin'
                    instance='Vendor\Module\Model\Observer'
            />
        </event>
    </config>
    
    
  2. Создайте файл приложения Observer \ code \ Vendor \ Module \ Model \ Observer.php

    namespace Vendor\Module\Model;
    
    class Observer implements \Magento\Framework\Event\ObserverInterface
    {
    
    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);
            }
        }
    }
    
Хари
источник