¿Cómo establecer, recuperar y desarmar variables de sesión en Magento 2?

33

¿Cuál es el equivalente para la sesión en Magento 1

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

¿Lo mismo en Magento 2?

Rakesh Jesadiya
fuente

Respuestas:

20

Encontré la forma equivalente de esto en Magento2:

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

Establecer / Obtener / Desarmar valor en la sesión principal:

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 esta manera, podemos establecer valores personalizados si nuestro valor de sesión no está relacionado con las siguientes sesiones:

  • \ Magento \ Backend \ Model \ Session
  • \ Magento \ Catálogo \ Modelo \ Sesión
  • \ Magento \ Checkout \ Modelo \ Sesión
  • \ Magento \ Cliente \ Modelo \ Sesión
  • \ Magento \ Newsletter \ Model \ Session
Sarfaraz Bheda
fuente
1
Buena explicación!
Himmat Paliwal
@Sarfaraz, ¿podemos configurar la sesión en el controlador y podemos acceder en el archivo de bloque?
Jafar pinjar
¿podemos establecer un valor entero ?, obtengo un error por debajo, el objeto de la clase Magento \\ Framework \\ Session \\ Generic \\ Interceptor no se pudo convertir en cadena
jafar pinjar
57

En magento 2 no hay más core/session.
Sin embargo, existen estos (pueden ser otros también):

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

Debe crear una dependencia para la sesión que necesita en su bloque o controlador o lo que sea.
Tomemos por ejemplo \Magento\Catalog\Model\Session.

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

Luego puede usar la sesión de catálogo dentro de la clase de esta manera:

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

[EDITAR]
No debes usar sesiones en plantillas.
Debe crear contenedores en la clase de bloque que las plantillas pueden usar para establecer / obtener valores.

Usando el ejemplo anterior, cree los métodos en el bloque

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

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

Pero si realmente desea utilizar la sesión en la plantilla, puede crear un contenedor en su bloque para obtener la sesión:

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

Entonces puedes hacer esto en la plantilla:

$this->getCatalogSession()->setMyValue('test');
$this->getCatalogSession()->getMyValue();
Marius
fuente
¿Cómo usar la sesión en el archivo phtml?
Rakesh Jesadiya
@RakeshJesadiya. Mira mi actualización.
Marius
1
@Cuenta. No lo sé
Marius
1
@ Mario Creo que olvidó mencionar cómo desarmar la variable de sesión. Así que por favor comente al respecto. ¿Es similar a Magento 1.9.xx o de lo contrario?
Bhupendra Jadeja
2
Sí. Es como en 1.9. UsounsMyValue
Marius
7

Estos son todos los tipos de sesión en 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

Según el estándar de codificación Magento 2 ECGM2, primero usa la clase de sesión y luego puede pasarlo al constructor; de lo contrario, se mostrará este error

El objeto de sesión NO DEBE solicitarse en el constructor. Solo se puede pasar como argumento de método.

Así es como puede configurar y obtener datos en la sesión

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

Para establecer el valor

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

Para obtener valor

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

Para valor de sesión no establecido

$this->getCustomerSession()->unsMyValue();
Príncipe Patel
fuente
@RobbieAverill Si encontró alguna solución de otros sitios, puede compartirla aquí en StackOverflow que no se llama copiar pasado. Se llama I + D. ¿Lo entiendes?
Príncipe Patel
1
Está bien, pero debe atribuir sus fuentes al hacerlo
Robbie Averill
1
@RobbieAverill, sí, tienes razón. Gracias por la sugerencia. Actualicé mi respuesta.
Prince Patel
Recibo una advertencia mientras uso una sesión de cliente "El objeto de sesión NO DEBE solicitarse en el constructor. Solo se puede pasar como un argumento de método". Cómo resolverlo ?
Sanjay Gohil
1
@SanjayGohil revisa mi respuesta actualizada. primero use la clase de sesión y pase al constructor para evitar este error "" El objeto de sesión NO DEBE solicitarse en el constructor. Solo se puede pasar como un argumento de método "
Prince Patel