5

我有一个User对象,在成功进行身份验证后,它会被隐藏到会话中(没有安全信息),以便于调用并确定我们是否有经过身份验证的用户或匿名会话。用户可以通过多种途径更改他或她的部分或全部信息,我希望使该会话值保持最新。显而易见的答案是更新afterSave()回调中的值,但这当然违反了 MVC。

是否有另一种方法可以在一个地方捕获每一个变化,这样我就不必在整个地方丢弃会话写入?我什么都想不出来,也找不到其他的想法。我是唯一一个试图做这样的事情的人吗?

谢谢。

最终解决方案:坦率地说,我将 neilcrookes 的回复标记为答案,因为似乎没有更好的方法。不过,由于这种方式违反了我的强迫症感官,我选择了一条略有不同的道路。我决定让我的User::authenticate()方法将经过身份验证的用户对象返回给调用者,以便它可以对它做任何想做的事情。调用者“想要”做的一件事是在会话中删除该值。这是冗余,但非常非常有限。在我看来,这比从模型中访问会话感觉更好(尽管如果你这样做肯定是该死的,如果你不设想的话那是该死的)。

4

4 回答 4

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

And for the record, I do not agree with the answer of neilcrooks, but I will refrain from feeding the troll.

于 2009-06-09T07:46:34.637 回答
4

有些人可能不同意,但我会搞砸 MVC,在 Model::afterSave() 中执行它并使用 $_SESSION - 在写入之前测试会话,以防它没有启动,例如你在 shell 中保存模型或某物。

MVC 是一种通用模式 - 一种指导方针,您可以用头撞它,试图弄清楚如何实现不太合适的东西,或者只是用另一种方式去做,然后转向更重要的东西。

点燃火焰。

于 2009-06-08T19:45:38.417 回答
1

保存后

像这样使用

$this->Session->write('Auth.User.mmid', $kinde['Kindle']['id']);
于 2017-05-04T13:38:59.813 回答
-1

您应该能够只使用AppController创建必要的回调来使您的会话数据保持最新。因此,例如,您可以让您的User模型afterSave()设置一个名为changedtrue 的属性。然后在您AppController->afterFilter()检查该属性并根据需要更新会话数据。

或者,您可以编写一个组件来更新您的用户信息和会话数据。然后任何需要更改用户信息的控制器只需要包含该组件。

无需编写冗余代码或破坏 MVC。

于 2011-04-03T13:15:16.770 回答