我正在编写一个Joomla插件,它基本上只是一个用CakePHP(版本3.3;目前不适合升级)的应用程序包装。我遇到了会话数据的各种问题。
第一个问题是Cake的Request
对象创建了一个Session
对象,这不允许PHP会话可能已经启动。在这种情况下会引发错误。 (我在Cake v3.6中看不到代码的这一部分。)
我对此的原始解决方案是让我的插件代码在启动Cake之前关闭Joomla会话,并让Cake用自己的cookie和会话表来做自己的事情。但是这样做会丢失代码运行后Joomla可能对其会话进行的任何更改,这是不理想的。
下一个尝试是稍微侵入Session
类(概念证明;如果可行,请进行适当的实现,而无需进行任何核心更改)以允许将_started
成员设置为{{1} },然后再启动调度程序。之所以可行,是因为Cake和Joomla数据现在一起保存在Joomla会话表中。
但是,Cake的会话数据包括true
,即当前登录的用户的记录。该记录包括类型为Auth.User
的对象。在将其写入会话后,在任何页面加载中,当Joomla加载会话时,该类都不可用(Cake的自动加载器尚未运行)。因此,这些字段以Cake\I18n\FrozenDate
的形式出现,这会破坏其他内容。
我目前的解决方案是在此时重新加载整个会话(__PHP_Incomplete_Class
),首先将Joomla对session_reset
所做的所有未提交的更改复制,然后在重置后恢复它们。
到目前为止,在有限的测试中,这似乎是可行的。但是我想知道我是否错过了一些明显的问题,或者明显更简单的解决方案。任何意见,建议或发人深省的问题都表示赞赏。 :-)
例如,在Joomla初始化会话之前,我是否有某种方法可以运行Cake的自动加载器,而无需完全破坏Joomla内核?那可能是一个更简单的解决方案。
如果一切顺利,我将做些什么使代码可用。