Php 通过AJAX设置Magento 2会话变量

Php 通过AJAX设置Magento 2会话变量,php,ajax,session,magento2,Php,Ajax,Session,Magento2,我目前正在编写一个Magento 2模块,该模块要求我记录客户操作,如产品视图。需要为登录客户和来宾客户添加此操作。我的解决方案是在会话中为所有产品ID的客户使用自定义变量(数组) 为了绕过整页缓存,我实现了一个前端ajax请求来记录产品视图 我有一个控制器,当访问它时,它将在会话中保存产品ID。当我直接访问URL时,这与预期一样有效,但是,当通过AJAX请求访问URL时,保存会话变量不起作用 我花了几个小时试图调试它,我一直在输出会话变量的内容,当使用AJAX访问时,我可以看到内容,只是从来没

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

为了绕过整页缓存,我实现了一个前端ajax请求来记录产品视图

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

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

```

```

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

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

关于会话和AJAX请求,我是否误解了什么?域是相同的,因此没有跨域问题


任何帮助都将不胜感激。

更新

我开始认为这不是magento 2的问题,而是一般会话/AJAX的问题

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

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

我看不出为什么它直接在浏览器中工作,而不是在AJAX上工作。我会继续调查,除非有人发帖回答我可以试试

第二次更新

在多次尝试使该功能正常工作失败后,我决定放弃该功能并尝试其他实现。在我的模块中,我没有在客户端使用cookies来记录产品视图,然后用PHP读取cookie。这很好用


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

为了确认,您已经将
\Magento\Backend\Model\Auth\Session
类注入了类的$\u sessionManager属性?可以调用
$this->\u sessionManager->start()
在您的方法开始时?我正在将
\Magento\Framework\Session\SessionManager
注入
$\u SessionManager
中,并尝试添加
$this->\u SessionManager->start()但也没有运气。奇怪的是,当直接查看页面时,这种方式有效。它只是通过AJAX调用出现问题。我添加了另一个
$guestProductViews=$this->\u sessionManager->getGuestProductViews()。它似乎没有为下一个请求保留它们。这听起来确实像是一个跨域访问问题。。。调用页面和ajax url上的完整主机名是否相同?你用的是GET还是POST?是的,两者的主机名都一样。ajax url是通过Magento中的baseUrl帮助程序生成的。我正在使用GET请求。如果我获取AJAX请求中使用的URL,并在新选项卡中直接查看该URL,则一切正常。
public function setGuestCustomerProductView($productId)
{
    $guestProductViews = $this->_sessionManager->getGuestProductViews();
    $guestProductViews[] = $productId;

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

    return $guestProductViews;
}