【问题标题】:CakePHP: Updating a session variable after saveCakePHP:保存后更新会话变量
【发布时间】:2009-06-08 16:39:49
【问题描述】:

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

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

谢谢。

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

【问题讨论】:

  • 为什么在 Model 中使用 Session 数据会增加 MVC?会话只是另一种存储数据的方式。事实上,理论上可以对所有 cakephp 进行重组以从 Session 而不是 MySQL 访问数据...

标签: cakephp session-variables reset


【解决方案1】:
//in users controller 
if ($this->User->save()) {
    $this->Auth->login($this->User->read());
    $this->Session->setFlash[.. etc]

为了记录,我不同意 neilcrooks 的回答,但我不会喂巨魔。

【讨论】:

  • 你写的真好。但重要的是 Auth 登录部分。
  • @Alexander Morland,阅读问题 - 他有很多路径(控制器操作),用户可以在其中更新他们的详细信息,并且他希望保留在登录时加载到会话中的数据,up-迄今为止,这些变化。您的回复没有回答问题。
  • 肯定是这样。 Auth::login 包括将用户数据写入会话的部分
  • 没错,它会写入会话。但是您不需要向它提供用户密码吗?您将从哪里获得未散列的密码?
  • 亚历克斯是正确的。您可以在保存后执行 $this->Auth->login($this->User->id) ,因为您需要手动登录某人的只是他们的 id,并且 cake 可以很好地为您保存。
【解决方案2】:

有些人可能不同意,但我会搞砸 MVC,在 Model::afterSave() 中执行它并使用 $_SESSION - 在写入之前测试会话,以防它没有启动,例如您正在针对模型保存贝壳什么的。

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

点燃火焰。

【讨论】:

  • 同意。搞砸纯粹主义者,实用主义者万岁。
  • 同意尼尔克鲁克斯的回答
【解决方案3】:

保存后

这样使用

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-23
      • 2012-05-17
      • 1970-01-01
      • 1970-01-01
      • 2016-01-20
      • 1970-01-01
      • 2011-12-08
      • 2012-11-17
      相关资源
      最近更新 更多