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?

Rakesh Jesadiya
quelle

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
Sarfaraz Bheda
quelle
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();
Marius
quelle
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();
Prinz Patel
quelle
@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