ТортPHP:Обновление переменной сеанса после сохранения
-
12-09-2019 - |
Вопрос
у меня есть 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.