Wie überprüfe ich, ob ein Kunde in Magento 2 eingeloggt ist oder nicht?


64

So finden Sie heraus, ob der Kunde in Magento 2 angemeldet ist oder nicht.

Wenn der Kunde angemeldet ist, wie erhalte ich Kundendaten aus der Sitzung?


Keine der hier genannten Lösungen hat für mich funktioniert. @ Rakesh: Können Sie uns mitteilen, wie es bei Ihnen funktioniert hat?
Ipsita Rout

Denken Sie daran, dass Sie, wenn Sie jemals text/x-magento-initden Anmeldestatus in einem Magento JS-Modul ( ) überprüfen müssen, zusätzlichen Aufwand sparen können, indem Sie die ObjectManager-Instanziierung vermeiden und den Status an das Konfigurationsobjekt des Moduls übergeben und stattdessen den Anmeldelink von abfragen innerhalb des JS-Moduls, zB:var isLoggedIn = $('.authorization-link > a').attr('href').indexOf('/login')<0;
Doan


1
Was macht die folgende Zeile? var isLoggedIn = $ ('. authorisation-link> a'). attr ('href'). indexOf ('/ login') <0;
Jaisa

Überprüfen Sie den Link, rakeshjesadiya.com/…
Rakesh Jesadiya

Antworten:


62

Mit dem folgenden Code können Sie die Kundenanmeldung überprüfen oder nicht überall

$ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance ();
$ customerSession = $ objectManager-> get ('Magento \ Customer \ Model \ Session');
if ($ customerSession-> isLoggedIn ()) {
   // Kunden Login Aktion
}

Vom Controller

$ this -> _ objectManager-> get ('Magento \ Customer \ Model \ Session');
if ($ customerSession-> isLoggedIn ()) {
   // Kunden Login Aktion
}

1
Natürlich ist es die offensichtlichste Lösung, und ich habe sie zum ersten Mal angewendet, aber dann habe ich festgestellt, dass sie nicht richtig funktioniert, wenn die Kundensitzung noch nicht initialisiert ist. Ich habe daher eine weniger offensichtliche, aber nachhaltigere Lösung gefunden.
Mage2.PRO

11
Man sollte den Objektmanager nicht direkt benutzen. Fügen Sie einfach den von ObjectFactory generierten Code für das Sitzungsmodell ein.
CarComp

6
Bitte kopieren Sie keine anderen Antworten in Ihre Antwort.
Marius

6
Dies ist der "falsche" Weg, die Antwort von Raphael bei Digital Pianism ist die richtige
Lorenzo

1
Wenn Sie den Ganzseiten-Cache aktiviert haben und dies in Block / Vorlage aufrufen, funktioniert dies nicht, da die Kundensitzung immer leer ist. Verwenden Sie stattdessen den http-Kontext, um dies zu überprüfen.
Leo

84

Wichtiger Hinweis: Man sollte niemals den Objektmanager direkt anrufen

Also hier ist, wie man es auf saubere Weise macht

In jeder Klasse außer Vorlagen

Sie müssen zuerst die folgende Klasse in Ihren Konstruktor einfügen /Magento/Customer/Model/Session:

protected $_session;

public function __construct(
    ...
    \Magento\Customer\Model\Session $session,
    ...
) {
    ...
    $this->_session = $session;
    ...
}

Dann können Sie in Ihrer Klasse Folgendes anrufen:

if ($this->_session->isLoggedIn()) {
    // Customer is logged in 
} else {
    // Customer is not logged in
}

In einer Vorlage

Es erfordert ein wenig mehr Arbeit in einer Vorlage, da Sie eine Voreinstellung für den Block einrichten müssen, der die Vorlage so sauber macht:

<preference for="Block\That\Renders\The\Template"
            type="Vendor\Module\Block\Your\Custom\Block" />

Dann müssen Sie in Ihrem benutzerdefinierten Block-Contrusktor die gleiche Abhängigkeitsinjektion wie für eine beliebige Klasse durchführen (siehe oben).

Der zusätzliche Schritt besteht darin, eine öffentliche Methode zu erstellen, mit der in Ihrer Vorlage überprüft werden kann, ob ein Kunde angemeldet ist oder nicht

public function isCustomerLoggedIn()
{
    return $this->_session->isLoggedIn();
}

Dann können Sie in Ihrer Vorlage Folgendes aufrufen:

if ($block->isCustomerLoggedIn()) {
    // Customer is logged in
} else {
    // Customer is not logged in
}

