Как проверить, вошел ли клиент в magento 2 или нет?

64

Как узнать, вошел ли клиент в Magento 2.

Если клиент вошел в систему, то как получить данные клиента из сеанса?

Ракеш Джесадия
источник
ни одно из упомянутых здесь решений не помогло мне. @Rakesh: не могли бы вы рассказать, как это работает для вас?
Ипсита Рут
Имейте в виду, что если вам когда-либо понадобится проверить состояние входа в систему из модуля Magento JS ( text/x-magento-init), вы можете сэкономить некоторые накладные расходы, избегая создания экземпляров ObjectManager и передавая статус объекту конфигурации модуля, и вместо этого запрашивайте ссылку для входа в систему из в модуле JS, например:var isLoggedIn = $('.authorization-link > a').attr('href').indexOf('/login')<0;
thoan
@Rakesh, пожалуйста, проверьте это, magento.stackexchange.com/questions/185994/… ,, magento.stackexchange.com/questions/186036/…
Jsparo30
1
Что делает строка ниже? var isLoggedIn = $ ('. authorization-link> a'). attr ('href'). indexOf ('/ login') <0;
Джайса
Проверьте ссылку, rakeshjesadiya.com/…
Ракеш Джесадия,

Ответы:

62

Следующий код вы можете проверить логин клиента или нет где-либо

$ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance ();
$ customerSession = $ objectManager-> get ('Magento \ Customer \ Model \ Session');
if ($ customerSession-> isLoggedIn ()) {
   // логин клиента
}

От контроллера

$ Это -> _ objectManager-> Get ( 'Magento \ Customer \ Model \ Session');
if ($ customerSession-> isLoggedIn ()) {
   // логин клиента
}
Сохель Рана
источник
1
Конечно, это наиболее очевидное решение, и я использовал его впервые, но потом заметил, что оно не работает должным образом, когда сеанс клиента еще не инициализирован, поэтому я нашел менее очевидное, но более устойчивое решение.
Mage2.PRO
11
Не следует использовать объектный менеджер напрямую. Просто добавьте сгенерированный код ObjectFactory для модели сеанса.
CarComp
6
пожалуйста, не копируйте другие ответы в своем ответе.
Мариус
6
это «неправильный» путь, ответ Рафаэля в «Цифровом пианизме» самый точный
Лоренцо
1
Если вы включили полный кеш страниц и вызываете его в блоке / шаблоне, он не работает, так как сеанс клиента всегда будет возвращаться пустым. Используйте http context, чтобы проверить это.
Лев
84

Важное напоминание: никогда не следует вызывать диспетчер объектов напрямую

Таким образом, вот как это сделать чистым способом

В любом классе, кроме шаблонов

Сначала вам нужно добавить следующий класс в ваш конструктор /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

Рафаэль в цифровом пианизме
источник
Где следует разместить <preference ... />тег в пользовательской теме? Что именно Block\That\Renders\The\Templateи Vendor\Module\Block\Your\Custom\Block?
Андреа
@ Андреа, ну, это зависит от ситуации, и в каждом случае она разная. Вот почему я использовал общие пути к классам в своем ответе
Рафаэль в Digital Pianism
У меня есть пользовательский блок, определенный как 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 ... />?
Андреа
У меня не работает метод -> isLoggedin (). Я не знаю почему, но это никогда не возвращает, что клиент вошел в систему, и это на самом деле! Он вошел в систему (я вошел в систему).
Владимир Деспотович
@VladimirDespotovic Вы тестировали альтернативный метод?
Рафаэль на цифровом
31

