Magento 2 会话自行取消设置

Magento 2 session unsetting itself

我需要能够存储一些为自定义存在的自定义会话变量,无论它们是否登录,但由于某种原因,我的会话不断自我删除。

我已经使用 this 示例来帮助我添加我的会话代码。

这是我的代码

块文件

<?php

namespace MyVendor\MyModel\Block;

use Magento\Framework\View\Element\Template;

class ProductSearch extends Template {

    protected $_customSession;

    public function __construct(
        \Magento\Framework\View\Element\Template\Context $context,
        \Magento\Customer\Model\Session $customSession,
        array $data = []
    ){
        parent::__construct($context, $data);
        $this->_customSession = $customSession;
    }

    //Get the car model from the session
    public function getSessionCarModel(){
        return $this->_customSession->getCarModel();
    }

    //Unset the car model from the session
    public function unsetSessionCarModel(){
        return $this->_customSession->unsCarModel();
    }

}

这是我的模板文件的顶部,它在加载会话时对会话进行排序

productsearchbanner.phtml

<?php

    //If the user has selected a new model, unset our session then start a new one
    if(isset($_POST['modelSelect'])){
        //Unset the other sessions
        $block->unsetSessionCarModel();
        //Set the model session
        $block->setSessionCarModel($_POST['model']);
    }
    echo '<pre>';
    var_dump($_SESSION);
    echo '</pre>';
?>

代码的工作方式是,如果设置了 $_POST['modelSelect'],则用户来自模型 select 页面,因此我们需要再次启动流程并重置他们的会话, 但如果他们没有,会话应该保持不变。

我的问题是,当我来自模型 select 页面时,我的会话变量在 var 转储中显示没有问题,如下所示。

但是当我转到我网站上的任何其他页面(例如主页)然后返回产品搜索页面时,会话已清除?

我做错了什么?为什么每次加载页面时我的会话都会被清除?我只需要能够设置 $_SESSION['carModel'] 的等价物,并且它对于该用户是持久的,无论他们是否登录,或者他们去网站的哪个位置。

有人能给我指出正确的方向吗?

在块或模板文件中设置会话是一个问题。这是因为整页缓存。 Magento的执行周期随着FPC的开启而变化

控制器或模型是更新会话数据的最佳位置。

但是,如果您需要在模板/块中更新会话,则可以通过 AJAX 调用自定义操作并让它更新会话信息。 通常,在 Magento 2 中需要执行以下步骤:

  • 在现有模块或新模块中创建新的控制器/操作对,这将更新会话信息。理想情况下,该控制器应该只接受 AJAX 个请求。

  • 在容器 before_body_end 中呈现一个模板并在其中添加一些 jQuery 代码,这将查询控制器/操作对以更新会话信息。

这样,无论何时加载页面,它都会通过请求您的控制器/操作来触发会话更新(或者您可以让它在任何其他事件上触发,比如当用户单击某些内容时等),例如, /my-module/my-controller/my-session-updater-action.