Alternative, wenn die Kundensitzung noch nicht initialisiert ist

Es gibt noch einen anderen Weg, der die Verwendung Magento\Framework\App\Http\Contextanstelle von impliziertMagento/Customer/Model/Session

Sie können dann anrufen, $this->_context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH)anstatt $this->_session->isLoggedIn()zu überprüfen, ob der Kunde angemeldet ist oder nicht.

Wie auch immer diese Methode zu unterschiedlichen Ergebnissen führen mag , ich empfehle Ihnen, diese großartige Antwort zu lesen, um weitere Informationen zu erhalten: https://magento.stackexchange.com/a/92133/2380


Wo soll das <preference ... />Tag in einem benutzerdefinierten Thema platziert werden? Was ist genau Block\That\Renders\The\Templateund Vendor\Module\Block\Your\Custom\Block?
Andrea

@ Andrea Nun, es hängt davon ab und es ist für jeden Fall anders. Aus diesem Grund habe ich in meiner Antwort generische Klassenpfadnamen verwendet
Raphael beim Digitalen Pianismus,

Ich habe einen benutzerdefinierten Block definiert, class Html extends \Magento\Framework\View\Element\Templatein den ich das Sitzungsobjekt im Konstruktor einfügen kann. Ich benutze diesen Block innerhalb meines benutzerdefinierten Themas auf diese Weise (von Layout XML - Dateien): <block class="Vendor\ThemeName\Block\Html" template="Vendor_ModuleName::html/my-custom-template.phtml"/>. Ich möchte den angemeldeten Benutzer in der Vorlagendatei überprüfen my-custom-template.phtml. Wie soll ich das Tag `<Einstellung ... /> verwenden?
Andrea

Funktioniert bei mir nicht die -> isLoggedin () Methode. Ich weiß nicht warum, aber es kommt nie zurück, dass der Kunde eingeloggt ist, und es ist tatsächlich so! Es ist eingeloggt (ich bin eingeloggt).
Vladimir Despotovic

@VladimirDespotovic hast du die alternative Methode getestet?
Raphael bei Digital Pianism

31

Es ist möglich via Magento\Framework\App\Http\Contextoder via Magento\Customer\Model\Session. Das Ergebnis kann jedoch unterschiedlich sein:

  • Der HTTP-Kontext wird früher als die Kundensitzung initialisiert (dies spielt jedoch keine Rolle, da beide in Aktionscontrollern initialisiert werden).
  • Wenn das PageCacheModul eingeschaltet ist (wahrscheinlich immer in Produktion), beachten Sie, dass die Kundensitzung \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXmlauf allen zwischenspeicherbaren Seiten gelöscht wird, sobald die Layouterstellung gestartet wird . Wenn Sie jetzt überprüfen, ob der Kunde über den HTTP-Kontext angemeldet ist, wird weiterhin "Ja" angezeigt, aber in der Kundensitzung sind keine Kundendaten mehr verfügbar. Daher ist vor dem Zugriff auf Daten in der Kundensitzung eine erneute Überprüfung erforderlich. Dies kann leicht im Block passieren, während dies im Action Controller unwahrscheinlich ist, da nicht erwartet wird, dass Sie dort das Layout manuell generieren. Es wird generiert, nachdem der Action Controller die Instanz von zurückgibtResultInterface

Erwägen Sie die Verwendung einer Kundensitzung, wenn diese bereits initialisiert ist, um das Risiko beschriebener Inkonsistenzen zu vermeiden, wenn PageCache aktiviert ist (true für Aktionscontroller). Verwenden Sie andernfalls den HTTP-Kontext.


toller Tipp für PageCache aktiviert, danke
LucScu

3
@Alex Ich verwende den folgenden Code: $ customerSession = $ objectManager-> get ('Magento \ Framework \ App \ Http \ Context'); $ isLoggedIn = $ customerSession-> getValue (\ Magento \ Customer \ Model \ Context :: CONTEXT_AUTH); Aufgrund der Cache-Aktivierung wird jedoch die Anmeldeoption anstelle der Abmeldung für den angemeldeten Kunden angezeigt. Wie soll ich das beheben?
Nitesh

Das hat uns in den Arsch gebissen, danke. Ihre Antwort erfordert mehr Aufmerksamkeit :-) Der in der Produktion aktivierte Cache erschwert die Sitzung. Fügen Sie cachable = false in die XML-Datei der Route ein, wenn Sie benutzerdefinierte Magento-Plugins schreiben.
Ligemer

2
warum musst du cachable = false setzen?
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);

Also, wie komme ich zum Kunden?
Xanka

8
Sie sollten
ObjectManager

Ja angenommen. Objectmanager ist nicht der richtige Weg. Injizieren Sie die CustomerFactory in den Klassenkonstruktor.
CarComp

Die oben genannte Lösung funktioniert nicht für mich
Ipsita Rout

@ Lpsita Lassen Sie mich wissen, wenn Sie dieses Problem haben? Ich habe es gerade behoben :)
Jai

10

Keine dieser Lösungen hat bei mir funktioniert. Einige Seiten scheinen angemeldet zu sein, andere nicht. Es scheint, dass dies der Fehler ist:

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

Am Ende habe ich einen Helfer erstellt, den ich in meinen Vorlagen aufrufen konnte:

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

Dann könnte ich den Helfer in meinen Vorlagen wie folgt verwenden:

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

if ($helper->isLoggedIn()) {
    //show something
}

Das stimmt, der einzige Code, der bei mir funktioniert hat, ist Ihr Code. Danke!
George George

Wie kann ich ->getCustomer()->getName()mit dem Kontext aufrufen , denn wenn ich die Sitzung benutze, funktioniert das nicht für alle Seiten.
George George

Wenn der Ganzseiten-Cache aktiviert ist, ist dies die richtige Antwort. Sie können zuerst die Kundensitzung überprüfen und wenn dies falsch ist, können Sie dies tun
CompactCode

9

Um sich als Benutzer bei der Vorlage anzumelden, können Sie den Helfer einfach in einer einzigen Zeile aufrufen:

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

<?php if( $_loggedin ) : ?>

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

<?php endif; ?>

Schöne Lösung ohne Verwendung von Objektmanager.
Nitesh

2
Dies funktionierte in Version 2.1.5 nicht, wenn FPC und Varnish im Produktionsmodus aktiviert waren.
Doan

8

Keine der hier beschriebenen Lösungen hat in Magento 2.1 mit aktiviertem Ganzseiten-Cache und Lack im Produktionsmodus zuverlässig funktioniert. Endlich fand ich eine Lösung, die 100% der Zeit funktionierte, wenn das gesamte Caching aktiviert war, nachdem ich die Idee von erhalten hatte vendor/magento/module-theme/view/frontend/templates/html/header.phtml. Hier ist meine Lösung, die einen "Anmelden" -Link anzeigt, wenn der Benutzer abgemeldet ist, und einen "Abmelden" -Link, wenn der Benutzer angemeldet ist:

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

UPDATE: Seit v2.1.5 ist diese Lösung nicht mehr zuverlässig. Eine Lösung finden Sie in Ausgabe 9156 .


Das ist eine gute Lösung. Sie können jedoch cachable = "false" in der Layoutdatei verwenden.
Dinesh Yadav

Ich habe cachable="false"in Layout-XML für diesen Block, aber Firnis wird es anscheinend immer noch zwischengespeichert. Ich bin nicht sicher, ob dies ein Fehler ist oder nicht, aber Knockout ist ein guter Weg, um dies zu umgehen. Der einzige Nachteil ist, dass es aufgrund der KO-Bindung zu einer kleinen Verzögerung kommt, bevor der Anmelde- / Abmeldelink angezeigt wird.
Doan

6

Es gibt viele Antworten, die ungefähr so ​​lauten ...

GET OBJECT MANAGER LADE KLASSENMODELL HOCH DO STUFF

Dies ist die falsche Methode, die in Magento 2.0 verwendet wird. In 2.0 sind die automatisch generierten Objektfabriken der richtige Weg. Sie können sie in nahezu jeder Klasse in Ihren Konstruktor einfügen und verwenden. Beispiel:

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
Wenn Sie eine Fehlermeldung für die Fabriken erhalten, verwenden Sie den vollständigen Pfad, z \Magento\Customer\Model\SessionFactory $sessionFactory.
Doan

Richtig. Ich erkläre sie normalerweise oben, nur damit meine Methoden nicht wie ein großes Durcheinander aussehen :)
CarComp

3

Hallo habe Antwort hier:

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

Quelle .

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

Ersetzt get with create funktioniert nun einwandfrei:

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

4
Sie sollten nie ObjectManagerdirekt verwenden
7ochem

Dies funktioniert nur, wenn der Cache deaktiviert ist und nicht im aktivierten Cache.
Jai

@Jai, diese Arbeit für mich auch in der Entwicklung und Produktion. Bitte senden Sie mir die Schritte, um das Problem zu reproduzieren.
Manish

Ich muss überprüfen, ob der Benutzer angemeldet ist oder nicht. Der folgende Code funktioniert jedoch nur im deaktivierten Cache. $ ObjectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ customerSession = $ objectManager-> create ('Magento \ Customer \ Model \ Session'); if ($ customerSession-> isLoggedIn ()) {// CODE}
Jai

Im Cache aktivieren: Funktioniert nur auf benutzerdefinierten Dashboard-Seiten, nicht auf der Homepage und auf anderen Seiten der Site. Meine Frage: magento.stackexchange.com/q/177964/29175
Jai

3

Dies ist auch eine der Lösungen "Überprüfen Sie, ob der Kunde in Magento2 angemeldet ist oder nicht".

Versuchen Sie den folgenden Code:

 $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

Versuchen Sie den folgenden Code:

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

Für die Verwendung des obigen Codes in der HTML-Datei können Sie die Funktion isLoggedIn () folgendermaßen aufrufen:

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

Hoffe diese Hilfe danke.


Hallo @ Shubdham, es funktioniert nicht ..
Jafar Pinjar

Dies ist eine saubere Lösung. Danke
Ask Bytes

Ja danke, hoffe es hilft dir.
Shubham Khandelwal

2

Ich habe die beste Lösung. Es basiert auf der Authentifizierung des Kunden . In einigen Fällen funktionierte die Kundensitzung nicht, aber meine Lösung wird jedes Mal funktionieren. Lass uns mal sehen.

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

Vielen Dank.


1

Aktuelle funktionierende Lösung (IMHO)

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

Wenn Sie überprüfen möchten, ob der Kunde angemeldet ist oder nicht, verwenden Sie diesen Code in den HTML-Dateien.

$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
Sie sollten niemals ObjectManagerdirekt verwenden und Sie sollten niemals diese Art von Code in einer Vorlage verwenden. Sie sollten Funktionen in Ihrer Blockklasse erstellen, um dies zu verwalten.
7.

Wenn Sie erst einmal wissen, wie man es richtig macht, fragen Sie sich, wie Sie es überhaupt schaffen, es anders zu machen!
CarComp

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

if($customerSession->isLoggedIn()) {

}

0

Eine andere Antwort:

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

Was denkst du?


0

Das Abrufen des protokollierten Status aus dem Sitzungsmodell funktioniert nicht, wenn Sie ihn nach dem Aktivieren des Standard-FPC-Caches von Magento verwenden möchten. In diesem Fall sollten Sie stattdessen SessionFactory verwenden.

Die Sitzung wird nicht gestartet, wenn die FPC-Zwischenspeicherung aktiviert ist. Details: https://github.com/magento/magento2/issues/3294#issuecomment-328464943

Um dies zu lösen, müssen Sie SessionFactoryzum Beispiel verwenden:

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

Ich habe viele Möglichkeiten bei Google ausprobiert, aber keine der Lösungen funktioniert. Also habe ich die Kernfunktionalität überprüft und eine PHP-Datei erstellt, um zu überprüfen, ob ein Kunde angemeldet ist oder nicht, ohne den Objekt-Manager zu verwenden.


            / **
         * Kundensitzung
         * Modul erstellt von Web Technology Codes
         * Entwickelt von Vinay Sikarwar
         * @var \ Magento \ Framework \ App \ Http \ Context
         * /
        geschützte $ session;

        / **
         * Registrierungskonstruktor.
         * @param Kontext $ Kontext
         * @param array $ data
         * /
        public function __construct (
            Kontext $ context,
                    \ Magento \ Framework \ Session \ Generic $ session
            Array $ data
        )
        {
                    $ this -> _ session = $ session;
                    parent :: __ construct ($ context, $ data);
        }

            / **
         * Überprüfung des Login-Status des Kunden
         *
         * @api
         * @ Return Bool
         * /
        öffentliche Funktion isCustomerLoggedIn ()
        {
            return (bool) $ this-> getCustomerId ()
                && $ this-> checkCustomerId ($ this-> getId ())
                &&! $ this-> getIsCustomerEmulated ();
        }
    }

Weitere Informationen finden Sie hier http://blog.webtechnologycodes.com/customer-loggedin-check-magento2

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.