【问题标题】:Laravel approach to complex validation复杂验证的 Laravel 方法
【发布时间】:2015-04-30 00:58:14
【问题描述】:

关于验证在 Laravel 应用程序中的位置存在很多争论。尤其是当事情变得复杂时。就个人而言,我认为模型的工作应该是只接受有效数据并在收到无效数据时抛出异常。

考虑到这一点,我想为用户模型提出以下方案(我目前正在做类似的事情):

  • 用户具有以下字段:
    • ID:始终需要,数字,自动递增。
    • 用户名:始终需要,字母破折号,唯一。
    • 电子邮件:始终需要,电子邮件,唯一。
    • 密码:始终需要,> 6 个字符。 散列
    • 个人资料图片: - 可选,png/jpg/gif,USERID/PROFILEIMAGE)中文件系统上的图像。上传的图像在移动到此位置之前会被裁剪和调整大小。还必须确定可用的文件名。

有很多可用的选项,有些感觉更容易实现但感觉不对:

选项 1: 控制器验证。在处理该对象的控制器中粘贴验证很容易。另一方面,规则在各处重复,这感觉是一种糟糕的方式。

选项 2: 表单验证器。为不同的表单创建分隔符验证器。本质上,这或多或少与选项 1 相同,但我们只是将验证提取到单独的类中。规则仍然在不同的地方重复,仍然感觉很脏。

选项 3: 整个模型验证。将验证规则添加到模型并在保存之前进行验证(通过从控制器显式调用验证方法或在保存时验证)。感觉好多了,但由于场景的复杂性,仍然有缺点。我们需要处理在现有记录的唯一规则中排除 ID。在保存到数据库之前,我们需要处理密码哈希(如果我们从数据库加载了一条记录,模型将包含一个哈希密码,实际上我们不应该验证)。我们仍然需要处理上传图像的裁剪/调整大小/移动,并以某种方式生成唯一的文件名。

选项 4: 模型验证/处理功能。在设置属性之前编写一个接受数据并对其进行验证的函数(如果无效则抛出异常)。仅验证提供的数据(例如,我们可能只传入新的个人资料图像)。根据对象是否存在或是否为新对象动态调整规则。调用相关的处理函数,例如处理调整大小/裁剪/移动上传的图像和删除旧的个人资料图像的函数。

选项 5: 模型修改器。编写负责验证和处理它们所代表的字段的修改器。这确保只有有效数据才能进入模型并完成所有处理。错误可以通过立即抛出异常或使用错误字段跟踪问题来处理,然后可以检索该错误字段。缺点可能是,如果未设置字段,则永远不会调用该字段的验证,因此一些空的必填字段可能会漏网 - 我想这可以通过确保在控制器中传递所有输入来解决.

选项 6: 模型修改器 + 整个模型验证。如前面选项 5 中所述的模型修改器,并添加了在保存数据之前验证整个模型,如选项 3 中所示。这将确保没有空的必填字段漏网。

有什么建议吗?

请注意,我不寻求任何代码帮助。只是寻找有关如何以最佳方式处理复杂场景的建议和建议。

干杯

【问题讨论】:

    标签: php validation laravel model


    【解决方案1】:

    Laravel 5 提供了Form Request Validation - 这是现在处理验证的好方法。所有规则都保存在一个位置,并且遵循 DRY 和 SRP 原则。

    它们使您能够包含复杂的验证,同时也可以非常快速地处理简单的请求。

    最重要的是,它将验证从控制器中抽象出来——因此它可以在多个地方使用。如果验证失败 - 那么控制器甚至永远不会被调用 - 所以你的控制器开始清理真的快。

    【讨论】:

    • 感谢您的回答。不幸的是,我目前正在使用 4.2,也许我应该升级到 5。我将不得不更深入地研究它。上传的图片等的处理呢?假设我们有一个有效的表单请求,我们进入控制器准备处理。你会在你的模型中这样做吗,也许是通过一个 mutator(忽略所有验证),或者它可能更适合控制器?也许它甚至可以以某种方式被提取出来。
    • 通过过程,我的意思是删除现有图像,将新图像移动到正确的位置并裁剪/调整大小。
    • 我现在会在 Laravel 5 command 中处理这个问题 - laravel.com/docs/5.0/bus。所以路由到控制器(使用表单验证),然后从控制器执行命令以保存所有内容。在命令本身中,我会将图像保存和模型保存作为两个问题在一个命令中进行管理。
    • 很好,感谢您的建议。我最好开始阅读 Laravel 5。
    • 有趣,如果验证不是表单,如何处理?如果 JSON 请求呢?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-07
    • 2020-09-06
    • 2018-07-03
    • 1970-01-01
    • 2017-05-30
    • 2015-05-22
    • 2016-01-28
    相关资源
    最近更新 更多