Как узнать, вошел ли клиент в Magento 2.
Если клиент вошел в систему, то как получить данные клиента из сеанса?
magento2
customer
login
customer-account
customer-session
Ракеш Джесадия
источник
источник
text/x-magento-init
), вы можете сэкономить некоторые накладные расходы, избегая создания экземпляров ObjectManager и передавая статус объекту конфигурации модуля, и вместо этого запрашивайте ссылку для входа в систему из в модуле JS, например:var isLoggedIn = $('.authorization-link > a').attr('href').indexOf('/login')<0;
Ответы:
Следующий код вы можете проверить логин клиента или нет где-либо
От контроллера
источник
Важное напоминание: никогда не следует вызывать диспетчер объектов напрямую
Таким образом, вот как это сделать чистым способом
В любом классе, кроме шаблонов
Сначала вам нужно добавить следующий класс в ваш конструктор
/Magento/Customer/Model/Session
:Тогда в вашем классе вы можете назвать следующее:
В шаблоне
Это требует немного больше работы с шаблоном, так как вам придется настроить предпочтение для блока, который отображает шаблон, чтобы сделать это чистым способом:
Затем в вашем пользовательском блоке управления вам нужно выполнить то же внедрение зависимостей, что и для любого класса (объяснено выше).
Дополнительный шаг здесь , чтобы создать публичный метод , который можно использовать в шаблоне для проверки того, зарегистрирован клиент или нет
Тогда в вашем шаблоне вы можете позвонить:
Альтернатива, если сеанс клиента еще не инициализирован
Есть еще один способ сделать это, который предполагает использование
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
источник
<preference ... />
тег в пользовательской теме? Что именноBlock\That\Renders\The\Template
иVendor\Module\Block\Your\Custom\Block
?class Html extends \Magento\Framework\View\Element\Template
где я могу вставить объект сеанса в конструктор. Я использую этот блок в моей пользовательской теме таким образом (от макета XML - файлов):<block class="Vendor\ThemeName\Block\Html" template="Vendor_ModuleName::html/my-custom-template.phtml"/>
. Я хотел бы проверить зарегистрированного пользователя в файле шаблонаmy-custom-template.phtml
. Как мне использовать тег `<preference ... />?Это возможно через
Magento\Framework\App\Http\Context
или черезMagento\Customer\Model\Session
. Тем не менее, результат может быть другим:PageCache
модуль\Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml
включен (вероятно, всегда в работе), имейте в виду, что как только начнется генерация макета, сеанс клиента будет очищен на всех кэшируемых страницах. Это означает, что если вы теперь проверите, вошел ли клиент через HTTP-контекст, он все равно скажет «да», но данные клиента больше не будут доступны в сеансе клиента. Поэтому перед попыткой доступа к данным в сеансе клиента необходима двойная проверка. Это может легко произойти в блоке, хотя в контроллере действий это маловероятно, поскольку вы не должны создавать макет вручную там, оно будет сгенерировано после того, как контроллер действий вернет экземплярResultInterface
Чтобы устранить любой риск описанных несоответствий при включенном PageCache, рассмотрите возможность использования сеанса клиента, если он уже инициализирован (верно для контроллеров действий). Остальное использовать HTTP-контекст.
источник
источник
Ни одно из этих решений не помогло мне. Некоторые страницы могут быть зарегистрированы, а другие нет. Кажется, это ошибка:
https://github.com/magento/magento2/issues/3294
Я закончил тем, что создал помощника, которого я мог вызвать в моих шаблонах:
Тогда я мог бы использовать помощника в моих шаблонах так:
источник
->getCustomer()->getName()
используя контекст, потому что если я использую сеанс не работает для всех страниц.Чтобы пользователь вошел в систему по шаблону, вы можете просто вызвать помощника в одну строку:
источник
Ни одно из решений здесь не работало для меня надежно в Magento v2.1 с полным кэшированием страниц и Varnish в рабочем режиме. Я наконец нашел решение, которое работало 100% времени с включенным кэшированием после получения идеи
vendor/magento/module-theme/view/frontend/templates/html/header.phtml
. Вот мое решение, которое показывает ссылку «Вход», когда пользователь вышел из системы, и ссылку «Выход», когда пользователь вошел в систему:ОБНОВЛЕНИЕ: начиная с v2.1.5 это решение больше не является надежным. Смотрите проблему 9156 для решения.
источник
cachable="false"
макет XML для этого блока, но лак все еще кеширует его. Не уверен, является ли это ошибкой или нет, но Knockout - хороший способ обойти это. Единственным недостатком является то, что из-за привязки нокаута появляется ссылка «Вход / выход».Есть много ответов, которые звучат примерно так ...
ПОЛУЧИТЬ МЕНЕДЖЕР ОБЪЕКТА ЗАГРУЗИТЬ МОДЕЛЬ КЛАССА DO STUFF
Это НЕПРАВИЛЬНАЯ методология для использования в Magento2.0. В 2.0, автоматически сгенерированные объектные фабрики - путь. Вы можете вставить их в свой конструктор практически любого класса и использовать их. Пример:
источник
\Magento\Customer\Model\SessionFactory $sessionFactory
.Привет получил ответ здесь:
Источник .
Заменено get with create теперь работает нормально:
источник
ObjectManager
напрямуюЭто также одно из решений «Проверьте, вошел ли клиент в Magento2».
Попробуйте код ниже:
источник
Попробуйте код ниже:
Для использования приведенного выше кода в phtml файле вы можете вызвать функцию isLoggedIn () как:
Надеюсь, это поможет, спасибо.
источник
У меня есть лучшее решение. Он основан на аутентификации клиента . В некоторых случаях клиентская сессия не работала, но каждый раз мое решение будет работать. Давайте взглянем.
Благодарю.
источник
Текущее отработанное решение (ИМХО)
источник
Если вы хотите проверить, вошел клиент или нет, используйте этот код в файлах phtml,
источник
ObjectManager
напрямую, и вы никогда не должны использовать этот тип кода в шаблоне. Вы должны создать функциональные возможности в своем классе блоков, чтобы управлять этим.источник
Еще один ответ:
Как вы думаете?
источник
Извлечение зарегистрированного состояния из модели Session не будет работать, если вы захотите использовать его после включения кэша FPC Magento по умолчанию, в этом случае вместо этого следует использовать SessionFactory.
Сеанс не инициируется, если включено кэширование FPC, подробности: https://github.com/magento/magento2/issues/3294#issuecomment-328464943
Чтобы решить эту проблему, вы должны использовать
SessionFactory
, например:источник
Я пробовал много способов, найденных в Google, но ни одно из решений не работает. Итак, я проверил основные функции и создал php-файл, чтобы проверить, вошел клиент или нет, без использования диспетчера объектов.
Для получения дополнительной информации проверьте это здесь http://blog.webtechnologycodes.com/customer-loggedin-check-magento2
источник