Comment définir, récupérer et annuler les variables de session dans Magento 2?


33

Quel est l'équivalent pour une session dans Magento 1

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

Pareil dans Magento 2?

Réponses:


20

J'ai trouvé le moyen équivalent pour cela dans Magento2:

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

Définir / Obtenir / Annuler la valeur dans la session 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();
}

De cette manière, nous pouvons définir des valeurs personnalisées si notre valeur de session n'est pas liée aux sessions ci-dessous:

  • \ Magento \ Backend \ Model \ Session
  • \ Magento \ Catalogue \ Modèle \ Session
  • \ Magento \ Checkout \ Model \ Session
  • \ Magento \ Client \ Modèle \ Session
  • \ Magento \ Newsletter \ Modèle \ Session

1
Belle explication!
Himmat Paliwal

@Sarfaraz, pouvons-nous définir une session dans le contrôleur et accéder au fichier bloc?
jafar pinjar le

pouvons-nous définir une valeur entière?, je reçois une erreur ci-dessous, objet de la classe Magento \\ Framework \\ Session \\ Le générique \\ Interceptor n'a pas pu être converti en chaîne
jafar pinjar

57

Dans magento 2, il n'y en a plus core/session.
Il y en a cependant (peut-être d'autres aussi):

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

Vous devez créer une dépendance pour la session dont vous avez besoin dans votre bloc, votre contrôleur ou autre.
Prenons par exemple \Magento\Catalog\Model\Session.

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

Vous pouvez ensuite utiliser la session de catalogue dans la classe comme ceci:

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

[EDIT]
Vous ne devriez pas utiliser de sessions dans des modèles.
Vous devez créer des wrappers dans la classe de bloc que les modèles peuvent utiliser pour définir / obtenir des valeurs.

En utilisant l'exemple ci-dessus, créez les méthodes dans le bloc

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

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

Mais si vous voulez vraiment utiliser la session dans le modèle, vous pouvez simplement créer un wrapper dans votre bloc pour obtenir la session:

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

Ensuite, vous pouvez le faire dans le modèle:

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

comment utiliser session en fichier phtml?
Rakesh Jesadiya

@RakeshJesadiya. Voir ma mise à jour.
Marius

1
@Facture. Je ne sais pas
Marius

1
@Marius Je pense que vous avez oublié de mentionner comment désélectionner la variable de session. Alors s'il vous plaît commenter à ce sujet. Est-ce similaire à Magento 1.9.xx ou autre?
Bhupendra Jadeja

2
Oui. C'est comme en 1.9. UtilisationunsMyValue
Marius

7

Ce sont tous les types de session dans 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

Conformément à la norme de codage Magento 2 ECGM2, vous utilisez d’abord la classe de session, puis vous pouvez la transmettre au constructeur, sinon cette erreur sera affichée.

L'objet de session NE DOIT PAS être demandé dans le constructeur. Il ne peut être passé que comme argument de méthode.

Voici comment vous pouvez définir et obtenir des données en session

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

Pour définir la valeur

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

Pour obtenir de la valeur

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

Pour la valeur de session non définie

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

@RobbieAverill Si vous avez trouvé une solution sur d'autres sites que vous pouvez partager ici sur StackOverflow, elle ne s'appelle pas copier-coller. ça s'appelle R & D. Comprenez vous?
Prince Patel

1
C'est bien, mais vous devriez attribuer vos sources pour cela.
Robbie Averill Le

1
@ BobieAverill, oui vous avez raison. Merci pour la suggestion. J'ai mis à jour ma réponse.
Prince Patel

Je reçois un avertissement lorsque j'utilise customerSession "L'objet de session NE DOIT PAS être demandé dans le constructeur. Il ne peut être passé qu'en tant qu'argument de méthode." Comment le résoudre ?
Sanjay Gohil

1
@SanjayGohil vérifier ma réponse mise à jour. utilisez d'abord la classe de session et passez-la dans le constructeur pour éviter cette erreur "" L'objet de session NE DOIT PAS être demandé dans le constructeur. Il ne peut être passé que comme argument de méthode "
Prince Patel le
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.