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


Я пишу наблюдателю, чтобы наблюдать за событием customer_register_success, и запускаю следующие коды для перенаправления, но не удалось. Кто-нибудь может помочь?

$url = $this->url->getUrl('/');
$observer->getControllerAction()->getResponse()->setRedirect($url);
$this->logger->debug("Redirect to: {$url}");
Author: Paul, 2016-08-17

1 answers

Я думаю, проблема в том, что ваше перенаправление происходит до перенаправления по умолчанию и, следовательно, не имеет эффекта. Вот модуль, который выполняет эту работу:

Структура каталогов модулей:

|   registration.php
|   
+---etc
|   |   di.xml
|   |   module.xml
|   |   
|   \---frontend
|           events.xml
|           
+---Observer
|       Register.php
|       
\---Plugin
        Redirect.php

Di.xml :

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">

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

</config>

Events.xml:

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
    <event name="customer_register_success">
        <observer name="custom_redirect_register_success" instance="Your\Module\Observer\Register" disabled="false"/>
    </event>
</config>

Register.php:

<?php

namespace Your\Module\Observer;


use Magento\Framework\Event\ObserverInterface;
use Magento\Framework\Registry;

class Register implements ObserverInterface
{
    protected $coreRegistry;

    public function __construct(Registry $registry)
    {
        $this->coreRegistry = $registry;
    }

    public function execute(\Magento\Framework\Event\Observer $observer)
    {
        $this->coreRegistry->register('is_new_account', true);
    }
}

Redirect.php:

<?php

namespace Your\Module\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)
    {
        if ($this->coreRegistry->registry('is_new_account')) {
            /** @var \Magento\Framework\Controller\Result\Redirect $result */
            $result = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
            $result->setUrl($this->url->getUrl('custom/path'));
            return $result;
        }

        return $proceed();
    }
}

Это работает, устанавливая флаг в основном реестре, когда происходит событие customer_register_success, а затем проверяет это помечает и возвращает альтернативный путь перенаправления, когда вместо страницы "Моя учетная запись" по умолчанию запрашивается перенаправление для успешной аутентификации клиента. Надеюсь, это поможет.

 19
Author: Aaron Allen, 2016-08-18 09:45:08