如何在Magento 2中设置,检索和取消设置会话变量?


Answers:


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 \后端\模型\会话
  • \ Magento \ Catalog \ Model \ Session
  • \ Magento \ Checkout \ Model \ Session
  • \ Magento \ Customer \ Model \ Session
  • \ Magento \ Newsletter \ Model \ Session

1
很好的解释!
Himmat Paliwal '18

@Sarfaraz,我们可以在控制器中设置会话,也可以在块文件中访问吗?
Jafar Pinjar

我们可以设置整数值吗?,我得到以下错误,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文件中使用会话?
Rakesh Jesadiya

@RakeshJesadiya。查看我的更新。
马吕斯

1
@法案。我不知道
Marius

1
@Marius我想您忘记提及如何取消设置会话变量了。因此,请对此发表评论。与Magento 1.9.xx类似吗?
Bhupendra Jadeja 2015年

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上共享此解决方案,这不称为复制过去。这就是研发。你明白吗?
帕特尔王子(Patel Patel)

1
很好,但是您应该在这样做时
注明

1
@RobbieAverill,是的,你是对的。感谢您的建议。我更新了答案。
帕特尔王子(Patel Patel)

我在使用customerSession时收到警告,“不得在构造函数中请求会话对象。只能将其作为方法参数传递。” 怎么解决呢?
Sanjay Gohil

1
@SanjayGohil检查我更新的答案。首先使用会话类,并传入构造函数,以避免出现此错误“”绝不能在构造函数中请求会话对象。它只能作为方法参数传递”
Prince Patel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.