关于验证在laravel应用程序中属于何处,有很多争论。尤其是当事情变得复杂的时候。我个人认为,模型的工作应该是只接受有效数据,并在接收到无效数据时抛出异常。
考虑到这一点,我想为一个用户模型提出以下场景(我目前正在做类似的工作):
用户具有字段:
ID:始终是必需的,数字,自动递增。
用户名:始终必需,字母破折号,唯一。
电子邮件:始终必需,电子邮件,唯一。
密码:总是必需的,>6个字符。散列的
配置文件图像:-可选,png/jpg/gif,有很多选项可供选择,有些觉得更容易实现,但感觉不对:
选项1:控制器验证。在处理此对象的控制器中粘贴验证很容易。另一方面,各地都在重复规则,这让人觉得这是一种糟糕的做法。
选项2:表单验证程序。为不同表单创建分隔符验证器。本质上,这或多或少与选项1相同,但我们只是将验证提取到不同的类中。各种各样的地方仍然重复着规则,仍然觉得很肮脏。
选项3:整个模型验证。将验证规则添加到模型并在保存前验证(通过从控制器显式调用验证方法或在保存时验证)。感觉好多了,但由于场景的复杂性,仍然有缺点。我们需要处理在现有记录的唯一规则中排除id的问题。在保存到数据库之前,我们需要处理密码散列(如果我们从数据库加载了一条记录,那么模型将包含一个散列密码,实际上,我们不应该验证它)。我们仍然需要处理上传图像的裁剪/大小调整/移动,并以某种方式生成唯一的文件名。
选项4:模型验证/处理功能。在设置属性之前,编写一个接受数据并对其进行验证(如果无效则引发异常)的函数。只验证它所提供的数据(例如,我们可能只传入一个新的配置文件映像)。根据对象是否存在或是新对象动态调整规则。调用相关的处理函数,例如一个处理调整/裁剪/移动上载图像和删除旧配置文件图像的函数。
选项5:模型变换器。编写负责验证和处理它们所表示的字段的变异器。这样可以确保只有有效的数据才能进入模型并完成所有处理。可以通过立即抛出异常或使用错误字段跟踪问题来处理错误,然后可以检索该字段。缺点可能是,如果未设置字段,则永远不会调用该字段的验证,因此某些空的必需字段可能会在网络中滑动-我想可以通过确保控制器中的所有输入都经过来纠正这种情况。
选项6:模型变异器+整个模型验证。前面在选项5中描述的模型转换器,添加了在保存选项3中的数据之前验证整个模型的功能。这将确保没有空的必需字段通过网络。
有什么建议吗?
请注意,我不需要任何代码帮助。只是寻找关于如何以最佳方式处理复杂场景的建议和建议。
干杯

最佳答案

laravel 5提供了Form Request Validation-这是一个很好的方法来处理验证现在。所有规则都保存在一个位置,并且遵循dry和srp原则。
它们使您能够包含复杂的验证,同时也可以非常快速地执行简单的请求。
最重要的是,它从控制器中提取验证,因此它可以在多个地方使用。如果验证失败-那么控制器甚至从未被调用-所以您的控制器开始清理非常快。

10-05 20:45
查看更多