【问题标题】:Does Laravel validation rule default to sometimes?Laravel 验证规则是否默认为有时?
【发布时间】:2021-01-11 16:47:38
【问题描述】:

如果您在 Laravel 中创建了一个验证规则,但省略了 |required 并直接使用,请说电子邮件规则。它默认是什么?

例如

$request->validate([
    'email' => 'email'
]);

这些验证规则是否相等?

$request->validate([
    'email' => 'sometimes|email'
]);

// vs

$request->validate([
    'email' => 'email'
]);

抱歉,如果之前已回答过此问题。我尽我最大的努力搜索类似的问题,但我可能使用了错误的词(不知道如何在 Google/Stack Overflow 搜索中表达这个词)。

【问题讨论】:

    标签: laravel validation required


    【解决方案1】:
    $request->validate([
        'email' => 'email'
    ]);
    

    这将始终验证 email 键(即使为空)是有效的 email 格式。

    $request->validate([
        'email' => 'sometimes|email'
    ]);
    

    这将验证email 密钥如果该密钥存在于$request->all()


    所以不同之处在于,sometimes 只有在 $request 对象包含它时才会对其进行验证,否则它将始终针对密钥进行验证。

    如果我可以简化它,我会说有时意味着,如果该字段出现在请求中,则仅应用其余的验证规则。想象有时就像一个 if 语句,在应用任何规则之前检查请求/输入中是否存在该字段。

    绕着脑袋转可能是一件乏味的事情,但这里有一些例子:

    input: []
    rules: ['email' => 'sometimes|email']
    result: pass, the request is empty so sometimes won't apply any of the rules
    
    input: ['email' => '1']
    rules: ['email' => 'sometimes|email']
    result: fail, the field is present though invalid email so the email rule fails!
    
    input: []
    rules: ['email' => 'email']
    result: fail, the request is empty so email is invalid!
    

    【讨论】:

    • 如果答案与其他问题匹配,您可以复制它。 stackoverflow.com/a/35839650/9978078
    • 如果我 POST 一个没有正文的 HTTP 请求(只有 {}),即没有“电子邮件”,那么规则 ['email' => 'email'] 仍然有效。控制器返回 200 OK。但是,如果正文为空,但规则设置为 ['email' => 'required|email'],它会按预期返回 422。这就是为什么我最初认为 ['email' => 'email'] 和 ['email' => 'sometimes|email'] 是相等的,因为控制器的响应是 200 OK。
    【解决方案2】:

    我个人从未使用过sometimes 规则一次。根据文档:

    https://laravel.com/docs/7.x/validation#conditionally-adding-rules

    您可能希望仅当输入数组中存在该字段时才对该字段运行验证检查。要快速完成此操作,请将有时规则添加到您的规则列表中

    如果我理解正确,这在很大程度上取决于您的前端实现。如果您使用的是常规的 html <form> 元素,其中您输入了 name="email",它会在您提交表单后立即发送一个名为 email 的键。

    因此,为了不发送此类密钥,您必须将其从表单中删除,或手动发出 HTTP 请求(因此忽略任何 HTML 表单),以便您决定自己的输入字段。

    【讨论】:

      猜你喜欢
      • 2016-05-13
      • 2021-03-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-12
      相关资源
      最近更新 更多