我有一个User
对象,在成功进行身份验证后,会隐藏在会话中(没有安全信息)以便于调用,并确定我们是否有经过身份验证的用户或匿名会话。用户可以通过多种途径更改其部分或全部信息,我希望将该会话值保持最新。显而易见的答案是更新afterSave()
回调中的值,但这当然违反了MVC。
是否有另一种方法可以捕获一个地方的每个更改,以便我不必在整个地方删除会话写入?我想不出任何事情,也没有找到任何其他想法。我是唯一一个试图做这样事的人吗?
感谢。
最终解决方案:坦率地说,我将neilcrookes的回答标记为答案,因为似乎没有更好的方法。但是,由于这种方式违反了我的OCD意识,我采取了一条略有不同的道路。我决定让我的User::authenticate()
方法将经过身份验证的用户对象返回给调用者,以便它可以随意执行任何操作。呼叫者“想要”做的事情之一就是在会话中删除该值。这是冗余,但它非常非常有限。在我看来,这比从模型访问会话感觉更好(尽管如果你这样做肯定是该死的,如果你不这样做,该死的话)。
答案 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。