сеанс клиента не работает, кроме страницы клиента - Magento 2
Приложение/код/Поставщик/Модуль/Блок
<?php
namespace Vendor\Module\Block;
class CustomerLink extends \Magento\Framework\View\Element\Template
{
protected $_customersession;
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Customer\Model\Session $session
) {
parent::__construct($context);
$this->_customersession=$session;
}
public function sessionCheck()
{
return $this->_customersession->isLoggedIn();
}
}
Приложение/код/Поставщик/Модуль/представление/интерфейс/шаблон
<?php
if($block->sessionCheck())
{
echo 'logged in';
}
else
{
echo 'logged out';
}
?>
Он работает только на странице клиента и странице оформления заказа/корзины , оставшаяся страница возвращает ложь, даже если клиент вошел в систему.
Поэтому я решил использовать \Magento\Framework\App\Http\Context $httpContext
это возвращаемое правильное логическое значение во всем веб-сайте, но как получить информацию о клиенте с помощью httpContext
.
Почему \Magento\Клиент\Модель\Сессия работает только в страница клиента?
Примечание: все кэши находятся в режиме включения.
2 answers
Чтобы получить доступ к реальным данным в сеансе Magento 2, вам необходимо применить одно из следующих
- Сделайте это на странице, не подлежащей кэшированию.
- Отключить полный кэш страниц.
- Установите
$this->$_isScopePrivate = true
для блока, в котором вы пытаетесь получить доступ к сеансу.
Почему:
Magento 2 предоставляет общедоступный и частный контент для кэшируемых страниц отдельно.
Во время рендеринга кэшируемых страниц Magento очищает все данные, которые могут быть специфичными для конкретного пользователя (сброс личных данных). Затем выполняется отдельный ajax-запрос для загрузки всей личной информации и блоков обновления.
Вот почему сеанс пуст во время рендеринга.
Ответственность за очистку личных данных лежит на нескольких плагинах обезличивания. Сеанс клиента, например, очищается с помощью \Magento\Клиент\Модель\Макет\Обезличивание плагина.
Вы можете увидеть условия, при которых деперсонализация будет применяться в \Magento\Кэш страниц\Модель\Проверка обезличивания::Проверка обезличивания
Что такое кэшируемые/некешируемые страницы:
Короче говоря, кэшируемая страница - это любая страница, которая не содержит некэшируемых блоков (блоки с атрибутом cacheable="false"
в объявлении макета). Соответственно, страницы с некэшируемыми блоками являются некэшируемыми. :)
Здесь вы можете найти фактическую проверку: \Magento\Framework\Вид\Макет::Можно кэшировать
Кэшируемая страница примеры: Категория, страницы просмотра продуктов, страницы CMS
Примеры страниц, не подлежащих кэшированию: Страницы учетной записи клиента и проверки
Существует более подробный Обзор кэширования Magento 2 от Алана Кента
Похоже, что это не проблема, поскольку Magento 2 очищает хранилище сеансов для кэшируемых запросов, чтобы избежать кэширования личного содержимого клиента. Короче говоря, вы не должны получать доступ к данным сеанса клиента во время обработки запроса GET, предназначенного для отображения кэшируемой страницы.
Я бы также не рекомендовал отключать кэш для всей страницы с помощью обновления макета в качестве обходного пути.
Magento 2 обеспечивает особый подход к работе с частным клиентом содержание. Вы можете найти более подробную информацию в разделе Magento DevDocs: Частный контент.