Pages

30 March, 2022

How to check if customer is logged in or not

 This article indicates one of a kind ways to test if a consumer is logged in or no longer in Magento 2.

1) Using \Magento\Customer\Model\Session class

  • The main issue with this way is that it will not work when page cache is enabled.
  • When page cache is enabled and you use this code, it will not be able to get the logged-in customer ID or get the boolean value of isLoggedIn.
/**
 * @var Magento\Customer\Model\Session
 */
protected $customerSession;

/**
 * ...
 * @param \Magento\Customer\Model\Session $customerSession
 */
public function __construct(
    ...
    \Magento\Customer\Model\Session $customerSession
) {
    ...
    $this->customerSession = $customerSession;
}

/**
 * @return int
 */
public function getCustomerId()
{
    return $this->customerSession->getCustomer()->getId();
}

/**
 * @return bool
 */
public function isCustomerLoggedIn()
{
    return $this->customerSession->isLoggedIn();
}

2) Using Factory Class Magento\Customer\Model\SessionFactory

  • Using Factory class will solve the issue with page cache.
  • We will be able to run this code even if the page cache is enabled.
/**
 * @var Magento\Customer\Model\SessionFactory
 */
protected $customerSessionFactory;

/**
 * ...
 * @param \Magento\Customer\Model\SessionFactory $customerSession
 */
public function __construct(
    ...
    \Magento\Customer\Model\SessionFactory $customerSessionFactory
) {
    ...
    $this->customerSessionFactory = $customerSessionFactory;
}

/**
 * @return int
 */
public function getCustomerId()
{
    $customerSession = $this->customerSessionFactory->create();
    return $customerSession->getCustomer()->getId();
}

/**
 * @return bool
 */
public function isCustomerLoggedIn()
{
    $customerSession = $this->customerSessionFactory->create();
    return $customerSession->isLoggedIn();
}

3) Using HTTP Context class Magento\Framework\App\Http\Context

  • This is useful if we just need to check if the user is logged in or not.
  • Using HTTP Context will work on both cacheable and non-cacheable pages.
  • We also don’t have to work directly with the customer session.
/**
 * @var Magento\Framework\App\Http\Context
 */
protected $httpContext;

/**
 * ...
 * @param \Magento\Framework\App\Http\Context $httpContext
 */
public function __construct(
    ...
    \Magento\Framework\App\Http\Context $httpContext
) {
    ...
    $this->httpContext = $httpContext;
}

/**
 * @return bool
 */
public function isCustomerLoggedIn()
{
    return (bool)$this->httpContext->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
}

No comments:

Post a Comment

Thanks