Есть несколько подобных вопросов в 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);
Пользователь – это имя модели.