Die Kundensitzung funktioniert nur auf der Kundenseite - Magento 2

7

Block

<?php
namespace Vendor\Module\Block;
class CustomerLink extends \Magento\Framework\View\Element\Template
{
    protected $_customersession;
    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Magento\Customer\Model\Session $session
    ) {
        parent::__construct($context);
        $this->_customersession=$session;
    }        
    public function sessionCheck()
    {
        return $this->_customersession->isLoggedIn();
    }

}

Vorlage

<?php
if($block->sessionCheck())
{
    echo 'logged in';
}
else
{
    echo 'logged out';
}
?>

Es funktioniert nur auf der Kundenseite und der Checkout- / Warenkorbseite . Die verbleibende Seite gibt false zurück, selbst wenn der Kunde angemeldet ist.

Deshalb habe ich mich entschlossen, \Magento\Framework\App\Http\Context $httpContextdiesen booleschen Rückgabewert auf der gesamten Website zu verwenden, aber wie man Kundendaten verwendet httpContext.

Warum funktioniert \ Magento \ Customer \ Model \ Session nur auf der Kundenseite?

Hinweis: Alle Caches befinden sich im Aktivierungsmodus.

Bilal Usean
quelle

Antworten:

18

Um in einer Magento 2-Sitzung auf reale Daten zugreifen zu können, müssen Sie eine der folgenden Methoden anwenden

  • Tun Sie es auf einer nicht zwischenspeicherbaren Seite.
  • Deaktivieren Sie den Ganzseiten-Cache.
  • Stellen Sie den $this->$_isScopePrivate = trueBlock ein, in dem Sie versuchen, auf die Sitzung zuzugreifen.

Warum:

Magento 2 rendert öffentliche und private Inhalte für zwischengespeicherte Seiten getrennt.

Während des Renderns zwischengespeicherter Seiten bereinigt Magento alle Daten, die für einen bestimmten Benutzer spezifisch sein können (Deaktivieren privater Daten). Anschließend wird eine separate Ajax-Anforderung ausgeführt, um alle privaten Informationen zu laden und Blöcke zu aktualisieren.

Aus diesem Grund ist die Sitzung beim Rendern leer.

Die Verantwortung für die Bereinigung privater Daten liegt bei mehreren Depersonalisierungs-Plugins. Die Kundensitzung wird beispielsweise von \ Magento \ Customer \ Model \ Layout \ DepersonalizePlugin bereinigt .

Sie können die Bedingungen, unter denen die Depersonalisierung angewendet wird, unter \ Magento \ PageCache \ Model \ DepersonalizeChecker :: checkIfDepersonalize anzeigen

Was sind zwischenspeicherbare / nicht zwischenspeicherbare Seiten:

Kurz gesagt, eine zwischenspeicherbare Seite ist eine Seite, die keine nicht zwischenspeicherbaren Blöcke enthält (Blöcke mit cacheable="false"Attribut in der Layoutdeklaration). Dementsprechend sind Seiten mit nicht zwischenspeicherbaren Blöcken nicht zwischenspeicherbar. :) :)

Hier finden Sie die eigentliche Prüfung: \ Magento \ Framework \ View \ Layout :: isCacheable

Beispiele für zwischenspeicherbare Seiten: Kategorie, Produktansichtseiten, CMS-Seiten

Beispiele für nicht zwischenspeicherbare Seiten: Kundenkonto- und Checkotu-Seiten

Es gibt eine detailliertere Magento 2 Caching-Übersicht von Alan Kent

Sergii Ivashchenko
quelle
tolle Erklärung!
Bilal Usean
@SergeyIvashchenko wo ich dies hinzufüge $this->$_isScopePrivate = true, habe ich diesen Code auf __construct hinzugefügt, aber diesen Fehler erhalten PHP Schwerwiegender Fehler: Kannst du nicht auf leere Eigenschaften zugreifen$this->_isScopePrivate = true; ?
Riyas Muhammed
Ja, das war ein Tippfehler. Es hätte sein sollen $this->_isScopePrivate. Beachten Sie, dass diese Variable veraltet ist und nicht verwendet werden sollte. Stattdessen sollten alle Blöcke zwischengespeichert werden und das dokumentierte Verfahren für privaten Inhalt sollte befolgt werden, um sitzungsspezifische Daten zu Seiten hinzuzufügen
Jisse Reitsma
Nach dem Deaktivieren der FPC funktioniert es einwandfrei, aber auf der Live-Site sollten wir die FPC aktivieren. Bitte schlagen Sie die Lösung vor
Purushotam Sharma
1
Wenn Sie diese Daten für andere Schweinswale als das Rendern benötigen - es ist in Ordnung, die Daten nur vor der Depersonalisierung (dh vor der Layout-XML-Generierung)
abzurufen
1

Dies scheint kein Problem zu sein, da Magento 2 den Sitzungsspeicher für zwischenspeicherbare Anforderungen bereinigt, um das Zwischenspeichern von privaten Kundeninhalten zu vermeiden. Kurz gesagt, Sie sollten nicht auf die Sitzungsdaten des Kunden zugreifen, während Sie die GET-Anforderung verarbeiten, mit der die zwischengespeicherte Seite gerendert werden soll.

Ich würde auch nicht empfehlen, den Cache für die gesamte Seite über das Layout-Update zu deaktivieren, um dies zu umgehen.

Magento 2 bietet einen speziellen Ansatz für die Arbeit mit privaten Inhalten eines Kunden. Weitere Informationen finden Sie im Abschnitt Magento DevDocs: Privater Inhalt .

Dmytro Cheshun
quelle