关于验证属于Laravel应用程序的位置存在很多争议。特别是当事情变得复杂时。就个人而言,我认为模型的工作应该是只接受有效数据并在收到无效内容时抛出异常。
考虑到这一点,我想为User模型提出以下场景(我现在正在研究这样的事情):
有许多选项可供使用,有些选项更容易实现,但感觉不对:
选项1:控制器验证。在处理此对象的控制器中粘贴验证很容易。另一方面,规则在整个地方重复出现,这感觉就像是一种不好的方式。
选项2:表单验证程序。为不同的表单创建分隔符验证器。从本质上讲,这与选项1或多或少是相同的方法,但我们刚刚将验证提取到单独的类中。规则仍然在不同的地方重复,仍然感觉很脏。
选项3:整个模型验证。将验证规则添加到模型并在保存之前进行验证(通过从控制器显式调用验证方法或在保存时验证)。由于场景的复杂性,感觉好多了但仍然有缺点。我们需要处理在现有记录的唯一规则中排除ID。我们需要在保存到数据库之前处理密码哈希(如果我们从数据库加载了一条记录,该模型将包含一个真实的哈希密码,我们不应该验证)。我们仍然需要处理裁剪/调整大小/移动上传的图像并以某种方式生成唯一的文件名。
选项4:模型验证/处理功能。在设置属性之前编写一个接受数据并验证它的函数(如果无效则抛出异常)。仅验证其提供的数据(例如,我们可能只传入新的配置文件图像)。根据对象是否存在或是新对象动态调整规则。调用相关的处理功能,例如处理调整大小/裁剪/移动上传图像和删除旧配置文件图像的功能。
选项5:模型变异器。编写负责验证和处理它们所代表的字段的变更器。这可确保只有有效数据才能进入模型并完成所有处理。可以通过立即抛出异常或使用可以检索的错误字段跟踪问题来处理错误。缺点可能是如果没有设置字段,那么永远不会调用该字段的验证,因此一些空的必填字段可能会漏网 - 我想这可以通过确保控制器中所有输入都通过来解决
选项6:模型mutators +整个模型验证。模型变换器如前面在选项5中所述,在保存数据之前添加了验证整个模型,如选项3中所示。这将确保没有空的必填字段通过网络。
有什么建议吗?
请注意,我不是在提供任何代码帮助之后。只是寻找有关如何以最佳方式进行复杂场景的建议和建议。
干杯
答案 0 :(得分:7)
Laravel 5提供Form Request Validation - 这是现在处理验证的好方法。所有规则都保存在一个位置,遵循DRY和SRP原则。
它们使您能够包含复杂的验证,但也可以非常快速地执行简单的请求。
最重要的是,它将验证从控制器中抽象出来 - 因此它可以在多个地方使用。如果验证失败 - 那么控制器永远不会被调用 - 所以你的控制器开始快速清理 。