CakePHP: обновление переменной сеанса после сохранения

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

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

Спасибо.

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


person Rob Wilkerson    schedule 08.06.2009    source источник
comment
Почему использование данных сеанса в модели приводит к изменению MVC? Сессия — это просто еще один способ хранения данных. На самом деле, теоретически можно было бы перенастроить весь cakephp для доступа к данным из Session, а не из MySQL...   -  person Myer    schedule 10.12.2010


Ответы (4)


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

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

Зажгите пламя.

person neilcrookes    schedule 08.06.2009
comment
Согласованный. К черту пуристов, да здравствуют прагматики. - person brettkelly; 09.06.2009
comment
Согласен с ответом Нейлкрукса - person Travis Leleu; 09.06.2009

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

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

person Alexander Morland    schedule 09.06.2009
comment
ты совсем пишешь. но важна часть входа в систему Auth. - person Alexander Morland; 10.06.2009
comment
@ Александр Морланд, прочитайте вопрос - у него есть много путей (действий контроллера), где пользователь может обновить свои данные, и он хочет, чтобы данные, загруженные в сеанс при входе в систему, были актуальными с учетом этих изменений. Ваш ответ не отвечает на вопрос. - person neilcrookes; 10.06.2009
comment
конечно это. Auth::login включает в себя часть, где он записывает пользовательские данные в сеанс. - person Alexander Morland; 11.06.2009
comment
Правда, будет писать в сессию. Но разве вам не нужно скармливать ему пароль пользователя? Откуда вы собираетесь взять нехешированный пароль? - person Travis Leleu; 11.06.2009
comment
Алекс прав. Вы можете просто выполнить команду $this-›Auth-›login($this-›User-›id) после сохранения, так как все, что вам нужно для входа в систему вручную, — это его идентификатор, а cake прекрасно сохраняет его для вас. - person Jeff Ryan; 07.05.2013

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

Использовать как это

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

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

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

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

person Lèse majesté    schedule 03.04.2011