Сохранить идентификатор сеанса после входа в систему CakePHP

Есть несколько подобных вопросов в Stack Overflow, но никто не дает мне понять, как справиться с моей проблемой.

Я переношу свое приложение с CakePHP 1.3 на 2.x, и у меня есть проблема с тележкой. Мои пользователи могут добавлять товары в корзину, пока не регистрируются, и я объединять элементы своей корзины после входа в систему. В 1.3 это работает хорошо, потому что идентификатор сеанса не был изменен после входа в систему, но теперь эта функция нарушена, потому что идентификатор сеанса изменяется после входа пользователя в систему.

Есть ли способ оставить старый идентификатор сеанса после входа в систему или мне нужно что-то написать? Если да, то что может быть «лучшей практикой» здесь?

В настоящее время я сохраняю в user_id DB для аутентифицированных пользователей с их user_id и для анонимных пользователей с их session_id и после входа в систему я просто нахожу корзину по user_id и session_id , объединяю элементы и удаляю корзину с session_id но теперь это невозможно сделать из-за изменения session_id .

Если вы посмотрите в источнике AuthComponent, вы увидите, что это поведение по умолчанию в cake 2.x, чтобы предотвратить фиксацию сеанса. Я думаю, самым простым решением было бы прочитать ваши данные сеанса перед тем, как вы будете вызывать действие для входа в систему, а также при успешном создании или объединении данных в новый сеанс. Если вам нужно сохранить старый идентификатор сеанса, добавьте его в сеанс после входа в систему.

 if ($this->Session->check('Cart.session_id')) { $sessionId = $this->Session->read('Cart.session_id'); } else { $sessionId = session_id(); } $userId = $this->Session->read('Cart.user_id'); if ($this->Auth->login()) { // on successful login find your customer in DB and merge the session data like you did ... // in the case you need to keep the session_id for reference... $this->Session->write('Cart.session_id') = $sessionId; } 

Надеюсь, поможет…

update – если вы не можете использовать его, как я показал, даже более простой вариант заключается в том, чтобы сохранить session_id() внутри сеанса, в то же время, когда вы вставляете или обновляете данные заказа пользователя. Итак, просто этот фрагмент:

 if (!$this->Session->check('Cart.session_id')) { $this->Session->write('Cart.session_id', session_id()); } 

Эта информация будет работать до тех пор, пока сессия не будет отменена.

когда вы входите в журнал, вы создаете сеанс, поэтому для чтения данных из сеанса вы можете прочитать его следующим образом:

 $this->Session->read('Auth.User.user_id); 

Пользователь – это имя модели.