通过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请求将始终返回会话变量的内容(加上您正在查看的产品ID),但从不设置变量。如果我直接在同一浏览器中访问URL,则会显示内容,并更新会话变量。

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

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

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

更新

我开始认为这不是一个magento 2的问题,它更像是一个普通的会话/AAJAX问题。

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

进一步的测试得出结论,相同的会话ID已通过并正确使用。在使用SessionManager时,我直接在set方法之前调用了isSessionExists()。此方法返回true,它不仅检查有效的会话ID,还确认标头尚未发送。

我看不出为什么这可以直接在浏览器中工作,但不能通过AJAX。我会继续调查,除非有人发帖回答我可以试试。

第二次更新

在几次尝试让这个功能发挥作用失败后,我决定放弃这个功能,尝试不同的实现。在我的模块中,我没有在客户端使用cookie来记录产品视图,然后用PHP读取cookie。这非常有效。

我希望我在这里的调查能对将来的人有所帮助。