CakePHP: обновление переменной сеанса после сохранения - PullRequest
4 голосов
/ 08 июня 2009

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

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

Спасибо.

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

Ответы [ 4 ]

8 голосов
/ 09 июня 2009
//in users controller 
if ($this->User->save()) {
    $this->Auth->login($this->User->read());
    $this->Session->setFlash[.. etc]

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

4 голосов
/ 08 июня 2009

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

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

Подними огонь.

1 голос
/ 04 мая 2017

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

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

$this->Session->write('Auth.User.mmid', $kinde['Kindle']['id']);
0 голосов
/ 03 апреля 2011

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

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

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

...