Як встановити, витягнути та скасувати змінні сеансу в 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 \ Модель \ Сесія
  • \ Magento \ Каталог \ Модель \ Сесія
  • \ Magento \ Оформити замовлення \ Модель \ Сесія
  • \ Magento \ Замовник \ Модель \ Сесія
  • \ Magento \ Бюлетень \ Модель \ Сесія

1
Гарне пояснення!
Himmat Paliwal

@Sarfaraz, чи можемо ми встановити сеанс у контролері і ми можемо отримати доступ у файлі блоку?
jafar pinjar

Чи можемо ми встановити ціле значення? Я отримую нижче помилки, Об'єкт класу Magento \\ Framework \\ Сесія \\ Загальний \\ Перехоплювач не вдалося перетворити на рядок
jafar pinjar

57

У магенто 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();

[EDIT]
Не слід використовувати сеанси в шаблонах.
Ви повинні створити обгортки в блоковому класі, які шаблони можуть використовувати для встановлення / отримання значень.

Скориставшись наведеним вище прикладом, створіть методи в блоці

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
@Bill. Я не знаю
Маріус

1
@Marius Я думаю, ви забули згадати, як зняти змінну сесії. Тож прокоментуйте, будь ласка, щодо цього. Чи схожий він на Magento 1.9.xx або ще?
Bhupendra Jadeja

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

Для значення "Скинутий сеанс"

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

@RobbieAverill Якщо ви знайшли рішення з інших сайтів, ви можете поділитися тут на StackOverflow, який не називається копією минулого. це називається НДДКР. Чи ти розумієш?
Принц Патель

1
Це добре, але слід приписувати свої джерела, роблячи це
Роббі Аверилл

1
@RobbieAverill, так, ти маєш рацію. Дякую за пропозицію. Я оновив свою відповідь.
Принц Патель

Я отримую попередження під час використання замовника Сесія "Об'єкт сесії НЕ МОЖЕ бути запитуваний у конструкторі. Він може передаватися лише як аргумент методу." Як це вирішити?
Санджай Гохіль

1
@SanjayGohil перевірити мою оновлену відповідь. спочатку використовуйте клас сеансу та перейдіть у конструктор, щоб уникнути цієї помилки "" Об'єкт сесії НЕ МОЖЕТ бути запитуваний у конструкторі. Його можна передавати лише як аргумент методу "
Принц Патель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.