Laravel 复杂验证的方法
Laravel approach to complex validation
关于验证在 Laravel 应用程序中属于何处的争论很多。尤其是当事情变得复杂的时候。就个人而言,我认为模型的工作应该是只接受有效数据并在收到无效数据时抛出异常。
考虑到这一点,我想为用户模型提出以下方案(我目前正在做类似的事情):
- 一个用户有字段:
- ID: 始终需要,数字,自动递增。
- 用户名: 始终需要,alpha-dash,唯一。
- 电子邮件: 始终需要,电子邮件,唯一。
- 密码: 始终需要,> 6 个字符。 哈希.
- 个人资料图片: - 可选,png/jpg/gif,< 10mb。作为文件名存储在数据库中,该文件名指向用户特定目录中文件系统上的图像 (content/users/USERID/PROFILEIMAGE) .上传的图像在移动到此位置之前会被裁剪并调整大小。还必须确定可用的文件名。
有很多选项可用,有些感觉更容易实施但感觉不对:
选项 1: 控制器验证。将验证粘贴到处理该对象的控制器中很容易做到。另一方面,到处都在重复规则,这感觉是一种糟糕的做法。
选项 2: 表单验证器。为不同的表单创建分隔符验证器。从本质上讲,这或多或少与选项 1 相同,但我们刚刚提取了验证以分隔 类。各种不同的地方仍然重复规则,仍然感觉很脏。
选项 3: 整个模型验证。将验证规则添加到模型并在保存之前进行验证(通过从控制器显式调用验证方法或在保存时进行验证)。感觉好多了,但由于场景的复杂性,仍然有缺点。我们需要处理在现有记录的唯一规则中排除 ID 的问题。在保存到数据库之前,我们需要处理密码散列(如果我们从数据库加载记录,模型将包含一个散列密码,实际上,我们不应该验证)。我们仍然需要处理上传图像的 cropping/resizing/moving 并以某种方式生成唯一的文件名。
选项 4: 模型 validation/processing 函数。编写一个接受数据并在设置属性之前对其进行验证(如果无效则抛出异常)的函数。仅验证提供的数据(例如,我们可能只传递新的个人资料图片)。根据对象是否存在或是否为新对象动态调整规则。调用相关处理函数,例如处理 resizing/cropping/moving 上传图像并删除旧个人资料图像的函数。
选项 5: 模型修改器。编写负责验证和处理它们所代表的字段的修改器。这确保只有有效数据才能进入模型并完成所有处理。错误可以通过立即抛出异常或使用错误字段跟踪问题来处理,然后可以检索错误字段。缺点可能是,如果未设置字段,则永远不会调用该字段的验证,因此一些空的必填字段可能会通过网络 - 我想这可以通过确保在控制器中传递所有输入来解决.
选项 6: 模型修改器 + 整个模型验证。模型修改器如先前选项 5 中所述,并添加了在保存数据之前验证整个模型,如选项 3 中那样。这将确保没有空的必填字段漏网。
有什么建议吗?
请注意,我不寻求任何代码帮助。只是寻找有关如何以最佳方式处理复杂场景的建议和建议。
干杯
Laravel 5 提供 Form Request Validation - 这是现在处理验证的好方法。所有规则都保存在一个位置,并且遵循DRY和SRP原则。
它们使您能够包含复杂的验证,但也能非常快速地处理简单的请求。
最重要的是,它将验证从控制器中抽象出来 - 因此它可以在多个地方使用。如果验证失败——那么控制器甚至都不会被调用——所以你的控制器开始清理真的快。
关于验证在 Laravel 应用程序中属于何处的争论很多。尤其是当事情变得复杂的时候。就个人而言,我认为模型的工作应该是只接受有效数据并在收到无效数据时抛出异常。
考虑到这一点,我想为用户模型提出以下方案(我目前正在做类似的事情):
- 一个用户有字段:
- ID: 始终需要,数字,自动递增。
- 用户名: 始终需要,alpha-dash,唯一。
- 电子邮件: 始终需要,电子邮件,唯一。
- 密码: 始终需要,> 6 个字符。 哈希.
- 个人资料图片: - 可选,png/jpg/gif,< 10mb。作为文件名存储在数据库中,该文件名指向用户特定目录中文件系统上的图像 (content/users/USERID/PROFILEIMAGE) .上传的图像在移动到此位置之前会被裁剪并调整大小。还必须确定可用的文件名。
有很多选项可用,有些感觉更容易实施但感觉不对:
选项 1: 控制器验证。将验证粘贴到处理该对象的控制器中很容易做到。另一方面,到处都在重复规则,这感觉是一种糟糕的做法。
选项 2: 表单验证器。为不同的表单创建分隔符验证器。从本质上讲,这或多或少与选项 1 相同,但我们刚刚提取了验证以分隔 类。各种不同的地方仍然重复规则,仍然感觉很脏。
选项 3: 整个模型验证。将验证规则添加到模型并在保存之前进行验证(通过从控制器显式调用验证方法或在保存时进行验证)。感觉好多了,但由于场景的复杂性,仍然有缺点。我们需要处理在现有记录的唯一规则中排除 ID 的问题。在保存到数据库之前,我们需要处理密码散列(如果我们从数据库加载记录,模型将包含一个散列密码,实际上,我们不应该验证)。我们仍然需要处理上传图像的 cropping/resizing/moving 并以某种方式生成唯一的文件名。
选项 4: 模型 validation/processing 函数。编写一个接受数据并在设置属性之前对其进行验证(如果无效则抛出异常)的函数。仅验证提供的数据(例如,我们可能只传递新的个人资料图片)。根据对象是否存在或是否为新对象动态调整规则。调用相关处理函数,例如处理 resizing/cropping/moving 上传图像并删除旧个人资料图像的函数。
选项 5: 模型修改器。编写负责验证和处理它们所代表的字段的修改器。这确保只有有效数据才能进入模型并完成所有处理。错误可以通过立即抛出异常或使用错误字段跟踪问题来处理,然后可以检索错误字段。缺点可能是,如果未设置字段,则永远不会调用该字段的验证,因此一些空的必填字段可能会通过网络 - 我想这可以通过确保在控制器中传递所有输入来解决.
选项 6: 模型修改器 + 整个模型验证。模型修改器如先前选项 5 中所述,并添加了在保存数据之前验证整个模型,如选项 3 中那样。这将确保没有空的必填字段漏网。
有什么建议吗?
请注意,我不寻求任何代码帮助。只是寻找有关如何以最佳方式处理复杂场景的建议和建议。
干杯
Laravel 5 提供 Form Request Validation - 这是现在处理验证的好方法。所有规则都保存在一个位置,并且遵循DRY和SRP原则。
它们使您能够包含复杂的验证,但也能非常快速地处理简单的请求。
最重要的是,它将验证从控制器中抽象出来 - 因此它可以在多个地方使用。如果验证失败——那么控制器甚至都不会被调用——所以你的控制器开始清理真的快。