Ważne przypomnienie: Nigdy nie należy bezpośrednio wywoływać Menedżera obiektów
Oto jak to zrobić w czysty sposób
W dowolnej klasie oprócz szablonów
Najpierw musisz wstrzyknąć następującą klasę do swojego konstruktora /Magento/Customer/Model/Session
:
protected $_session;
public function __construct(
...
\Magento\Customer\Model\Session $session,
...
) {
...
$this->_session = $session;
...
}
Następnie w klasie możesz zadzwonić:
if ($this->_session->isLoggedIn()) {
// Customer is logged in
} else {
// Customer is not logged in
}
W szablonie
Wymaga nieco więcej pracy w szablonie, ponieważ będziesz musiał ustawić preferencje dla bloku, który renderuje szablon, aby zrobić to w czysty sposób:
<preference for="Block\That\Renders\The\Template"
type="Vendor\Module\Block\Your\Custom\Block" />
Następnie w niestandardowym kontrolerze bloków musisz wykonać ten sam wstrzyknięcie zależności, jak dla każdej klasy (wyjaśnione powyżej).
Dodatkowy krok tutaj jest stworzenie metody publiczne, które mogą być użyte w szablonie, by sprawdzić, czy klient jest zalogowany, czy nie
public function isCustomerLoggedIn()
{
return $this->_session->isLoggedIn();
}
Następnie w swoim szablonie możesz zadzwonić:
if ($block->isCustomerLoggedIn()) {
// Customer is logged in
} else {
// Customer is not logged in
}
Alternatywnie, jeśli sesja klienta nie została jeszcze zainicjowana
Jest inny sposób na zrobienie tego, który wymaga użycia Magento\Framework\App\Http\Context
zamiastMagento/Customer/Model/Session
Następnie możesz zadzwonić $this->_context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH)
zamiast $this->_session->isLoggedIn()
sprawdzić, czy klient jest zalogowany, czy nie.
Jednak ta metoda może dać różne wyniki , sugeruję przeczytanie tej wspaniałej odpowiedzi, aby uzyskać więcej informacji: https://magento.stackexchange.com/a/92133/2380