ТортPHP:Обновление переменной сеанса после сохранения

StackOverflow https://stackoverflow.com/questions/965815

Вопрос

у меня есть User объект, который после успешной аутентификации добавляется в сеанс (без информации о безопасности) для быстрого вызова и определения того, есть ли у нас аутентифицированный пользователь или анонимный сеанс.Существует несколько способов, с помощью которых пользователь может изменить часть или всю свою информацию, и я хотел бы поддерживать это значение сеанса в актуальном состоянии.Очевидный ответ — обновить значение в afterSave() обратный вызов, но это, конечно, нарушает MVC.

Есть ли другой способ фиксировать все изменения в одном месте, чтобы мне не приходилось отбрасывать записи сеансов повсюду?Я ничего не могу придумать и не смог найти никаких других идей.Я единственный, кто пытается сделать что-то подобное?

Спасибо.

Окончательное решение:Честно говоря, я отметил ответ Нилкрукса как ответ, потому что лучшего способа, похоже, не существует.Однако, поскольку этот путь нарушает мои чувства ОКР, я пошел немного другим путем.Я решил иметь свой User::authenticate() метод возвращает объект аутентифицированного пользователя вызывающему объекту, чтобы он мог делать с ним все, что захочет.Одна из вещей, которую «хотят» сделать вызывающие стороны, — это удалить это значение в сеансе.Это избыточность, но она очень и очень ограничена.На мой взгляд, это было лучше, чем доступ к сеансу из модели (хотя это, конечно, черт возьми, если вы это сделаете, черт возьми, если вы не создадите сценарий).

Это было полезно?

Решение

Некоторые могут не согласиться, но я бы прикрутил MVC, сделал это в Model::afterSave() и использовал $_SESSION — проверьте сеанс перед записью в него, на случай, если он не запущен, например, вы сохраняете модель в оболочке или что-нибудь.

MVC — это общий шаблон, ориентир, вы можете биться о него головой, пытаясь понять, как добиться чего-то, что не совсем подходит, или просто сделать это по-другому и перейти к чему-то более важному.

Поднимите пламя.

Другие советы

//in users controller 
if ($this->User->save()) {
    $this->Auth->login($this->User->read());
    $this->Session->setFlash[.. etc]

И к сведению, я не согласен с ответом НилКрука, но от кормить тролля воздержусь.

после сохранения

Используйте вот так

$this->Session->write('Auth.User.mmid', $kinde['Kindle']['id']);

Вы должны иметь возможность просто использовать AppController для создания необходимых обратных вызовов, которые поддерживают актуальность данных вашего сеанса.Так, например, вы можете иметь свой User модель afterSave() установить свойство под названием changed к истине.Тогда в твоем AppController->afterFilter() вы проверяете это свойство и при необходимости обновляете данные сеанса.

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

Нет необходимости писать лишний код или ломать MVC.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top