CakePHP:保存后更新会话变量

时间:2009-06-08 16:39:50

标签: cakephp session-variables reset

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

是否有另一种方法可以捕获一个地方的每个更改,以便我不必在整个地方删除会话写入?我想不出任何事情,也没有找到任何其他想法。我是唯一一个试图做这样事的人吗?

感谢。

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

4 个答案:

答案 0 :(得分:8)

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

记录中,我不同意neilcrooks的答案,但我不会给这个巨魔喂食。

答案 1 :(得分:4)

有些人可能不同意但是我已经搞了MVC,在Model :: afterSave()中执行它并在写入之前使用$ _SESSION - test进行会话,以防它没有启动,例如你在保存模型中贝壳什么的。

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

带上火焰。

答案 2 :(得分:1)

保存后

像这样使用

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

答案 3 :(得分:-1)

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

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

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