Lembrete importante: nunca se deve chamar o gerenciador de objetos diretamente
Então, aqui está como fazê-lo da maneira limpa
Em qualquer classe, exceto modelos
Você primeiro precisa injetar a seguinte classe em seu construtor /Magento/Customer/Model/Session
:
protected $_session;
public function __construct(
...
\Magento\Customer\Model\Session $session,
...
) {
...
$this->_session = $session;
...
}
Em sua classe, você pode ligar para o seguinte:
if ($this->_session->isLoggedIn()) {
// Customer is logged in
} else {
// Customer is not logged in
}
Em um modelo
Isso requer um pouco mais de trabalho em um modelo, pois você terá que configurar uma preferência para o bloco que renderiza o modelo para fazer isso da maneira limpa:
<preference for="Block\That\Renders\The\Template"
type="Vendor\Module\Block\Your\Custom\Block" />
Em seguida, no seu controlador de bloco personalizado, você precisa seguir a mesma injeção de dependência de qualquer classe (explicada acima).
A etapa extra aqui é criar um método público que possa ser usado em seu modelo para verificar se um cliente está logado ou não
public function isCustomerLoggedIn()
{
return $this->_session->isLoggedIn();
}
Em seu modelo, você pode ligar para:
if ($block->isCustomerLoggedIn()) {
// Customer is logged in
} else {
// Customer is not logged in
}
Alternativa se a sessão do cliente ainda não foi inicializada
Há outra maneira de fazer isso, que implica usar em Magento\Framework\App\Http\Context
vez deMagento/Customer/Model/Session
Em seguida, você pode ligar em $this->_context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH)
vez de $this->_session->isLoggedIn()
verificar se o cliente está logado ou não.
No entanto, esse método pode fornecer resultados diferentes . Sugiro que você leia esta ótima resposta para obter mais informações: https://magento.stackexchange.com/a/92133/2380