“不存在”是不是有验证规则?
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
上应该可以。
第一种方法(extendImplicit
和array_key_exists
)
Validator::extendImplicit('not_present', function($attribute, $value, $parameters, $validator)
return !array_key_exists($attribute, $validator->getData());
);
使用$validator->getData()
,我们可以静态使用验证器。
第二种方法(extend
和false
)
Validator::extend('not_present', function($attribute, $value, $parameters, $validator)
return false;
);
您可以使用extend
,因为如果数据没有属性,我们不需要执行规则(因为这正是我们想要的对吗?)
在文档上:
默认情况下,当正在验证的属性不存在或包含所需规则定义的空值时,不会运行正常的验证规则,包括自定义扩展。 more info
重要提示:唯一的区别是使用extend
,空字符串不会运行验证。但是如果你在中间件上设置了TrimStrings
和ConvertEmptyStringsToNull
(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 安全规则是不是安全?