我需要检查是否使用Laravel验证器在数组中设置密钥。这与“必需的”验证规则完全相反。基本上,如果数组通过验证,它将被传递给update方法,我想确保其中一列不会被更新。是否有方法检查值“不存在”?谢谢你
编辑:
我现在用的是Laravel 5
我通过调用Validator::extendImplicit编写了自己的验证规则。但是,无论我将$value设置为null还是根本不设置它,我都将它作为null添加到验证函数中。有没有办法检查是否设置了值?
cwtwac6a1#
我想我找到了一个解决办法:
$validator->extendImplicit('not_present', function($attribute, $value, $parameters) { return !array_key_exists($attribute, $this->data); });
我不是静态调用extendImplicit,因为Validator类对象被注入到类的控制器中。我需要访问$this-〉data($this指的是Validator对象)以确保键不存在于正在验证的数组中。
g52tjvyc2#
基于@MaGnetas的回答,我提出了这两条规则,可以应用于任何模型。我用的是Laravel 5。4所以把这几行放在你的AppServiceProvider.php上应该可以工作。
AppServiceProvider.php
第一种方法(extendImplicit和array_key_exists)
extendImplicit
array_key_exists
Validator::extendImplicit('not_present', function($attribute, $value, $parameters, $validator) { return !array_key_exists($attribute, $validator->getData()); });
使用$validator->getData(),我们可以静态地使用Validator。
$validator->getData()
第二种方法(extend和false)
extend
false
Validator::extend('not_present', function($attribute, $value, $parameters, $validator) { return false; });
您可以使用extend,因为如果数据没有属性,我们不需要执行规则(因为这正是我们想要的,对吗?)关于文档:默认情况下,当正在验证的属性不存在或包含所需规则定义的空值时,不运行常规验证规则(包括自定义扩展)。更多资讯
重要:唯一的区别是使用extend,空字符串将不会运行验证。但是如果您在中间件上设置了TrimStrings和ConvertEmptyStringsToNull(默认选项为AFAIK),则不会有任何问题
TrimStrings
ConvertEmptyStringsToNull
bjp0bcyl3#
不,没有内置的验证规则,但您可以创建自己的验证规则。最简单的方法是:
Validator::extend('foo', function($attribute, $value, $parameters) { // Do some stuff });
并检查密钥是否存在。更多信息: www.example.com
drnojrws4#
对于在7中寻找非当前逻辑的人。x apps(适用于所有版本),请记住,您可以简单地使用经过验证的数据数组来获得相同的结果。
$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规则,但最终这样做的结果和概念逻辑是非常相同的。只是从另一个Angular 。
not_present
yrdbyhpb5#
我知道这个问题很老了,但你也可以用
'email' => 'sometimes|required|not_regex:/^/i',
如果email出现在请求中,正则表达式将匹配请求中的任何字符,如果email是空字符串但出现在请求中,则有时会匹配**。|required**将捕获它。
atmip9wb6#
从Laravel 8开始,有禁止字段的验证规则。这里有一个例子
Validator::make($data, [ 'is_minor' => true, 'tos_accepted' => true ], [ 'tos_accepted' => 'prohibited_if:is_minor,true' ]);
Prohibited Validation Rules in LaravelLaravel文档
6条答案
按热度按时间cwtwac6a1#
我想我找到了一个解决办法:
我不是静态调用extendImplicit,因为Validator类对象被注入到类的控制器中。
我需要访问$this-〉data($this指的是Validator对象)以确保键不存在于正在验证的数组中。
g52tjvyc2#
基于@MaGnetas的回答,我提出了这两条规则,可以应用于任何模型。我用的是Laravel 5。4所以把这几行放在你的
AppServiceProvider.php
上应该可以工作。第一种方法(
extendImplicit
和array_key_exists
)使用
$validator->getData()
,我们可以静态地使用Validator。第二种方法(
extend
和false
)您可以使用
extend
,因为如果数据没有属性,我们不需要执行规则(因为这正是我们想要的,对吗?)关于文档:
默认情况下,当正在验证的属性不存在或包含所需规则定义的空值时,不运行常规验证规则(包括自定义扩展)。更多资讯
重要:唯一的区别是使用
extend
,空字符串将不会运行验证。但是如果您在中间件上设置了TrimStrings
和ConvertEmptyStringsToNull
(默认选项为AFAIK),则不会有任何问题bjp0bcyl3#
不,没有内置的验证规则,但您可以创建自己的验证规则。
最简单的方法是:
并检查密钥是否存在。更多信息: www.example.com
drnojrws4#
对于在7中寻找非当前逻辑的人。x apps(适用于所有版本),请记住,您可以简单地使用经过验证的数据数组来获得相同的结果。
我的模型有更多的属性,但只有这两个应该是可更新的,因此我也在寻找一个
not_present
规则,但最终这样做的结果和概念逻辑是非常相同的。只是从另一个Angular 。yrdbyhpb5#
我知道这个问题很老了,但你也可以用
如果email出现在请求中,正则表达式将匹配请求中的任何字符,如果email是空字符串但出现在请求中,则有时会匹配**。|required**将捕获它。
atmip9wb6#
从Laravel 8开始,有禁止字段的验证规则。这里有一个例子
Prohibited Validation Rules in Laravel
Laravel文档