This article shows different ways to check if a customer is logged in or not 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);
}
Hope this helps. Thanks.