Respostas:
Se você quiser fazê-lo diretamente do .phtml
arquivo, 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.
@ 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).
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;
}
}
}
isLoggedIn()
deve ser substituído getCustomerGroupId()
porque isLoggedIn
está a verificar com base em customerId, mas FPC está esvaziando esse valor para NULL, ao contrário do grupo de clientes