在Laravel 4中验证模型的官方方法似乎是Validator
中的Controller
?有人能指出为什么会这样吗?
在Model
中实施验证会不会更有意义吗?
答案 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并不是真的。
最终,对于没有多种方式与模型进行交互的简单应用程序,我说控制器验证可能更简单,除此之外,我更喜欢 - 模型。