Wie setze, rufe und lösche ich Sitzungsvariablen in Magento 2?


33

Was ist das Äquivalent für die Sitzung in Magento 1?

Mage::getSingleton('core/session')->setMyValue('test');
Mage::getSingleton('core/session')->unsMyValue();

Gleiche in Magento 2?

Antworten:


20

Ich habe den entsprechenden Weg in Magento2 gefunden:

Mage::getSingleton('core/session')->setMyValue('test');
Mage::getSingleton('core/session')->unsMyValue();

Festlegen / Abrufen / Aufheben des Werts in der Hauptsitzung:

protected $_coreSession;

public function __construct(
    -----
    \Magento\Framework\Session\SessionManagerInterface $coreSession
    ){
    $this->_coreSession = $coreSession;
    ----
}

public function setValue(){
    $this->_coreSession->start();
    $this->_coreSession->setMessage('The Core session');
}

public function getValue(){
    $this->_coreSession->start();
    return $this->_coreSession->getMessage();
}

public function unSetValue(){
    $this->_coreSession->start();
    return $this->_coreSession->unsMessage();
}

Auf diese Weise können wir benutzerdefinierte Werte festlegen, wenn unser Sitzungswert nicht mit den folgenden Sitzungen zusammenhängt:

  • \ Magento \ Backend \ Model \ Session
  • \ Magento \ Catalog \ Model \ Session
  • \ Magento \ Checkout \ Model \ Session
  • \ Magento \ Customer \ Model \ Session
  • \ Magento \ Newsletter \ Model \ Session

1
Schöne Erklärung!
Himmat Paliwal

@Sarfaraz, können wir die Sitzung im Controller einstellen und in der Blockdatei darauf zugreifen?
Jafar Pinjar

Können wir einen Integer-Wert setzen? Ich erhalte den folgenden Fehler: Objekt der Klasse Magento \\ Framework \\ Session \\ Generic \\ Interceptor konnte nicht in String konvertiert werden
Jafar Pinjar

57

In Magento 2 gibt es nicht mehr core/session.
Es gibt jedoch diese (können auch andere sein):

  • \Magento\Backend\Model\Session
  • \Magento\Catalog\Model\Session
  • \Magento\Checkout\Model\Session
  • \Magento\Customer\Model\Session
  • \Magento\Newsletter\Model\Session

Sie müssen eine Abhängigkeit für die Sitzung erstellen, die Sie in Ihrem Block oder Controller oder was auch immer benötigen.
Nehmen wir zum Beispiel \Magento\Catalog\Model\Session.

protected $catalogSession;
public function __construct(
    ....
    \Magento\Catalog\Model\Session $catalogSession, 
    ....
){
    ....
    $this->catalogSession = $catalogSession;
    ....
}

Dann können Sie die Katalogsitzung in der Klasse wie folgt verwenden:

$this->catalogSession->setMyValue('test');
$this->catalogSession->getMyValue();

[BEARBEITEN]
Sie sollten keine Sitzungen in Vorlagen verwenden.
Sie sollten Wrapper in der Blockklasse erstellen, die die Vorlagen verwenden können, um Werte festzulegen / abzurufen.

Erstellen Sie anhand des obigen Beispiels die Methoden im Block

public function setSessionData($key, $value)
{
    return $this->catalogSession->setData($key, $value);
}

public function getSessionData($key, $remove = false)
{
    return $this->catalogSession->getData($key, $remove);
}

Wenn Sie die Sitzung jedoch wirklich in der Vorlage verwenden möchten, können Sie einfach einen Wrapper in Ihrem Block erstellen, um die Sitzung abzurufen:

public function getCatalogSession()
{
    return $this->catalogSession;
}

Dann können Sie dies in der Vorlage tun:

$this->getCatalogSession()->setMyValue('test');
$this->getCatalogSession()->getMyValue();

wie man Sitzung in der phtml Akte benutzt?
Rakesh Jesadiya

@ RakeshJesadiya. Siehe mein Update.
Marius

