Важное напоминание: никогда не следует вызывать диспетчер объектов напрямую
Таким образом, вот как это сделать чистым способом
В любом классе, кроме шаблонов
Сначала вам нужно добавить следующий класс в ваш конструктор /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