Это возможно через Magento\Framework\App\Http\Contextили через Magento\Customer\Model\Session. Тем не менее, результат может быть другим:

  • HTTP-контекст инициализируется раньше, чем сеанс клиента (но это не имеет значения, поскольку оба инициализируются в контроллерах действий)
  • Когда PageCacheмодуль \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXmlвключен (вероятно, всегда в работе), имейте в виду, что как только начнется генерация макета, сеанс клиента будет очищен на всех кэшируемых страницах. Это означает, что если вы теперь проверите, вошел ли клиент через HTTP-контекст, он все равно скажет «да», но данные клиента больше не будут доступны в сеансе клиента. Поэтому перед попыткой доступа к данным в сеансе клиента необходима двойная проверка. Это может легко произойти в блоке, хотя в контроллере действий это маловероятно, поскольку вы не должны создавать макет вручную там, оно будет сгенерировано после того, как контроллер действий вернет экземплярResultInterface

Чтобы устранить любой риск описанных несоответствий при включенном PageCache, рассмотрите возможность использования сеанса клиента, если он уже инициализирован (верно для контроллеров действий). Остальное использовать HTTP-контекст.

Алекс Палиаруш
источник
отличный совет для PageCache включен,
спасибо
3
@ Алекс Я использую приведенный ниже код $ customerSession = $ objectManager-> get ('Magento \ Framework \ App \ Http \ Context'); $ isLoggedIn = $ customerSession-> getValue (\ Magento \ Customer \ Model \ Context :: CONTEXT_AUTH); Но из-за включения кэша он показывает опцию «Войти» вместо «Выйти» для входа в систему клиента. Как мне это исправить?
Нитеш
Это нас в задницу, спасибо. Ваш ответ нуждается в большем внимании :-) Кэш, включаемый в производственном процессе, усложняет сеанс. Поместите cachable = false в XML-файл маршрута, если вы пишете пользовательские плагины magento.
Ligemer
2
почему вы должны поставить cachable = false?
LucScu
15
/** @var \Magento\Framework\App\ObjectManager $om */
$om = \Magento\Framework\App\ObjectManager::getInstance();
/** @var \Magento\Framework\App\Http\Context $context */
$context = $om->get('Magento\Framework\App\Http\Context');
/** @var bool $isLoggedIn */
$isLoggedIn = $context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
Mage2.PRO
источник
так как получить custommer это логин @ Mage2.PRO?
xanka
8
Вы никогда не должны использовать ObjectManager напрямую
июня
Да, согласился Objectmanager это не путь. Вставьте CustomerFactory в конструктор класса.
CarComp
Вышеупомянутое решение не работает для меня
Ipsita Rout
@lpsita Дайте мне знать, если у вас есть эта проблема? Я только исправил это :)
Jai
11

Ни одно из этих решений не помогло мне. Некоторые страницы могут быть зарегистрированы, а другие нет. Кажется, это ошибка:

https://github.com/magento/magento2/issues/3294

Я закончил тем, что создал помощника, которого я мог вызвать в моих шаблонах:

<?php
namespace MyVendor\MyModule\Helper;

use Magento\Framework\App\Helper\AbstractHelper;

/**
 * Created by Carl Owens (carl@partfire.co.uk)
 * Company: PartFire Ltd (www.partfire.co.uk)
 **/
class Data extends AbstractHelper
{
    /**
     * @var \Magento\Framework\App\Http\Context
     */
    private $httpContext;

    public function __construct(
        \Magento\Framework\App\Helper\Context $context,
        \Magento\Framework\App\Http\Context $httpContext
    ) {
        parent::__construct($context);
        $this->httpContext = $httpContext;
    }

    public function isLoggedIn()
    {
        $isLoggedIn = $this->httpContext->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
        return $isLoggedIn;
    }
}

Тогда я мог бы использовать помощника в моих шаблонах так:

<?php
$helper = $this->helper('MyVendor\MyModule\Helper\Data');

if ($helper->isLoggedIn()) {
    //show something
}
Карл Оуэнс
источник
Это правда, единственный код, который работал на меня, ваш. Спасибо!
Джордж Джордж
Как я могу позвонить, ->getCustomer()->getName()используя контекст, потому что если я использую сеанс не работает для всех страниц.
Джордж Джордж
если полный кеш страниц включен, это правильный ответ. Сначала вы можете проверить клиентскую
позицию,
9

