"not present" 是否有验证规则?
Is there a validation rule for "not present"?
我需要使用 Laravel 验证器检查数组中是否未设置密钥。
这与 "required" 验证规则完全相反。
基本上,如果通过验证,数组将被传递给更新方法,我想确保一列不会被更新。
有没有办法检查值是否 "is not present"?
谢谢
编辑:
我目前正在使用 Laravel 5
编辑:
我通过调用 Validator::extendImplicit 设法编写了自己的验证规则。但是,当我将它设置为 null 或根本不设置它时,我的验证函数都将 $value 设置为 null。有没有办法检查该值是否已设置?
不,没有针对此的内置验证规则,但您可以创建自己的验证规则。
最简单的方法:
Validator::extend('foo', function($attribute, $value, $parameters)
{
// Do some stuff
});
并检查密钥是否存在。
更多信息:
http://laravel.com/docs/4.2/validation#custom-validation-rules
我相信我找到了解决方案:
$validator->extendImplicit('not_present', function($attribute, $value, $parameters)
{
return !array_key_exists($attribute, $this->data);
});
我没有静态调用 extendImplicit,因为验证器 class 对象被注入到我的 class.
的控制器中
我需要访问 $this->data ($this 指的是 Validator 对象) 以确保密钥不存在于正在验证的数组中。
根据@MaGnetas 的回答,我得出了这 2 条可以应用于任何模型的规则。
我正在使用 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
,因为如果数据没有 属性,我们不需要执行规则(因为这正是我们想要的,对吧?)
在文档上:
By default, when an attribute being validated is not present or contains an empty value as defined by the required rule, normal validation rules, including custom extensions, are not run. more info
重要:唯一的区别是使用extend
,空字符串不会运行验证。但是如果你在中间件上设置 TrimStrings
和 ConvertEmptyStringsToNull
(AFAIK 是默认选项)就不会有问题
对于在 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
规则,但最终还是这样做了,因为结果和概念逻辑是完全相同的。只是从另一个角度看。
我知道这个问题真的很老但是你也可以使用
'email' => 'sometimes|required|not_regex:/^/i',
如果请求中存在 email,则正则表达式将匹配请求中的任何字符,如果电子邮件是空字符串但存在于请求中,则 有时|需要 会捕捉到。
我需要使用 Laravel 验证器检查数组中是否未设置密钥。
这与 "required" 验证规则完全相反。
基本上,如果通过验证,数组将被传递给更新方法,我想确保一列不会被更新。
有没有办法检查值是否 "is not present"?
谢谢
编辑:
我目前正在使用 Laravel 5
编辑:
我通过调用 Validator::extendImplicit 设法编写了自己的验证规则。但是,当我将它设置为 null 或根本不设置它时,我的验证函数都将 $value 设置为 null。有没有办法检查该值是否已设置?
不,没有针对此的内置验证规则,但您可以创建自己的验证规则。
最简单的方法:
Validator::extend('foo', function($attribute, $value, $parameters)
{
// Do some stuff
});
并检查密钥是否存在。 更多信息: http://laravel.com/docs/4.2/validation#custom-validation-rules
我相信我找到了解决方案:
$validator->extendImplicit('not_present', function($attribute, $value, $parameters)
{
return !array_key_exists($attribute, $this->data);
});
我没有静态调用 extendImplicit,因为验证器 class 对象被注入到我的 class.
的控制器中我需要访问 $this->data ($this 指的是 Validator 对象) 以确保密钥不存在于正在验证的数组中。
根据@MaGnetas 的回答,我得出了这 2 条可以应用于任何模型的规则。
我正在使用 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
,因为如果数据没有 属性,我们不需要执行规则(因为这正是我们想要的,对吧?)
在文档上:
By default, when an attribute being validated is not present or contains an empty value as defined by the required rule, normal validation rules, including custom extensions, are not run. more info
重要:唯一的区别是使用extend
,空字符串不会运行验证。但是如果你在中间件上设置 TrimStrings
和 ConvertEmptyStringsToNull
(AFAIK 是默认选项)就不会有问题
对于在 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
规则,但最终还是这样做了,因为结果和概念逻辑是完全相同的。只是从另一个角度看。
我知道这个问题真的很老但是你也可以使用
'email' => 'sometimes|required|not_regex:/^/i',
如果请求中存在 email,则正则表达式将匹配请求中的任何字符,如果电子邮件是空字符串但存在于请求中,则 有时|需要 会捕捉到。