Recordatorio importante: nunca se debe llamar al Administrador de objetos directamente
Así, aquí está cómo hacerlo de manera limpia
En cualquier clase excepto plantillas
Primero debe inyectar la siguiente clase en su constructor /Magento/Customer/Model/Session
:
protected $_session;
public function __construct(
...
\Magento\Customer\Model\Session $session,
...
) {
...
$this->_session = $session;
...
}
Luego, en su clase, puede llamar a lo siguiente:
if ($this->_session->isLoggedIn()) {
// Customer is logged in
} else {
// Customer is not logged in
}
En una plantilla
Requiere un poco más de trabajo en una plantilla, ya que tendrá que configurar una preferencia para el bloque que hace que la plantilla lo haga de manera limpia:
<preference for="Block\That\Renders\The\Template"
type="Vendor\Module\Block\Your\Custom\Block" />
Luego, en su contrusctor de bloque personalizado, debe seguir la misma inyección de dependencia que para cualquier clase (explicada anteriormente).
El paso adicional aquí es crear un método público que pueda usarse en su plantilla para verificar si un cliente ha iniciado sesión o no.
public function isCustomerLoggedIn()
{
return $this->_session->isLoggedIn();
}
Luego, en su plantilla puede llamar:
if ($block->isCustomerLoggedIn()) {
// Customer is logged in
} else {
// Customer is not logged in
}
Alternativa si la sesión del cliente aún no se ha inicializado
Hay otra forma de hacerlo que implica usar en Magento\Framework\App\Http\Context
lugar deMagento/Customer/Model/Session
Luego puede llamar en $this->_context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH)
lugar de $this->_session->isLoggedIn()
verificar si el cliente ha iniciado sesión o no.
Sin embargo, este método puede brindarle resultados diferentes , le sugiero que lea esta excelente respuesta para obtener más información: https://magento.stackexchange.com/a/92133/2380