Важливе нагадування. Ніколи не слід безпосередньо телефонувати до Диспетчера об'єктів
Отже, ось як це зробити чистим способом
У будь-якому класі, крім шаблонів
Спочатку потрібно ввести наступний клас у свій конструктор /Magento/Customer/Model/Session
:
protected $_session;
public function __construct(
...
\Magento\Customer\Model\Session $session,
...
) {
...
$this->_session = $session;
...
}
Тоді у своєму класі ви можете зателефонувати наступним чином:
if ($this->_session->isLoggedIn()) {
// Customer is logged in
} else {
// Customer is not logged in
}
У шаблоні
Це вимагає трохи більше роботи над шаблоном, оскільки вам доведеться налаштувати перевагу для блоку, який робить шаблон, щоб зробити це чистим способом:
<preference for="Block\That\Renders\The\Template"
type="Vendor\Module\Block\Your\Custom\Block" />
Тоді у вашому користувальницькому блоковому контролері потрібно виконувати ту саму ін'єкцію залежності, що і для будь-якого класу (пояснено вище).
Додатковий крок тут , щоб створити публічний метод , який можна використовувати в шаблоні для перевірки того, зареєстрований клієнт чи ні
public function isCustomerLoggedIn()
{
return $this->_session->isLoggedIn();
}
Потім у своєму шаблоні ви можете зателефонувати:
if ($block->isCustomerLoggedIn()) {
// Customer is logged in
} else {
// Customer is not logged in
}
Альтернативно, якщо сесія з клієнтом ще не ініціалізована
Є ще один спосіб зробити це, що передбачає використання Magento\Framework\App\Http\Context
замість цьогоMagento/Customer/Model/Session
Тоді ви можете зателефонувати $this->_context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH)
замість того, $this->_session->isLoggedIn()
щоб перевірити, чи замовник увійшов чи ні.
Однак цей метод може дати вам різні результати , я пропоную прочитати цю чудову відповідь для отримання додаткової інформації: https://magento.stackexchange.com/a/92133/2380