在 AJAX 上设置 Magento 2 会话变量

Set Magento 2 session variable over AJAX

我目前正在编写一个 Magento 2 模块,它要求我记录客户操作,例如产品视图。需要为登录客户和来宾客户添加此操作。我的解决方案是在会话中为所有产品 ID 的客户使用自定义变量(数组)。

为了绕过整页缓存,我实施了一个前端 ajax 请求来记录产品浏览量。

我有一个控制器,访问时会在会话中保存产品 ID。当我直接访问 URL 时,这按预期工作,但是,当通过 AJAX 请求访问时,会话变量的保存不起作用。

我花了几个小时尝试调试它,我一直在输出会话变量的内容,当使用 AJAX 访问时,我可以看到内容,只是从未更新过。

```

public function setGuestCustomerProductView($productId)
{
    $guestProductViews = $this->_sessionManager->getGuestProductViews();
    $guestProductViews[] = $productId;

    $this->_sessionManager->setGuestProductViews($guestProductViews);

    return $guestProductViews;
}

```

AJAX 请求将始终 return 会话变量的内容(加上您正在查看的产品 ID),但从不设置变量。如果我在同一浏览器中直接访问 URL,则会显示内容并更新会话变量。

进一步的 AJAX 请求显示来自直接 URL 请求的新会话变量数据。

我是否对会话和 AJAX 请求有误解?域相同,因此不存在跨域问题。

如有任何帮助,我们将不胜感激。

更新

我开始认为这不是 magento 2 的问题,它更像是一个普遍的 Session/AJAX 问题。

我决定测试一个理论并关闭 SessionManager 并使用 PHP 的 $_SESSION 全局变量。这导致了同样的问题,所以问题不是处理程序。

进一步的测试得出相同的 session ID 被正确传递和使用的结论。在使用 SessionManager 时,我直接在 set 方法之前调用了 isSessionExists() 。此方法返回 true,它不仅检查有效的 session ID,而且确认 headers 尚未发送。

我看不出为什么这可以直接在浏览器中运行但不能在 AJAX 上运行。我将继续调查,除非有人发帖并回答我可以尝试。

第二次更新

在多次尝试使该功能发挥作用但均失败后,我决定放弃该功能并尝试其他实现方式。在我的模块中,我没有在客户端使用 cookie 来记录产品视图,然后在 PHP 中读取 cookie。这非常有效。

我希望我在这里的调查对以后的人有所帮助。