Come impostare, recuperare e annullare l'impostazione delle variabili di sessione in Magento 2?


33

Qual è l'equivalente per la sessione in Magento 1

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

Lo stesso in Magento 2?

Risposte:


20

Ho trovato il modo equivalente per questo in Magento2:

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

Imposta / Ottieni / Annulla valore nella sessione principale:

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

In questo modo possiamo impostare valori personalizzati se il nostro valore di sessione non è correlato alle sessioni seguenti:

  • \ Magento \ backend \ modello \ Session
  • \ Magento \ Catalog \ modello \ Session
  • \ Magento \ Checkout \ modello \ Session
  • \ Magento \ clienti \ modello \ Session
  • \ Magento \ Newsletter \ modello \ Session

1
Bella spiegazione!
Himmat Paliwal,

@Sarfaraz, possiamo impostare la sessione nel controller e possiamo accedere al file di blocco?
jafar pinjar,

possiamo impostare il valore intero ?, sto ottenendo un errore inferiore, Oggetto della classe Magento \\ Framework \\ Session \\ Generic \\ Interceptor non può essere convertito in stringa
jafar pinjar

57

In magento 2 non c'è più core/session.
Ce ne sono però (potrebbero essercene anche altri):

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

Devi creare una dipendenza per la sessione di cui hai bisogno nel tuo blocco o controller o altro.
Prendiamo ad esempio \Magento\Catalog\Model\Session.

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

Quindi puoi utilizzare la sessione del catalogo all'interno della classe in questo modo:

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

[EDIT]
Non utilizzare sessioni nei modelli.
È necessario creare wrapper nella classe di blocco che i modelli possono utilizzare per impostare / ottenere valori.

Usando l'esempio sopra, crea i metodi nel blocco

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

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

Ma se vuoi davvero usare la sessione nel modello puoi semplicemente creare un wrapper nel tuo blocco per ottenere la sessione:

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

Quindi puoi farlo nel modello:

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

come utilizzare la sessione nel file phtml?
Rakesh Jesadiya,

@RakeshJesadiya. Vedi il mio aggiornamento
Marius

1
@Conto. Non lo so
Marius

1
@Marius Penso che ti sia dimenticato di menzionare come annullare la variabile di sessione. Quindi, per favore, commenta al riguardo. È simile Magento 1.9.xx o altro?
Bhupendra Jadeja,

2
Sì. È come in 1.9. UsaunsMyValue
Marius

7

Questi sono tutti tipi di sessione 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

Secondo lo standard di codifica ECGM2 Magento 2, per prima cosa usi la classe di sessione, quindi puoi passarla al costruttore, altrimenti verrà mostrato questo errore

L'oggetto sessione NON DEVE essere richiesto nel costruttore. Può essere passato solo come argomento del metodo.

Ecco come è possibile impostare e ottenere dati in sessione

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

Per impostare il valore

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

Per ottenere valore

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

Per valore di sessione non impostato

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

@RobbieAverill Se hai trovato una soluzione da altri siti, puoi condividere qui su StackOverflow che non si chiama copia passata. si chiama R&S. Capisci?
Prince Patel,

1
Va bene, ma dovresti attribuire le tue fonti quando lo fai
Robbie Averill il

1
@RobbieAverill, Sì, hai ragione. Grazie per il suggerimento Ho aggiornato la mia risposta.
Prince Patel,

Ricevo un avviso mentre uso un customerSession "L'oggetto Session NON DEVE essere richiesto nel costruttore. Può essere passato solo come argomento del metodo." Come risolverlo?
Sanjay Gohil,

1
@SanjayGohil controlla la mia risposta aggiornata. utilizzare innanzitutto la classe di sessione e passare al costruttore per evitare questo errore "" L'oggetto SESSIONE NON DEVE essere richiesto nel costruttore. Può essere passato solo come argomento di metodo "
Prince Patel,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.