12

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

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

4

4 回答 4

15

我更喜欢Ardent包,因为它可以使模型的验证尽可能流畅和最小化。对我来说,在模型中也有验证规则更有意义。

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

于 2013-07-01T11:03:44.403 回答
5

在模型中进行验证确实有意义,但这种验证应该只是为了确保您不会保存任何损坏的数据。

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

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

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

因此,要真正回答您的问题:模型中的验证对于避免损坏数据是有意义的,但是如果您想向用户提供有关无效输入的反馈,它应该在控制器中。

于 2013-07-01T10:19:45.013 回答
2

我为此苦苦挣扎了一段时间,并决定在验证服务中处理我的大部分验证,基于类似于this的内容。然后我可以根据上下文有不同的验证规则。

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

于 2013-07-01T11:04:02.303 回答
0

为什么我更喜欢模型内验证:我使用过这两种样式,并且每种都有优点和缺点,但我更喜欢模型内验证。在我们当前的应用程序中,我不认为控制器内验证是一种选择,因为我们在很多地方(专用表单、内联编辑、批量编辑、批量上传、api 等)更改我们的数据。我从来没有真正使用过验证服务(尽管它们可能是一种选择),但我个人喜欢让逻辑尽可能接近模型,这样我就知道其他开发人员不会绕过它。我也不喜欢在 MVC 和基本 Libraries 文件夹之上添加大量额外文件,因为您似乎需要更多地考虑正确组织。

模型内验证问题:这些是您需要考虑的一些事项,以使模型内正常工作。其中一些已经被插件考虑在内。我认为其他框架(CakePHP)已经处理了这些,但 Laravel 并没有。

  1. 将被验证但不保存到数据库的值(例如,“accepted_agreement”)。
  2. 多对多或属于多关系
  3. 设置条件默认值(不是关键,但可能需要同时考虑)
  4. 各种表单场景 - 有时您可能需要不同的验证,具体取决于提交的表单。表单引用可以是用于验证的可清除属性吗?
  5. 您将如何获取错误消息(所有模型内验证插件都会为您处理此问题)
  6. 不同的验证规则集。草稿创作与“真实”创作。(大多数为您处理)

最终,对于没有很多与模型交互的方式的简单应用程序,我会说控制器验证可能更简单,除了我更喜欢模型内。

于 2016-06-28T13:55:31.357 回答