Чтобы пользователь вошел в систему по шаблону, вы можете просто вызвать помощника в одну строку:

<?php $_loggedin = $this->helper('Magento\Checkout\Helper\Cart')->getCart()->getCustomerSession()->isLoggedIn(); ?>

<?php if( $_loggedin ) : ?>

     <div><!-- add your code --></div>

<?php endif; ?>
Afham
источник
Хорошее решение без использования objectmanager.
Нитеш,
2
Это не работало в v2.1.5 с FPC и Varnish, включенным в производственном режиме.
thdoan
8

Ни одно из решений здесь не работало для меня надежно в Magento v2.1 с полным кэшированием страниц и Varnish в рабочем режиме. Я наконец нашел решение, которое работало 100% времени с включенным кэшированием после получения идеи vendor/magento/module-theme/view/frontend/templates/html/header.phtml. Вот мое решение, которое показывает ссылку «Вход», когда пользователь вышел из системы, и ссылку «Выход», когда пользователь вошел в систему:

<li data-bind="scope: 'customer'">
  <!-- ko if: customer().firstname  -->
  <a href="<?php echo $this->getUrl('customer/account/logout'); ?>" style="display:none;" data-bind="style: {display:'inline'}"><?php echo __('Sign Out') ?></a>
  <!-- /ko -->
  <!-- ko ifnot: customer().firstname  -->
  <a href="<?php echo $this->getUrl('customer/account/login'); ?>" style="display:none;" data-bind="style: {display:'inline'}"><?php echo __('Sign In') ?></a>
  <!-- /ko -->
  <script type="text/x-magento-init">
  {
    "*": {
      "Magento_Ui/js/core/app": {
        "components": {
          "customer": {
            "component": "Magento_Customer/js/view/customer"
          }
        }
      }
    }
  }
  </script>
</li>

ОБНОВЛЕНИЕ: начиная с v2.1.5 это решение больше не является надежным. Смотрите проблему 9156 для решения.

thdoan
источник
Это хорошее решение. Хотя вы можете использовать cachable = "false" в файле макета.
Динеш Ядав
У меня есть cachable="false"макет XML для этого блока, но лак все еще кеширует его. Не уверен, является ли это ошибкой или нет, но Knockout - хороший способ обойти это. Единственным недостатком является то, что из-за привязки нокаута появляется ссылка «Вход / выход».
thdoan
6

Есть много ответов, которые звучат примерно так ...

ПОЛУЧИТЬ МЕНЕДЖЕР ОБЪЕКТА ЗАГРУЗИТЬ МОДЕЛЬ КЛАССА DO STUFF

Это НЕПРАВИЛЬНАЯ методология для использования в Magento2.0. В 2.0, автоматически сгенерированные объектные фабрики - путь. Вы можете вставить их в свой конструктор практически любого класса и использовать их. Пример:

public function __construct(
            Context $context,
            CollectionFactory $cmspageCollectionFactory,
            array $data = [],
            CustomerFactory $customerFactory,
            SessionFactory $sessionFactory)
        {
            parent::__construct($context, $data);
            $this->_cmspageCollectionFactory = $cmspageCollectionFactory;
            $this->customerFactory = $customerFactory;
            $this->sessionFactory = $sessionFactory;
        }

        /**
         * @return \Stti\Healthday\Model\ResourceModel\Cmspage\Collection
         */
        public function getCmspages()
        {
            // First check to see if someone is currently logged in.
            $customerSession = $this->sessionFactory->create();
            if ($customerSession->isLoggedIn()) {
                // customer is logged in;
                //$customer = $this->customerFactory->create()->get
            }
CarComp
источник
2
Если вы получили ошибку для фабрик, то используйте полный путь, например \Magento\Customer\Model\SessionFactory $sessionFactory.
thdoan
Верный. Я обычно объявляю их наверху, просто чтобы мои методы не выглядели как огромный беспорядок :)
CarComp
3

