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

Laravel 4模型验证与控制器验证,laravel,laravel-4,Laravel,Laravel 4,在Laravel 4中,验证模型的官方方法似乎是通过控制器中的验证器?有人能指出原因吗 在模型中实施验证是否更有意义?在模型中进行验证是有意义的,但此验证应该仅用于确保不保存任何损坏的数据 Validator位于控制器中,因为它用于处理输入和生成输出。 如果要在模型中执行验证,则必须返回false,并向用户显示有关无效数据的最随机错误消息。 您还可以返回一些包含生成的所有错误的数组单元,但这是模型不应该做的。 或者您可以抛出一个异常,这是当模型试图使用无效数据,但它杀死了应用程序时应该执行的操作

在Laravel 4中,验证模型的官方方法似乎是通过
控制器中的
验证器
?有人能指出原因吗


模型中实施验证是否更有意义?

在模型中进行验证是有意义的,但此验证应该仅用于确保不保存任何损坏的数据

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

在控制器中执行表单验证时,可以使用错误消息执行任何操作,而无需更改模型的用途

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

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

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


当调用
$model->save()
且验证失败时,它将返回false,然后您可以通过
$model->errors()->all()
获取错误消息。例如,我为此绞尽脑汁了一段时间,并决定在验证服务中处理我的大部分验证,基于以下内容。然后,我可以根据上下文使用不同的验证规则


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

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

<>强>模型验证中的问题< /强>:这是在模型工作中需要考虑的一些事情。strong>插件已经考虑了其中一些问题。我认为其他框架(CakePHP)已经处理了这些问题,但Laravel并没有

  • 将被验证但未保存到数据库的值(例如。, “已接受的协议”)
  • 多对多或属于多 关系
  • 设置条件默认值(不重要但不重要) (可能需要同时考虑)
  • 不同的表单场景-有时可能需要不同的验证 取决于提交的表单。表单引用可以是 可能是验证的可购买属性
  • 您将如何返回错误消息(所有模型验证插件都会为您处理此问题)
  • 不同的验证规则集。草稿创作与“真实”创作。(大多数人会帮你处理)

  • 最终,对于没有很多与模型交互方式的简单应用程序,我认为控制器验证可能更简单,除此之外,我更喜欢在模型中使用。

    让我觉得很夸张:使用一个能为您完成所有艰苦工作的软件包。@Nikramodes您对我如何使用Ardent和另一个扩展到MongoDB ORM的软件包有什么建议吗?我的模型扩展了另一个包创建的模型。@Nikramodes,你知道有哪个包可以让我的模型同时成为Ardent模型和MongoDB模型吗?@Ryan,不幸的是,没有。如果你不愿意编写一个扩展Ardent类的基模型,然后在其中实现MongoDB存储,我不会说正式。这只是演示验证器的一种更简单的方法,因为建立一个像样的验证服务要复杂一些。这里有很多示例以及在模型本身中或作为单独服务执行验证的包。看看这些。模型验证的一个优点是种子也经过验证。我想说的是官方的,因为这是官方文件建议的唯一方法。如果这不是官方的,还有什么?同意,什么是官方/最佳实践。。。如果文件不完整?这一点的反映我认为在一个地方而不是在多个地方(模型、控制器、前端表单)定义验证规则是这里的关键。模型是这个场景中最常见的东西。为什么模型“不应该”包含它自己的错误消息?如果您认为模型是DB的包装器,那么当您尝试将无效数据插入DB时,SQL将返回一条错误消息,谁不让模型也这样做呢?