我写了一个magento控制器,它在客户会话中存储了一些过滤器信息。
根据magento 2文档,我使用依赖注入让magento为我生成会话对象:
/**
* @var \Magento\Catalog\Model\Session
*/
protected $_filterSession;
/**
* @param \Magento\Customer\Model\Session $filterSession
*/
public function __construct( \Magento\Customer\Model\Session $filterSession)
{
$this->_filterSession = $filterSession;
}
注射过程运作良好。我能够访问会话,在其中存储变量并在进一步调用时返回它。
但magento似乎不时丢弃整个会话信息。我无法准确地确定magento丢弃信息的那一刻,它似乎是随机的。
以下是代码:
$this->_filterSession->setFrequency($frequency);
$frequency = $this->_filterSession->getFrequency();
我尝试了不同的会话范围,但行为是一样的。
经过多次尝试后,我尝试使用PHP会话来存储信息,但即使这个会话也不时被丢弃。
我不知道我做错了什么,或者这可能是造成这种奇怪行为的原因。是否有其他人有类似的问题或想法是什么原因?
提前致谢, 托马斯
答案 0 :(得分:2)
这通常在浏览器丢失会话cookie时发生。在变量丢失时,应检查会话期间域名是否更改。或者使用其他浏览器。可能是一些行为不端的浏览器插件。或者一些Magento扩展。许多Mageno 2扩展目前编写得很糟糕。
答案 1 :(得分:2)
我在使用PHP时遇到了类似的问题。我设置了session.referer_check
。因此,当用户来自外部页面时,会话丢失。如果这是您的问题,只需ini_set('session.referer_check', '');
。
答案 2 :(得分:0)
我没有找到问题本身的解决方案,但避免了它。
对于那些也遇到问题的人,这是我的绑带修复:
我介绍了一个新的cookie
public function getFrequency()
{
$frequency = $this->_cookieManager->getCookie(self::FREQUENCY_SESSION_KEY);
if( !isset( $frequency ) )
{
$frequency = self::FREQUENCY_DEFAULT_VALUE;
}
return $frequency;
}
public function setFrequency( $frequency )
{
$metadata = $this->_cookieMetadataFactory
->createPublicCookieMetadata()
->setPath($this->_sessionManager->getCookiePath())
->setDomain($this->_sessionManager->getCookieDomain());
$this->_cookieManager->setPublicCookie(
self::FREQUENCY_SESSION_KEY,
$frequency,
$metadata
);
}
有关详细信息,我建议您查看此thread。
问候,托马斯