Validator
在 Laravel 4中验证模型的官方方法似乎是通过Controller
?有人可以指出为什么会这样吗?
在 中实施验证不是更有意义Model
吗?
我更喜欢Ardent包,因为它可以使模型的验证尽可能流畅和最小化。对我来说,在模型中也有验证规则更有意义。
$model->save()
当被调用并且验证失败时它将返回 false ,然后您可以通过$model->errors()->all()
例如获取错误消息。
在模型中进行验证确实有意义,但这种验证应该只是为了确保您不会保存任何损坏的数据。
是Validator
因为Controller
它用于处理输入,并生成输出。如果您要在其中进行验证,Model
那么您必须返回 false,并向用户显示有关无效数据的最随机的错误消息。您还可以返回一些包含所有生成的错误的数组 kine,但这是模型不应该做的事情。或者你可以抛出一个异常,这是当模型尝试使用无效数据时应该做的事情,但它会杀死应用程序,这不是表单验证器想要的解决方案。
在 Controller 中进行表单验证时,您可以对错误消息进行任何操作,而无需更改模型的用途。
在您的模型中,您可以进行验证以确保您没有犯错,这会损坏您的数据库。因为如果发生这种情况,应用程序应该关闭。
因此,要真正回答您的问题:模型中的验证对于避免损坏数据是有意义的,但是如果您想向用户提供有关无效输入的反馈,它应该在控制器中。
我为此苦苦挣扎了一段时间,并决定在验证服务中处理我的大部分验证,基于类似于this的内容。然后我可以根据上下文有不同的验证规则。
正如 Nico 提到的,模型中的验证有助于避免损坏数据,但我更喜欢瘦控制器,因此我将控制器中的功能传递给服务。这还具有能够在不同的控制器/方法中重用验证的好处。
为什么我更喜欢模型内验证:我使用过这两种样式,并且每种都有优点和缺点,但我更喜欢模型内验证。在我们当前的应用程序中,我不认为控制器内验证是一种选择,因为我们在很多地方(专用表单、内联编辑、批量编辑、批量上传、api 等)更改我们的数据。我从来没有真正使用过验证服务(尽管它们可能是一种选择),但我个人喜欢让逻辑尽可能接近模型,这样我就知道其他开发人员不会绕过它。我也不喜欢在 MVC 和基本 Libraries 文件夹之上添加大量额外文件,因为您似乎需要更多地考虑正确组织。
模型内验证问题:这些是您需要考虑的一些事项,以使模型内正常工作。其中一些已经被插件考虑在内。我认为其他框架(CakePHP)已经处理了这些,但 Laravel 并没有。
最终,对于没有很多与模型交互的方式的简单应用程序,我会说控制器验证可能更简单,除了我更喜欢模型内。