Magento 2:ログインページにお客様をリダイレクトする方法


7

顧客がログインしているかどうかを確認するにはどうすればよいですか?ログインしていない場合、ログインページにリダイレクトするにはどうすればよいですか?

.phtmlファイルからこれを実行したい。ですから、それに従って私を助けてください。

回答:


11

.phtmlファイルから直接実行する場合は、次のコードを使用します。

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();

$customerSession = $objectManager->get('\Magento\Customer\Model\Session');
$urlInterface = $objectManager->get('\Magento\Framework\UrlInterface');

if(!$customerSession->isLoggedIn()) {
    $customerSession->setAfterAuthUrl($urlInterface->getCurrentUrl());
    $customerSession->authenticate();
}

その後、ログイン後、自動的に現在のビューにリダイレクトされます。

ただし、Object Managerを使用することはお勧めできません。可能な限り、依存性注入を使用する必要があります。


3
Object Managerの直接インスタンスはベストプラクティスではありません:magento.stackexchange.com/a/117101/1956
ryanF

それでも、Magentoコアチームはいくつかのモデルでそれを使用しています。:)質問は.phtmlファイルから直接それを行う方法で、これが答えです
パルトロミエSzubert

Szubert ...十分に公正...丁度いいと思います。
ryanF 2016年

無限のリダイレクトループになる理由
Naveenbos

9

@Krupali、コードがテンプレートに実装されていることを確信している場合は、@ Bartlomiej Szubertの例の方が適しています。一般に、これらの実装の詳細をテンプレートから隠し、ロジックを他の何か(ブロックまたはヘルパー)に抽象化することがベストプラクティスです。

これはヘルパー実装の例です:

<?php

namespace Ryan\CustomerRedirect\Helper;

use Magento\Customer\Model\Session;
use Magento\Framework\App\Helper\AbstractHelper;
use Magento\Framework\App\Helper\Context;
use Magento\Framework\UrlInterface;

class Customer extends AbstractHelper
{
    /**
     * @var Session
     */
    private $customerSession;
    /**
     * @var UrlInterface
     */
    private $urlInterface;

    public function __construct(
        Context $context,
        Session $customerSession,
    )
    {
        parent::__construct($context);
        $this->customerSession = $customerSession;
        $this->urlInterface = $context->getUrlBuilder();
    }

    public function redirectIfNotLoggedIn()
    {
        if (!$this->customerSession->isLoggedIn()) {
            $this->customerSession->setAfterAuthUrl($this->urlInterface->getCurrentUrl());
            $this->customerSession->authenticate();
        }
    }
}

次に、テンプレートで次のようなものを使用できます。

$this->helper('Ryan\CustomerRedirect\Helper\Customer')->redirectIfNotLoggedIn()

*示されている名前空間は例です

このようにして、コードを他の場所で再利用できます。また、誰かがログインしているかどうかを確認する方法の実装ロジックを変更する場合は、テンプレートを変更する必要はありません。


そうそう。これは私にとって非常に便利です。
Krupali

1
@Krupali、これが役に立てて嬉しいです。あなたはそれを賛成することで何かが役に立つことを示すことができます:D
ryanF

テンプレートのヘルパーも実際にはOMを使用していますが、うまく隠されています:)
Bartosz Kubicki

-1
Find the below working code from core file to redirect other page in controller.

<?php

namespace Vendorname\Yourmodulename\Controller\Contact;

use Magento\Customer\Model\Session;
use Magento\Framework\App\Action\Context;
use Magento\Customer\Model\Customer;

class Index extends \Magento\Framework\App\Action\Action
{
    protected $customerSession;

    protected $customers;

    public function __construct(
        Context $context,
        Session $customerSession,
        Customer $customers
    )
    {
        parent::__construct($context);
        $this->customerSession = $customerSession;
        $this->customers = $customers;       
    }

    public function execute()
    {   
        if ($this->customerSession->isLoggedIn()) {

            //Get customer by customerID.
            $customerId = $this->customerSession->getCustomerData()->getId();
            $customer = $this->customers->load($customerId);
            if($customer->getUserRole() != '' && $customer->getUserRole() == 'admin')
            { 
                $this->_view->loadLayout();
                $this->_view->getLayout()->initMessages();
                $this->_view->renderLayout();            
            }
        }
        else{

            $resultRedirect = $this->resultRedirectFactory->create();
            $resultRedirect->setPath('customer/account/login/');
            return $resultRedirect;        
        } 
    }
}   

1.条件isLoggedIn()はcustomerIdに基づいてチェックしているgetCustomerGroupId()ため、で置き換える必要がありisLoggedInますが、顧客グループとは異なり、FPCはこの値をNULLにフラッシュしています
Kate Suykovskaya
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.