Як перевірити, чи користувач увійшов у програму 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.