Я пишу плагин для Joomla, который по сути является просто оберткой вокруг приложения, написанного на CakePHP (версия 3.3; не в состоянии улучшить это в настоящий момент).Я сталкиваюсь с различными проблемами с данными сеанса.
Первая проблема заключается в том, что объект Request
в Cake создает объект Session
, который не допускает вероятность того, что сеанс PHP уже может быть запущен;в этом случае выдает ошибку.(Я не вижу изменений в этой области кода в Cake v3.6.)
Моим первоначальным решением этого было сделать так, чтобы мой код плагина закрывал сессию Joomla перед запуском Cake, и позволил Cake сделать свой собственныйвещь со своим собственным cookie и сессионным столом.Но, делая это, я теряю любые изменения, которые Joomla может внести в свою сессию после выполнения моего кода, что не идеально.
Следующая попытка состояла в том, чтобы слегка взломать класс Session
(подтверждение концепции;реализация должна быть сделана без каких-либо изменений ядра, если она работает), чтобы разрешить установку элемента _started
равным true
перед запуском диспетчера.Это работает, поскольку данные Cake и Joomla теперь сохраняются вместе в таблице сеансов Joomla.
Однако данные сеанса Cake включают в себя Auth.User
, запись пользователя, вошедшего в систему в данный момент. Эта запись включает объекты типаCake\I18n\FrozenDate
.На любой странице загрузки после того, как это было записано в сеанс, этот класс еще не доступен (автозагрузчик Cake не запускался), когда Joomla загружает сеанс.Таким образом, эти поля появляются как __PHP_Incomplete_Class
, что затем нарушает другие вещи.
Мое текущее решение этого вопроса - перезагрузить весь сеанс в этот момент (session_reset
), сначала скопировав все незафиксированные изменения, внесенные Joomla.до $_SESSION
, затем восстанавливая их после сброса.
В ограниченном тестировании пока это работает.Но мне интересно, пропустил ли я какую-то очевидную проблему или очевидное более простое решение.Любые комментарии, предложения или заставляющие задуматься вопросы высоко ценится.: -)
Например, есть ли какой-нибудь способ запустить автозагрузчик Cake до того, как Joomla инициализирует сессию, вообще не взломав ядро Joomla?Это может быть более простое решение.
Если все получится, я посмотрю, что можно сделать, чтобы сделать код доступным.