Laravel 有时验证规则

Posted

技术标签:

【中文标题】Laravel 有时验证规则【英文标题】:Laravel sometimes validation rule 【发布时间】:2016-05-13 19:27:34 【问题描述】:

我正在尝试仅在存在密码字段时对其进行验证。我想允许某人编辑用户,他们可能想也可能不想更改用户密码。所以我想我可以使用 Laravel 验证规则,特别是“有时”规则。我有这套规则:

$this->validate($request, [
    'password' => 'sometimes|required|min:8',
]);

这对于示例来说是简化的,通常会有其他字段的其他规则和更严格的密码规则。我希望这仅在传递的数据中存在密码字段时才应用 min:8 规则,但如果我将密码字段留空,我会收到一个验证错误,提示密码字段是必需的。

我不确定我在文档中不理解什么。如果表单输入像这样提交为空,是否需要在验证之前手动删除密码字段?

$data = $request->all();

if ('' === $data['password']) 
    unset($data['password'])

...然后将数组传递给验证器。我认为这是有道理的,但我可以确认我理解正确。提前致谢。

【问题讨论】:

从文档中,这就是我所理解的。所以,基本上你很高兴,除非有人另有说明。 似乎如果您删除所需的规则,它可以像这样正常工作:'sometimes|min:8.....',但文档并没有真正说明这一点。 是的。这就是我首先想到的,然后再次检查了文档。 :D 我看到一个评论说要这样做,所以我做了,然后评论消失了,是你吗? 是的。那是我。无论如何很高兴能帮上忙。 【参考方案1】:

我认为我们应该告诉 laravel 如果密码不为空,则输入规则,否则什么也不做。

$this->validate($request, [
  'password' => $request->password != null ?'sometimes|required|min:8': ''
]);

【讨论】:

"在上面的示例中,只有在 $data 数组中存在密码字段时才会验证密码字段"。来自文档 @nbin 可以参考一下吗? 我确实在文档中读到了这一点,但我不觉得手动从数组中删除某些东西似乎是一种好方法。另外,您不能对验证规则使用自定义请求。 @nbin 那么$data 究竟是什么?一组数据,所以是的,请求里面包含所有这些东西.. nbin,谢谢,如果您添加为答案,我会接受。【参考方案2】:

我认为只有在用户可以提供旧密码的情况下才允许用户更改其密码通常更安全。

允许连接的用户在不提供旧密码的情况下更改其密码可能是一个安全问题。

这通常是我允许使用 Laravel 更改用户密码的方式:

 $this->validate($request, [
            'user.old_password' => [],
            'user.password' => [
                'required_with:user.old_password',
                'min:6',
                'confirmed',
                'regex:/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*([-+_!@#$%^&*.,;?])).+$/',
                'different:user.old_password'
            ],
            'user.password_confirmation' => ['required_with:user.password'],
        ]);

这不会验证旧密码,因为我们不在乎,数据库会为我们检查它,但我只有在提供旧密码时才验证新密码。

【讨论】:

【参考方案3】:

文档没有说清楚,但是删除 required 使它起作用。

$this->validate($request, [
    'password' => 'sometimes|min:8',
]);

【讨论】:

看起来确实很明显,但文档会引导您远离解决方案。感谢您的帮助:)。 是的,在代码上做了,但看到文档感到困惑。很高兴能帮上忙:) 我理解的对吗?有时规则意味着输入是可选的? “在某些情况下,您可能希望仅当输入数组中存在该字段时才对该字段运行验证检查。”。我认为这已经足够清楚了【参考方案4】:

在编辑模式下,您可以通过例如“********”填写密码字段,而在更新模式下,像这样验证

$this->validate($request, [
    'password' => 'required|min:8',
]);

在控制器中检查$data['password']='********'找到旧密码并

$data['password']='old password in db'

$data['password']!='********' 更新密码

【讨论】:

【参考方案5】:

Laravel 有时验证规则及其作用:

接受 验证字段必须为 yes、on、1 或 true。这对于验证“服务条款”的接受很有用。

active_url 根据 dns_get_record php 函数,验证中的字段必须具有有效的 A 或 AAAA 记录。

之后:日期 验证中的字段必须是给定日期之后的值。日期将被传递到 strtotime PHP 函数: 'start_date' => '需要|日期|之后:明天' 您可以指定另一个字段与日期进行比较,而不是传递要由 strtotime 评估的日期字符串: '完成日期' => '需要|日期|之后:开始日期'

after_or_equal:date 验证中的字段必须是在给定日期之后或等于给定日期的值。有关详细信息,请参阅 after 规则。

阿尔法 正在验证的字段必须完全是字母字符。

【讨论】:

【参考方案6】:

作为所选答案的一个选项,您可以使用:

    $this->validate($request, [
       'password' => 'nullable|min:8',
    ]);

【讨论】:

【参考方案7】:

“我正在尝试仅在存在密码字段时对其进行验证。”

为此,您可以在验证系统中使用“可为空”规则。

例如:

$this->validate($request, [
    'password' => 'sometimes|nullable|min:8',
]);

有关更多信息,请查看“关于可选字段的注释”下的 https://laravel.com/docs/5.6/validation 部分

【讨论】:

【参考方案8】:

这是一个老问题,但上面的答案有很多混淆。这是目前谷歌上“有时验证规则”的第一个结果,所以我希望我可以为谷歌同事澄清一下:

规则sometimes 的作用如下:

如果请求中存在该字段,则使用其余规则对其进行验证; 如果该字段不存在,则什么也不做。

请注意,不存在表示该字段从未提交isset($_POST['password']) === false),它不同于以空字符串提交的字段或null 或 0 值 - 因此 'sometimes|required|min:8' 仅在表单根本没有密码字段或被禁用以致永远不会提交时才有效。

如果密码字段存在,只是留空,然后表单被提交,我们仍然会得到'password' => null,对于sometimes,它意味着它存在,所以其余的规则将被应用(因为必填字段可以'不为 null 请求将失败)。

OP 真正需要的是:

'password' => 'nullable|min:8',

假设密码字段将始终存在于请求中,只是有时它的值可以留空。

【讨论】:

以上是关于Laravel 有时验证规则的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:有时规则不适用于输入类型=文件

laravel5.5表单验证

Laravel - 在自定义验证中使用验证规则

Laravel:模型内的验证。多重验证规则

laravel验证规则

Laravel 验证规则列表