Привет получил ответ здесь:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->create('Magento\Customer\Model\Session');

if ($customerSession->isLoggedIn()) {
    $customerSession->getCustomerId();  // get Customer Id
    $customerSession->getCustomerGroupId();
    $customerSession->getCustomer();
    $customerSession->getCustomerData();

    echo $customerSessionget->getCustomer()->getName();  // get  Full Name
    echo $customerSessionget->getCustomer()->getEmail(); // get Email
}

Источник .

$customerSession = $objectManager->get('Magento\Customer\Model\Session');

Заменено get with create теперь работает нормально:

$customerSession = $objectManager->create('Magento\Customer\Model\Session');
Manish
источник
4
Вы никогда не должны использовать ObjectManagerнапрямую
7ochem
Это работает только в том случае, если кеш отключен, а не в enabled-cache.
Джай
@Jai, эта работа для меня также в разработке и производстве. Не могли бы вы выслать мне шаги по воспроизведению проблемы?
Маниш
Я должен проверить, вошел ли пользователь в систему или нет. Но приведенный ниже код работает только в отключенном кеше $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ customerSession = $ objectManager-> create ('Magento \ Customer \ Model \ Session'); if ($ customerSession-> isLoggedIn ()) {// CODE}
Jai
При включении кэширования: работает только на страницах пользовательской панели, но не на домашней странице и других страницах сайта. Мой вопрос: magento.stackexchange.com/q/177964/29175
Джай
3

Это также одно из решений «Проверьте, вошел ли клиент в Magento2».

Попробуйте код ниже:

 $om = \Magento\Framework\App\ObjectManager::getInstance();
 $context = $om->get('Magento\Framework\App\Http\Context');
 $isLoggedIn = $context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
 if($isLoggedIn){
      echo "Yes Customer loggedin";
      echo "<pre>";print_r($context->getData()); 
 }
Soundararajan м
источник
2

Попробуйте код ниже:

<?php
namespace YourCompany\ModuleName\Helper;

class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
    public function __construct(
        \Magento\Framework\App\Helper\Context $context,
        \Magento\Customer\Model\Session $customerSession
    ) {
        $this->customerSession = $customerSession;
        parent::__construct($context);
    }

public function isLoggedIn() // You can use this fucntion in any phtml file
    {
        return $this->customerSession->isLoggedIn();
    }
}

Для использования приведенного выше кода в phtml файле вы можете вызвать функцию isLoggedIn () как:

<?php $helper = $this->helper('YourCompany\ModuleName\Helper\Data'); ?>
<?php if($helper->isLoggedIn()) : ?>
    logged in
<?php else : ?>
    not logged in
<?php endif; ?> 

Надеюсь, это поможет, спасибо.

Шубхам Кхандельвал
источник
привет @Shubdham, это не работает ..
Джафар Пинджар
это аккуратное решение. спасибо
Спросите байтов
Да, спасибо, надеюсь, это поможет вам.
Шубхам Хандельвал
2

У меня есть лучшее решение. Он основан на аутентификации клиента . В некоторых случаях клиентская сессия не работала, но каждый раз мое решение будет работать. Давайте взглянем.

<?php
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->get('Magento\Customer\Block\Account\AuthorizationLink');
if ($customerSession->isLoggedIn() == true) {
//your code.
} ?>

Благодарю.

Рафик Ислам
источник
1

Текущее отработанное решение (ИМХО)

<?php

namespace My\Module\Helper\Data;

/**
 * @var \Magento\Framework\ObjectManagerInterface
 */
protected $objectManager;

/**
 * @var \Magento\Customer\Model\SessionFactory
 */
protected $customerSession;

/**
 * Class Data
 */
