Symfony2: Как сохранить атрибут сеанса в качестве настраиваемого поля в БД с помощью настраиваемого PdoSessionStorage?

У меня есть собственный класс, расширяющий PdoSessionStorage, но я не знаю, как уловить атрибуты из сеанса, чтобы сохранить их как независимые поля в базе данных.

Другая возможность заключается в несериализации данных сеанса в методе sessionWrite ($ if, $ data) моего пользовательского класса PdoSessionStorage. Но я не знаю, как unserialize строку данных, чтобы получить только данные, которые я хочу.

Я попробовал это:

unserialize($data); 

и это бросит мне следующую ошибку:

Неустранимая ошибка: исключить исключение «ErrorException» с сообщением «Notice: unserialize () [function.unserialize]: ошибка со смещением 0 из 82 байтов в /myserver/myapp/src/app/myBundle/myCustomPdoSessionStorage.php строка 220 'в / myserver /myapp/vendor/symfony/src/Symfony/Component/HttpKernel/Debug/ErrorHandler.php:65 Трассировка стека: # 0 [внутренняя функция]: Symfony \ Component \ HttpKernel \ Debug \ ErrorHandler-> handle (8, 'unserialize ( ) [… ',' / Applications / M … ', 220, Array) # 1 /myserver/myapp/src/app/myBundle/myCustomPdoSessionStorage.php(220): unserialize (' _ symfony2 | a: 3: {… ') # 2 [внутренняя функция]: app / myBundle / myCustomPdoSessionStorage-> sessionWrite (' 72b823b39d316dd … ',' _symfony2 | a: 3: {… ') # 3 {main} throw in / myserver / myapp / vendor / symfony / src / Symfony / Component / HttpKernel / Debug / ErrorHandler.php в строке 65

Кто-нибудь может мне помочь?

Solutions Collecting From Web of "Symfony2: Как сохранить атрибут сеанса в качестве настраиваемого поля в БД с помощью настраиваемого PdoSessionStorage?"

Здесь вы используете неправильную функцию. unserialize – для сериализованных значений, но не для сеансов. Даже те два близки друг к другу, они разные.

Вместо этого вы можете искать функцию session_decode . Позаботьтесь о том, чтобы он не выполнял сериализацию в суперглобальной системе $_SESSION поэтому вы можете ее обернуть:

 function unserialize_session($data) { $hasBuffer = isset($_SESSION); $hasBuffer && $buffer = $_SESSION; session_decode($data); $session = $_SESSION; $hasBuffer ? $_SESSION = $buffer : unset($_SESSION); return $session; } 

Аналогичным является session_encode которая работает аналогично.

См. Также: Как несериализировать данные сеанса в пользовательском обработчике

Я нашел его!

Мой класс CustomPdoSessionStorage расширяет NativeSessionStorage , который управляет массивом $_SESSION (чтение, запись и т. Д.).

Итак, из моего класса я могу использовать $this->read('userId') и хранить его на моей БД.

Так что спасибо большое @hakre