|
|
1
3
首先,我不会将register()方法放入用户模型中。模型应该是数据库中对象的表示,通常只包含“crud”方法(创建、检索、更新、删除)、getter和setter方法,以及一些与模型相关的静态助手方法。通过将register()方法放入模型中,您将使模型执行表示逻辑,这实际上应该由用户控制器执行,因为这是对用户操作的响应。控制器处理用户操作,验证这些用户操作,然后在验证成功时更新模型。 在您的示例中,用户试图创建一个新帐户。他填写了一张表格,然后单击提交。表单的post操作应该指向控制器的方法,如/user/register,该方法将使用验证库来验证用户发送的表单数据。只有当该数据成功验证后,才能创建用户模型实例,将该模型的属性设置为用户输入的内容,然后使用模型的save()方法保存到数据库。如果验证失败,您将向用户报告错误,并且根本没有创建用户模型,因为您还没有有效的数据集来创建模型。 接下来,您将检查用户是否已登录。同样,这应该在控制器中,而不是模型中。除此之外,如果用户已经登录,那么他就不能首先进入这个注册过程。创建用户注册表窗体视图的控制器方法应检查用户是否已登录,如果已登录,则应将其重定向到另一页。即使用户在耍花招并设法提交表单(可能他在旧窗口中打开表单时通过另一个窗口登录),您的注册方法也应该首先检查该表单,而不是创建$user验证对象。 我可以在代码中看到,根据您的模型设置,有一些令人困惑的项。例如,您正在将$user数组传递到方法中,我假定该方法是表单数据。但是您使用的是“pass-by-reference”操作符(&),这在php5中是不必要的,因为现在所有对象都是通过引用传递的。但在这之后,您将重新将$user作为验证对象。您是否在其他地方使用$user验证对象并要求通过引用传递它?如果是这样,这是逻辑中的另一个缺陷,因为所有这些处理都需要在控制器中进行,并且可以直接在控制器中使用$_post值,而不必传递验证对象。 稍后,您将使用parent::validate($user$save)验证用户信息。为什么对父级调用validate()方法作为静态方法?如果这是一个模型,那么它应该扩展Kohana的核心模型类,“parent”引用模型类。您的模型是否扩展了验证类?另外,为什么要将$user validation对象传递给validation()方法?如果需要执行递归(在对以前的过滤器进行更改后再次验证元素),则需要执行此操作,但看起来您没有执行任何需要递归的操作。您应该在$user validation对象上调用validate():
没有任何争论。验证错误将成为$user对象的一部分,因此您可以使用
最后,虽然Kohana允许您使用方法链接,但我不会使用一个长链来设置规则和其他验证项。这很混乱,可能会导致调试困难。将它们中的每一个放到自己的行中,并直接在$user对象上执行每一个。 |
|
|
2
1
我不知道Kohanna,所以我不确定他们的MVC分离是什么样的土地,但通常我会
通常我可能会做如下伪代码:
|