class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
    /**
     * @param \Magento\Framework\ObjectManagerInterface $objectManager
     */
    public function __construct(
         \Magento\Framework\ObjectManagerInterface $objectManager
    )
    {
        $this->objectManager   = $objectManager;
        $this->customerSession = $this->objectManager->create('Magento\Customer\Model\SessionFactory')->create();
    }

    /**
     * @return \Magento\Customer\Model\SessionFactory
     */
    public function getCustomerSession()
    {
       return $this->customerSession;     
    }

    /**
     * @return bool
     */
    public function isCustomerLoggedIn()
    {
        return ($this->getCustomerSession()->isLoggedIn()) ? true : false;
    }
}
coresh
источник
1

Если вы хотите проверить, вошел клиент или нет, используйте этот код в файлах phtml,

$om = \Magento\Framework\App\ObjectManager::getInstance();
$appContext = $om->get('Magento\Framework\App\Http\Context');
$isLoggedIn = $appContext->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
if($isLoggedIn) {
    /** LOGGED IN CUSTOMER, this should work in template   **/
}
Purvesh
источник
2
Вы никогда не должны использовать ObjectManagerнапрямую, и вы никогда не должны использовать этот тип кода в шаблоне. Вы должны создать функциональные возможности в своем классе блоков, чтобы управлять этим.
июня
Когда вы знаете, как это сделать правильно, вы удивляетесь, как вы когда-либо управляете, чтобы делать это по-другому!
CarComp
0
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->get('Magento\Customer\Model\Session');

if($customerSession->isLoggedIn()) {

}
Дивья
источник
0

Еще один ответ:

<?php $_loggedin = $block->getLayout()->createBlock('Magento\Customer\Block\Account\AuthorizationLink')->isLoggedIn() ?>
 <?php if( $_loggedin ) : ?>
   // your code
 <?php endif; ?>

Как вы думаете?

xanka
источник
0

Извлечение зарегистрированного состояния из модели Session не будет работать, если вы захотите использовать его после включения кэша FPC Magento по умолчанию, в этом случае вместо этого следует использовать SessionFactory.

Сеанс не инициируется, если включено кэширование FPC, подробности: https://github.com/magento/magento2/issues/3294#issuecomment-328464943

Чтобы решить эту проблему, вы должны использовать SessionFactory , например:

/**
* @var \Magento\Customer\Model\Session
*/
protected $_customerSessionFactory;

public function __construct(
    ....
    \Magento\Customer\Model\SessionFactory $customerSessionFactory
    ....
) 
{
    ....
    $this->_customerSessionFactory = $customerSessionFactory;
    ....
}

public function getCustomerId(){
  $customer = $this->_customerSessionFactory->create();
  echo $customer->getCustomer()->getId();
}
Wolfack
источник
-1

Я пробовал много способов, найденных в Google, но ни одно из решений не работает. Итак, я проверил основные функции и создал php-файл, чтобы проверить, вошел клиент или нет, без использования диспетчера объектов.


            / **
         * Клиентская сессия
         * Модуль, созданный с помощью кодов веб-технологий
         * Разработано Vinay Sikarwar
         * @var \ Magento \ Framework \ App \ Http \ Context
         * /
        защищенная сессия $;

        / **
         * Регистрация конструктора.
         * @param Context $ context
         * @param array $ data
         * /
        публичная функция __construct (
            Context $ context,
                    \ Magento \ Framework \ Session \ Generic $ session,
            массив $ data
        )
        {
                    $ this -> _ session = $ session;
                    конструкция parent :: __ ($ context, $ data);
        }

            / **
         * Проверка статуса входа клиента
         *
         * @api
         * @return bool
         * /
        публичная функция isCustomerLoggedIn ()
        {
            return (bool) $ this-> getCustomerId ()
                && $ this-> checkCustomerId ($ this-> getId ())
                &&! $ this-> getIsCustomerEmulated ();
        }
    }

Для получения дополнительной информации проверьте это здесь http://blog.webtechnologycodes.com/customer-loggedin-check-magento2

Виная Сикарвар
источник