Laravel 4模型验证与控制器验证

时间:2013-07-01 09:45:02

标签: laravel laravel-4

在Laravel 4中验证模型的官方方法似乎是Validator中的Controller?有人能指出为什么会这样吗?

Model中实施验证会不会更有意义吗?

4 个答案:

答案 0 :(得分:15)

我更喜欢Ardent包,以使模型验证尽可能平滑和最小化。对我来说,在模型中使用验证规则也更有意义。

当调用$model->save()并且验证失败时,它将返回false,然后您可以通过$model->errors()->all()获取错误消息。

答案 1 :(得分:5)

在模型中进行验证确实有意义,但只有在验证时才能确保不保存任何损坏的数据。

Validator位于Controller,因为它用于处理输入,并生成输出。 如果您要在Model中进行验证,则必须返回false,并向用户显示有关无效数据的最随机的错误消息。 您还可以返回一些包含生成的所有错误的数组,但这是Model不应该做的事情。 或者你可以抛出一个异常,当模型试图消耗无效数据时应该这样做,但它会杀死应用程序,这不是表单验证器所需的解决方案。

在Controller中进行表单验证时,您可以使用错误消息执行所需操作,而无需更改模型的用途。

在您的模型中,您可以进行验证以确保您没有犯错,这会损坏您的数据库。因为如果发生这种情况,应该关闭应用程序。

所以要把它真实地回答你的问题: 模型中的验证有助于避免损坏数据,但如果您想向用户提供有关无效输入的反馈,则应该在控制器中。

答案 2 :(得分:2)

我在这个问题上进行了一段时间的努力,并在this的基础上确定了在验证服务中处理大部分验证的问题。然后,我可以根据上下文使用不同的验证规则。

正如Nico所提到的,模型中的验证很好地避免了损坏的数据,但我更喜欢瘦控制器,因此我将控制器中的功能传递给服务。这还具有能够在不同控制器/方法中重用验证的益处。

答案 3 :(得分:0)

为什么我更喜欢模型内验证:我已经使用过两种风格,每种风格都有优缺点,但我更喜欢模型内验证。在我们当前的应用程序中,我没有看到控制器内验证作为选项,因为我们在很多地方改变了我们的数据(专用表单,内联编辑,批量编辑,批量上传,api等)。我从未真正使用验证服务(尽管它们可能是一种选择),但我个人希望尽可能保持逻辑尽可能接近模型,这样我知道另一个开发人员不会绕过它。我也不喜欢在MVC和基本的Libraries文件夹之上添加大量额外的文件,因为看起来你需要更多地考虑正确组织。

模型内验证的问题:这些是您需要考虑的一些事项,以使In-Model运行良好。 其中一些已经被插件考虑。我认为其他框架(CakePHP)已经处理过这些,但Laravel并不是真的。

  1. 将验证但未保存到数据库的值(例如, " accepted_agreement"。)
  2. 许多人或许多人 关系
  3. 设置条件默认值(不重要但是 可能想要同时考虑)
  4. 各种表单方案 - 有时您可能需要不同的验证 取决于提交它的形式。表单引用可以是a 可验证的可清除属性可能吗?
  5. 您将如何收到错误消息(所有模型内验证插件都会为您处理)
  6. 不同的验证规则集。草稿创作vs"真实"创建。 (大多数人都会为你处理)
  7. 最终,对于没有多种方式与模型进行交互的简单应用程序,我说控制器验证可能更简单,除此之外,我更喜欢 - 模型。