Как хранить объекты в Session (Codeigniter) - PullRequest
3 голосов
/ 19 февраля 2012

Ситуация: Кажется невозможным хранить какие-либо объекты в CI_Session, поскольку их чтение приводит к исключениям PHP_Incomplete_Object, так как сеанс всегда запускается перед загрузкой моделей.Таким образом, даже при автоматической загрузке объекта типа я никогда не смогу прочитать данные из сеанса.

Я также пытался использовать «собственный сеанс», но там точно такая же проблема.

Кроме того, я попытался сохранить сериализованный объект, но при десериализации после того, как все модели загружены, он все еще становится объектом с типом "__PHP_Incomplete_Class".

Кто-нибудь знает обходной путь?И, пожалуйста, оставьте ответы «зачем вам объект в сессии».Видел достаточно тех ...

Ответы [ 3 ]

4 голосов
/ 19 февраля 2012

К сожалению, php не позволяет сериализовать ссылки на один объект из другого. Вот почему, когда вы восстанавливаете ваш объект, он не содержит данных, с которых он начал.

Лучшее решение, которое я нашел, - это создание объекта Session в слое моей модели, который восстанавливается с помощью cookie. Таблица сеансов в вашей базе данных обрабатывает ссылки на объекты, которые в противном случае вы бы сериализовали. Как только ваша модель сеанса загружена, вы можете использовать ее для загрузки «сохраненных в сеансе» объектов, охотно или лениво.

Кроме того, если эти объекты содержат ссылки на другие объекты модели, вы можете использовать тот же принцип для обхода остальной части уровня модели на основе реляционных ссылок. Это может показаться пугающим, но есть ряд ORM, которые вы могли бы проверить, если вам неудобно внедрять их самостоятельно.

0 голосов
/ 11 августа 2015

Единственное решение, которое я нашел до сих пор, - это иметь класс вместе с контроллером (вместо того, чтобы разделять его как библиотеку).

Не очень стильный, но по какой-то причине он работает, в то время как экземпляр библиотеки CI не будет.в папке 'библиотеки', но загрузите его с классическим require_once вместо $ this-> load-> library ('Game'), который является типом объекта, который сеанс не может обработать.

require_once(APPPATH . 'libraries/Game.php');

class Main extends CI_Controller {
   ...
}
0 голосов
/ 04 августа 2014

Другой вариант, который я нашел, заключается в том, что вы можете сохранить свой объект в виде значений массива сеанса:

Вы можете сохранить его следующим образом:

$this->session->set_userdata($yourObject);

Доступ так:

$this->session->userdata['property name of your object'];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...