Як перевірити, чи користувач увійшов у програму magento 2 чи ні?


64

Як дізнатися, чи користувач увійшов чи не в Magento 2.

Якщо клієнт увійшов у систему, то як отримати дані про клієнтів із сеансу?


жоден із згаданих тут рішень не працював на мене. @Rakesh: ти міг би поділитися тим, як це працювало на тебе?
Ipsita Rout

Майте на увазі, що якщо вам коли-небудь потрібно перевірити статус входу з модуля Magento JS ( text/x-magento-init), ви можете зберегти деякі накладні витрати, уникаючи екземплярів ObjectManager і передаючи статус об'єкту конфігурації модуля, а замість цього запитуйте посилання для входу з у модулі JS, наприклад:var isLoggedIn = $('.authorization-link > a').attr('href').indexOf('/login')<0;
16-16

@Rakesh, Coul, будь ласка, перевірте це, magento.stackexchange.com/questions/185994/… ,, magento.stackexchange.com/questions/186036/…
Jsparo30

1
Що робиться нижче в рядку? var isLoggedIn = $ ('. авторизація-посилання> a'). attr ('href'). indexOf ('/ login') <0;
Джайса

Перевір посилання, rakeshjesadiya.com/…
Ракеш Єсадія

Відповіді:


62

Наступний код ви можете перевірити вхід клієнта чи ніде

$ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance ();
$ customerSession = $ objectManager-> get ('Magento \ Клієнт \ Модель \ Сесія');
if ($ customerSession-> isLoggedIn ()) {
   // дія входу клієнта
}

Від контролера

$ this -> _ objectManager-> get ('Magento \ Клієнт \ Модель \ Сесія');
if ($ customerSession-> isLoggedIn ()) {
   // дія входу клієнта
}

1
Звичайно, це найбільш очевидне рішення, і я його застосував спочатку, але потім я помітив, що він не працює належним чином, коли сесія з клієнтами ще не ініціалізована, тому я знайшов менш очевидне, але більш стійке рішення.
Mage2.PRO

11
Не слід безпосередньо використовувати objectmanager. Просто введіть код, створений ObjectFactory для моделі сеансу.
CarComp

6
будь ласка, не копіюйте інших відповідей у ​​своїй відповіді.
Маріус

6
це "неправильний" спосіб, відповідь Рафаеля в "Цифровому піанізмі" - суворий
Лоренцо

1
Якщо ви ввімкнули кеш на повній сторінці і ви закликаєте це в блоці / шаблоні, він не працює, оскільки сеанс клієнта завжди повернеться порожнім. Використовуйте http-контекст, щоб перевірити це замість нього.
лео

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, thx
LucScu

3
@Alex Я використовую нижче код $ customerSession = $ objectManager-> get ('Magento \ Framework \ App \ Http \ Context'); $ isLoggedIn = $ customerSession-> getValue (\ Magento \ Customer \ Model \ Context :: CONTEXT_AUTH); Але завдяки кешу увімкнути Це показ опції Увійти замість Виходу для входу в систему. Як я можу це виправити?
Нітеш

Це вкусило нас у дупу, дякую. Ваша відповідь потребує більшої уваги :-) Кеш, включений у виробництві, ускладнює сеанс. Помістіть cachable = false у XML-файл маршруту, якщо ви пишете власні модулі magento.
Лігемер

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?
xanka

8
Ніколи не використовуйте ObjectManager безпосередньо
7ochem

Так, домовились. Менеджер об'єктів - це не шлях. Введіть CustomerFactory в конструктор класу.
CarComp

Наведене вище рішення не працює для мене
Ipsita Rout

@lpsita Повідомте мене, якщо у вас є це питання? Я щойно це виправив :)
Джай

10

Жодне з цих рішень не працювало для мене. Деякі сторінки, схоже, увійшли в систему, а інші - ні. Здається, це помилка:

https://github.com/magento/magento2/isissue/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()за допомогою контексту, оскільки якщо я використовую сесію, працює не для всіх сторінок.
Джордж Джордж

