Joomla组件内的CakePHP会话

时间:2018-09-15 00:44:27

标签: joomla session-state cakephp-3.x

我正在编写一个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内核?那可能是一个更简单的解决方案。

如果一切顺利,我将做些什么使代码可用。

0 个答案:

没有答案