Magento 2: Diferentes formas de comprobar si el cliente está logueado

Magento 2

Alejandro Lucena

  Magento, Magento 2

En este post abordaremos las distintas formas que nos brinda Magento 2 para comprobar si un cliente está logueado o no.

1. Mediante la clase \Magento\Customer\Model\Session

El principal problema de usar esta clase es que no funcionará cuando la cache esté habilitada y es por eso que no es recomendable. Si esta implementación la estamos realizando sobre bloques que son susceptibles de estar cacheados no podrá obtener la identificación del cliente que inició sesión ni el valor booleano de 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. Mediante la clase Factory \Magento\Customer\Model\SessionFactory

Con la clase Factory se resolverán los problemas con la cache de Magento.

/**
 * @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. Usando la clase HTTP Context \Magento\Framework\App\Http\Context

Esta clase es útil cuando solo queremos saber si el usuario está logueado o no. Funciona correctamente tanto con cache como sin ella.

/**
 * @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);
}

Elige la forma que más se adapte a tus necesidades. Saludos.