1
@Rechnung. Ich weiß nicht
Marius

1
@Marius Ich glaube, Sie haben vergessen zu erwähnen, wie Sie die Sitzungsvariable deaktivieren. Bitte kommentieren Sie diesbezüglich. Ist es ähnlich wie Magento 1.9.xx oder sonst?
Bhupendra Jadeja

2
Ja. Es ist wie in 1.9. Verwenden SieunsMyValue
Marius

7

Dies sind alle Sitzungstypen in Magento 2

1)  \Magento\Catalog\Model\Session //vendor/magento/module-catalog/Model/Session.php

2) \Magento\Newsletter\Model\Session //vendor/magento/module-newsletter/Model/Session.php

3) \Magento\Persistent\Model\Session //vendor/magento/module-persistent/Model/Session.php

4) \Magento\Customer\Model\Session //vendor/magento/module-customer/Model/Session.php

5) \Magento\Backend\Model\Session //vendor/magento/module-backend/Model/Session.php

6) \Magento\Checkout\Model\Session //vendor/magento/module-checkout/Model/Session.php

Gemäß dem Magento 2 ECGM2-Codierungsstandard verwenden Sie zuerst die Sitzungsklasse und können sie dann an den Konstruktor übergeben. Andernfalls wird dieser Fehler angezeigt

Das Sitzungsobjekt DARF NICHT im Konstruktor angefordert werden. Es kann nur als Methodenargument übergeben werden.

So können Sie Daten in einer Sitzung festlegen und abrufen

namespace vendor\module\..;

use Magento\Catalog\Model\Session as CatalogSession;
use Magento\Customer\Model\Session as CustomerSession;
use Magento\Checkout\Model\Session as CheckoutSession;
use \Magento\Framework\Session\SessionManagerInterface as CoreSession

class ClassName {
    ...

    protected $_coreSession;
    protected $_catalogSession;
    protected $_customerSession;
    protected $_checkoutSession;

    public function __construct(
        ....
        CoreSession $coreSession,
        CatalogSession $catalogSession,
        CustomerSession $customerSession,
        CheckoutSession $checkoutSession,
        ....
    ){
        ....
        $this->_coreSession = $coreSession;
        $this->_catalogSession = $catalogSession;
        $this->_checkoutSession = $checkoutSession;
        $this->_customerSession = $customerSession;

        ....
    }

    public function getCoreSession() 
    {
        return $this->_coreSession;
    }

    public function getCatalogSession() 
    {
        return $this->_catalogSession;
    }

    public function getCustomerSession() 
    {
        return $this->_customerSession;
    }

    public function getCheckoutSession() 
    {
        return $this->_checkoutSession;
    }
}

Wert einstellen

$this->getCustomerSession()->setMyValue('YourValue');

Wert bekommen

$this->getCustomerSession()->getMyValue();

Für nicht eingestellten Sitzungswert

$this->getCustomerSession()->unsMyValue();

@RobbieAverill Wenn Sie auf anderen Websites eine Lösung gefunden haben, die Sie hier auf StackOverflow teilen können, heißt das nicht "Copy Past". es heißt F & E. Verstehst du?
Prinz Patel

1
Das ist in Ordnung, aber Sie sollten Ihre Quellen
Robbie Averill

1
@ RobbieAverill, ja du hast recht. Vielen Dank für den Vorschlag. Ich habe meine Antwort aktualisiert.
Prinz Patel

Beim Verwenden einer customerSession wird eine Warnung angezeigt. "Das Sitzungsobjekt DARF NICHT im Konstruktor angefordert werden. Es kann nur als Methodenargument übergeben werden." Wie man es löst ?
Sanjay Gohil

1
@SanjayGohil überprüfe meine aktualisierte Antwort. "" Verwenden Sie zuerst die Session - Klasse und übergeben Sie sie an den Konstruktor, um diesen Fehler zu "" vermeiden. Das Session - Objekt DARF NICHT im Konstruktor angefordert werden. Es kann nur als Methodenargument übergeben werden "
Prince Patel
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.