“不存在”是不是有验证规则?

Posted

技术标签:

【中文标题】“不存在”是不是有验证规则?【英文标题】:Is there a validation rule for "not present"?“不存在”是否有验证规则? 【发布时间】:2015-04-30 02:36:14 【问题描述】:

我需要使用 Laravel 验证器检查是否未在数组中设置密钥。

这与“必需的”验证规则完全相反。

如果它通过验证,基本上数组将被传递给更新方法,我想确保一列不会被更新。

有没有办法检查值是否“不存在”?

谢谢

编辑:

我目前正在使用 Laravel 5

编辑:

我设法通过调用 Validator::extendImplicit 编写了自己的验证规则。但是,当我将 $value 设置为 null 或根本不设置它时,我的验证函数都会得到 $value 作为 null 。有没有办法检查值是否设置?

【问题讨论】:

可能是您以错误的方式处理此问题。为什么数组中会出现不应该出现的键/值?在这种情况下,更新函数中的一些防御性编程可能会更好。 我只是想确保没有人会将值传递给我不想更新的列。目前更新只应用在一个位置,所以如果需要我可以手动取消设置值,但将来可能会有更多的情况,我希望验证器阻止这种情况。 【参考方案1】:

我知道这个问题很老,但你也可以使用

'email' => 'sometimes|required|not_regex:/^/i',

如果 email 出现在请求中,正则表达式将匹配请求中的任何字符,如果电子邮件是空字符串但出现在请求中,则 sometimes|required 会抓住的。

【讨论】:

【参考方案2】:

对于在 7.x 应用程序(适用于所有版本)中寻找 not_present 逻辑的人,请记住,您可以简单地使用经过验证的数据数组来获得相同的结果。

    $validatedKeys = $request->validate([
            'sort' => 'integer',
            'status' => 'in:active,inactive,archived',
        ]);

    // Only update with keys that has been validated.
    $model->update(collect($request->all())->only($validatedKeys)->all());

我的模型有更多属性,但只有这两个应该是可更新的,因此我也在寻找not_present 规则但最终这样做,因为结果和概念逻辑是相同的。只是从另一个角度。

【讨论】:

【参考方案3】:

根据@MaGnetas 的回答,我想出了这两条可以应用于任何模型的规则。 我正在使用 Laravel 5.4,因此将这些行放在您的 AppServiceProvider.php 上应该可以。

第一种方法extendImplicitarray_key_exists

Validator::extendImplicit('not_present', function($attribute, $value, $parameters, $validator)

    return !array_key_exists($attribute, $validator->getData());
);

使用$validator->getData(),我们可以静态使用验证器。

第二种方法extendfalse

Validator::extend('not_present', function($attribute, $value, $parameters, $validator)

    return false;
);

您可以使用extend,因为如果数据没有属性,我们不需要执行规则(因为这正是我们想要的对吗?)

在文档上:

默认情况下,当正在验证的属性不存在或包含所需规则定义的空值时,不会运行正常的验证规则,包括自定义扩展。 more info

重要提示:唯一的区别是使用extend,空字符串不会运行验证。但是如果你在中间件上设置了TrimStringsConvertEmptyStringsToNull(AFAIK 是默认选项)就没有问题

【讨论】:

【参考方案4】:

我相信我找到了解决方案:

$validator->extendImplicit('not_present', function($attribute, $value, $parameters)

    return !array_key_exists($attribute, $this->data);
);

我没有静态调用 extendImplicit,因为 Validator 类对象被注入到我的类的控制器中。

我需要访问 $this->data($this 指的是 Validator 对象)以确保该键不存在于正在验证的数组中。

【讨论】:

【参考方案5】:

没有内置的验证规则,但您可以创建自己的验证规则。

最简单的方法:

    Validator::extend('foo', function($attribute, $value, $parameters)
    
     // Do some stuff
    );

并检查密钥是否存在。 更多信息: http://laravel.com/docs/4.2/validation#custom-validation-rules

【讨论】:

看起来,如果我使用自己的自定义规则扩展验证器,则只有在数组中存在值且不为空时才会“应用”。因此,如果我将键设置为 NULL,则规则不起作用并且我的列会更新。 extendImplicit 解决了这个问题。始终应用该规则,即使该属性不存在。但是,将其设置为 NULL 或根本不设置都具有相同的效果 - $value 为 null 再次感谢您的回答。毕竟,它让我找到了可行的解决方案。 不客气。我不喜欢给出完整的解决方案。所以知道你会感觉很好,因为你自己解决了它,只是一个提示;-)

以上是关于“不存在”是不是有验证规则?的主要内容,如果未能解决你的问题,请参考以下文章

流明验证:数据库中不存在值的规则

匿名身份验证用户的这个 Firebase/Firestore 安全规则是不是安全?

Symfony 验证规则是不是随着更新而改变?

jquery 验证尚未创建的元素

如何使用 FxCop 自定义规则验证 DataReader 是不是实际关闭?

自定义验证规则,检查日期范围是不是已经被占用