【发布时间】:2014-02-04 07:08:07
【问题描述】:
我的 PHP 应用程序有一个要求 - 允许用户重置他们的密码。流程如下:
- 用户请求重置密码;
- 用户输入电子邮件地址;
- 系统验证电子邮件地址 - 如果无效则通知用户和进程结束,否则将向输入的电子邮件地址发送一封电子邮件,其中包含一个链接中的哈希令牌;
- 用户点击电子邮件中的链接;
- 系统收到嵌入令牌的重置请求 - 验证令牌和时间限制(60 分钟);
- 如果重置请求有效,则显示重置密码视图,其中包含两个密码字段,否则用户告知请求无效并退出进程;
- 假设请求有效,用户输入密码两次,然后通过比较验证。
这似乎是当前的最佳做法。
我的问题是如何使用 MVC 实现这一点。我有一个前端控制器,它从GET 和POST 请求中吸收数据,并将数据传递给相关的视图模型并通过路由器类进行视图。
使用这个模型,我有一个重置密码视图模型和视图,它负责处理用户的电子邮件输入和带有链接令牌的地址的电子邮件 - 在这里都很好。
我还有一个视图模型和视图供用户输入新密码。我在这里遇到了问题。这验证了传入的令牌和时间限制 - 这是有效的。然后,如果令牌和时间限制有效,它会向用户显示需要验证的设置密码视图。我无法使用 set-password 视图模型和视图提出解决方案,该视图允许我显示设置密码视图并进行验证,向用户展示密码无效的原因(任一密码字段为空,或密码不匹配)。
我希望我已经清楚我的问题。有人可以为我的问题提出一个最佳实践解决方案来解决这个过程吗?我在想我在过程的第二部分做的太多了——分解工作并引入一个新的视图模型(用户不可见)来处理令牌和时间验证,然后再传递给 set-password部分是我正在寻找的一种解决方案,但感觉不对。它没有我不正确的解决方案所具有的美学吸引力(越少越好)。
【问题讨论】:
-
您的问题到底是什么?而且,顺便说一句,front controller 模式与 MVC 无关 .. 这意味着您的描述毫无意义。另外,“set-password view-model”到底是什么?!
-
我对 MVC 的理解,至少在它适用于基于 Web 的应用程序时,是模型专门为视图提供数据来显示 - 视图从模型中请求数据。这就是它所做的一切——根据业务规则提供数据。我还有一个数据访问层,它使用提供对数据层的访问的“模型”(我不知道该对象的正确术语)。我称之为视图模型的对象与数据访问“模型”通信以检索视图所需的数据。为了区分对象,我将视图使用的模型称为视图模型
-
其次,当我的前端控制器处理所有请求时,它通过路由器将工作委托给我的 MVC 实现。前端控制器通过请求的操作知道要创建哪个 MVC 三元组。
标签: php validation model-view-controller