Magento 2: Como redirecionar o cliente para a página de login


7

Como posso verificar se o cliente está logado ou não? Se o cliente não estiver logado, como redirecioná-lo para a página de login ?

Eu quero fazer isso de .phtmlarquivo. Então, por favor me ajude de acordo com isso.

Respostas:


11

Se você quiser fazê-lo diretamente do .phtmlarquivo, use o seguinte código:

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

Depois do login, você será automaticamente redirecionado para a visualização atual.

Mas usar o Gerenciador de objetos não é uma boa prática. Você deve usar injeção de dependência sempre que possível.


3
Instâncias diretas do Gerenciador de Objetos não são uma prática recomendada: magento.stackexchange.com/a/117101/1956
ryanF

Ainda assim, a equipe principal do Magento o usa em alguns modelos. A questão era como fazê-lo diretamente do arquivo .phtml, e esta é a resposta :)
Bartłomiej Szubert

Szubert ... justo o suficiente ... é bom notar, suponho.
ryanF

Por que ele está indo para infinito loop de redirecionamento
Naveenbos

9

@ Krupali, se você é inflexível quanto à implementação do código em um modelo, o exemplo de @Bartlomiej Szubert é a melhor escolha. Geralmente, é uma boa prática ocultar esses detalhes de implementação do seu modelo e abstrair a lógica para outra coisa (bloco ou auxiliar).

Aqui está um exemplo de uma implementação auxiliar:

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

Em seguida, no seu modelo, você pode usar algo como isto:

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

* namespace mostrado é um exemplo

Dessa forma, seu código pode ser reutilizado em outro lugar ... e se você decidir alterar a lógica de implementação de como verificar se alguém está logado, não precisará alterar seu (s) modelo (s).


Ai sim. Isso é muito útil para mim.
Krupali

1
@ Krupali, estou feliz que isso seja útil. Você sabe, você pode mostrar que algo é útil, através do voto positivo: D
ryanF 10/16/16

helper no modelo, na verdade também está usando OM, mas apenas bem escondida :)
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. condição isLoggedIn()deve ser substituído getCustomerGroupId()porque isLoggedInestá a verificar com base em customerId, mas FPC está esvaziando esse valor para NULL, ao contrário do grupo de clientes
Kate Suykovskaya
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.