сеанс клиента не работает, кроме страницы клиента - 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\Клиент\Модель\Сессия работает только в страница клиента?

Примечание: все кэши находятся в режиме включения.

Author: Msquare, 2016-11-15

2 answers

Чтобы получить доступ к реальным данным в сеансе Magento 2, вам необходимо применить одно из следующих

  • Сделайте это на странице, не подлежащей кэшированию.
  • Отключить полный кэш страниц.
  • Установите $this->$_isScopePrivate = true для блока, в котором вы пытаетесь получить доступ к сеансу.

Почему:

Magento 2 предоставляет общедоступный и частный контент для кэшируемых страниц отдельно.

Во время рендеринга кэшируемых страниц Magento очищает все данные, которые могут быть специфичными для конкретного пользователя (сброс личных данных). Затем выполняется отдельный ajax-запрос для загрузки всей личной информации и блоков обновления.

Вот почему сеанс пуст во время рендеринга.

Ответственность за очистку личных данных лежит на нескольких плагинах обезличивания. Сеанс клиента, например, очищается с помощью \Magento\Клиент\Модель\Макет\Обезличивание плагина.

Вы можете увидеть условия, при которых деперсонализация будет применяться в \Magento\Кэш страниц\Модель\Проверка обезличивания::Проверка обезличивания

Что такое кэшируемые/некешируемые страницы:

Короче говоря, кэшируемая страница - это любая страница, которая не содержит некэшируемых блоков (блоки с атрибутом cacheable="false" в объявлении макета). Соответственно, страницы с некэшируемыми блоками являются некэшируемыми. :)

Здесь вы можете найти фактическую проверку: \Magento\Framework\Вид\Макет::Можно кэшировать

Кэшируемая страница примеры: Категория, страницы просмотра продуктов, страницы CMS

Примеры страниц, не подлежащих кэшированию: Страницы учетной записи клиента и проверки

Существует более подробный Обзор кэширования Magento 2 от Алана Кента

 21
Author: Sergii Ivashchenko, 2016-11-15 14:23:15

Похоже, что это не проблема, поскольку Magento 2 очищает хранилище сеансов для кэшируемых запросов, чтобы избежать кэширования личного содержимого клиента. Короче говоря, вы не должны получать доступ к данным сеанса клиента во время обработки запроса GET, предназначенного для отображения кэшируемой страницы.

Я бы также не рекомендовал отключать кэш для всей страницы с помощью обновления макета в качестве обходного пути.

Magento 2 обеспечивает особый подход к работе с частным клиентом содержание. Вы можете найти более подробную информацию в разделе Magento DevDocs: Частный контент.

 1
Author: Dmytro Cheshun, 2021-01-27 04:06:27