Как установить, получить и сбросить переменные сеанса в Magento 2?

33

Что является эквивалентом для сессии в Magento 1

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

То же самое в Magento 2?

Ракеш Джесадия
источник

Ответы:

20

Я нашел эквивалентный способ для этого в Magento2:

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

Установить / Получить / Сбросить значение в основной сессии:

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

Таким образом, мы можем установить пользовательские значения, если наше значение сеанса не относится к следующим сеансам:

  • \ Magento \ Backend \ Model \ Session
  • \ Magento \ Каталог \ Model \ Session
  • \ Magento \ Checkout \ Model \ Session
  • \ Magento \ Customer \ Model \ Session
  • \ Magento \ Newsletter \ Model \ Session
Сарфараз бхеда
источник
1
Хорошее объяснение!
Химмат Паливал
@Sarfaraz, мы можем установить сессию в контроллере и получить доступ к файлу блока?
Джафар Пинджар
мы можем установить целочисленное значение ?, я получаю ошибку ниже, объект класса Magento \\ Framework \\ Session \\ Generic \\ Interceptor не может быть преобразован в строку
jafar pinjar
57

В magento 2 больше нет core/session.
Есть такие (хотя могут быть и другие):

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

Вам нужно создать зависимость для сеанса, который вам нужен, в вашем блоке, контроллере или чем-то еще.
Давайте возьмем для примера \Magento\Catalog\Model\Session.

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

Затем вы можете использовать сеанс каталога внутри класса следующим образом:

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

[РЕДАКТИРОВАТЬ]
Вы не должны использовать сессии в шаблонах.
Вы должны создать оболочки в классе блоков, которые шаблоны могут использовать для установки / получения значений.

Используя приведенный выше пример, создайте методы в блоке

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

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

Но если вы действительно хотите использовать сеанс в шаблоне, вы можете просто создать оболочку в своем блоке для получения сеанса:

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

Тогда вы можете сделать это в шаблоне:

$this->getCatalogSession()->setMyValue('test');
$this->getCatalogSession()->getMyValue();
Мариус
источник
Как использовать сессию в файле phtml?
Ракеш Джесадия
@RakeshJesadiya. Смотрите мое обновление.
Мариус
1
@Билл. Я не знаю
Мариус
1
@Marius Я думаю, что вы забыли упомянуть, как сбросить переменную сеанса. Поэтому, пожалуйста, прокомментируйте это. Это похоже на Magento 1.9.xx или еще?
Бхупендра Джадеджа
2
Ага. Это как в 1.9. ИспользованиеunsMyValue
Мариус
7

Это все типы сессий в 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

В соответствии со стандартом кодирования Magento 2 ECGM2 вы сначала используете класс сеанса, а затем можете передать его в конструктор, в противном случае будет показана эта ошибка.

Объект сеанса НЕ ДОЛЖЕН запрашиваться в конструкторе. Он может быть передан только в качестве аргумента метода.

Вот как вы можете установить и получить данные в сессии

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

Установить значение

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

Чтобы получить значение

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

Для значения Unset session

$this->getCustomerSession()->unsMyValue();
Принц Патель
источник
@RobbieAverill Если вы нашли какое-либо решение на других сайтах, вы можете поделиться здесь в StackOverflow, которое не называется копированием в прошлом. это называется НИОКР. Ты понимаешь?
Принц Патель
1
Это хорошо, но вы должны приписать свои источники при этом
Робби Аверилл
1
@RobbieAverill, да, ты прав. Спасибо за предложение. Я обновил свой ответ.
Принц Патель
Я получаю предупреждение при использовании customerSession: «НЕОБХОДИМО, чтобы объект Session запрашивался в конструкторе. Его можно передавать только в качестве аргумента метода». Как это решить?
Санджай Гохил
1
@SanjayGohil проверьте мой обновленный ответ. сначала используйте класс сеанса и перейдите в конструктор, чтобы избежать этой ошибки. "" Объект сеанса НЕ ДОЛЖЕН запрашиваться в конструкторе. Он может быть передан только в качестве аргумента метода »
принц Патель