якщо кеш повного сторінки включений, це правильна відповідь. Ви можете спочатку перевірити власність клієнтів, і якщо це повернеться помилково, ви можете це зробити
CompactCode

9

Щоб увійти в систему за допомогою шаблону, ви можете просто зателефонувати помічнику лише в одному рядку:

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

<?php if( $_loggedin ) : ?>

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

<?php endif; ?>

Приємне рішення без використання objectmanager.
Нітеш

2
Це не спрацювало в v2.1.5, коли FPC та Varnish увімкнено у режимі виробництва.
туан

8

Жодне з рішень тут не працювало для мене надійно в Magento v2.1 з увімкненим кеш-пам’ятником та лаком у повному обсязі. Нарешті я знайшов рішення, яке працювало 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 .


Це хороше рішення. Хоча ви можете використовувати cachable = "false" у файлі макета.
Дінеш Ядав

У мене є cachable="false"макет XML для цього блоку, але лак все ще схоже на кешування. Не впевнений, це помилка чи ні, але нокаут - хороший спосіб цього обійти. Єдиним недоліком є ​​те, що перед тим, як з'явиться посилання Вхід / Вихід, з’явиться невелика затримка через прив'язку KO.
туан

6

Є багато відповідей, які відповідають щось подібне ...

Отримайте КЕРІВНИК ОБ'ЄКТІВ ЗАВАНТАЖУЙТЕ КЛАССУ МОДЕЛЮ ДО СТУФА

Це методологія WRONG, яка використовується в 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
            }

2
Якщо ви отримуєте помилку для заводів, то використовуйте повний шлях, наприклад \Magento\Customer\Model\SessionFactory $sessionFactory.
туан

Правильно. Зазвичай я оголошую їх у верхній частині, просто так, щоб мої методи не виглядали великим безладом :)
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');

4
Ніколи не слід використовувати ObjectManagerбезпосередньо
7ochem

Це працює лише в тому випадку, якщо кеш вимкнено не в увімкненому кеші.
Джай

@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
Jai

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()); 
 }

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, його не працює ..
jafar pinjar

це акуратне рішення. спасибі
Запитайте байтів

Так, сподіваюся, сподіваюся, що це допоможе тобі.
Shubham Khandelwal

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;
    }
}

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   **/
}

2
Ніколи не слід використовувати ObjectManagerбезпосередньо, і ви ніколи не повинні використовувати цей тип коду в шаблоні. Ви повинні створити функціональні можливості у своєму блоковому класі, щоб керувати цим.
7оч.

Як тільки ви знаєте, як це зробити правильно, вам цікаво, як вам взагалі керувати взагалі іншим способом!
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; ?>

Що ти думаєш?


0

Визначення зареєстрованого стану з моделі сесії не буде працювати, якщо ви бажаєте використовувати його після включення кеш-пам'яті FPC за замовчуванням Magento, у такому випадку вам слід використовувати SessionFactory замість цього.

Сесія не ініціюється, якщо кеш FPC увімкнено, подробиці: https://github.com/magento/magento2/isissue/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();
}

-1

Я перепробував багато способів, знайдених у Google, але жодне з рішень не працює. Отже, я перевірив функціональність основної програми та створив файл php, щоб перевірити, чи користувач увійшов чи ні, не використовуючи Менеджер об’єктів.


            / **
         * Клієнтська сесія
         * Модуль, створений кодами веб-технологій
         * Розроблено Вінеєм Сікарвар
         * @var \ Magento \ Framework \ App \ Http \ Контекст
         * /
        захищений $ сеанс;

        / **
         * Конструктор реєстрації.
         * @param Контекст $ контекст
         * @param масив $ data
         * /
        публічна функція __construct (
            Контекст $ контексту,
                    \ Magento \ Framework \ Сесія \ Загальний $ сеанс,
            масив $ data
        )
        {
                    $ this -> _ сесія = $ сесія;
                    батьківська :: __ конструкція ($ контекст, $ дані);
        }

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

Для отримання додаткової інформації перегляньте тут http://blog.webtechnologycodes.com/customer-loggedin-check-magento2

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.