我需要检查是否使用Laravel验证器在数组中设置了密钥。
这将是"必需"的完全相反。验证规则。
基本上,如果数组通过验证,则会将数组传递给update方法,并且我想确保一列不会更新。
有没有办法检查值"是否不存在"?
谢谢
修改
我目前正在使用Laravel 5
修改
我设法通过调用Validator :: extendImplicit来编写自己的验证规则。但是当我将它设置为null或者根本不设置它时,我将$ value作为null给我的验证函数。有没有办法检查是否设置了值?
答案 0 :(得分:2)
此处没有构建验证规则,但您可以创建自己的验证规则。
最简单的方法:
Validator::extend('foo', function($attribute, $value, $parameters)
{
// Do some stuff
});
检查密钥是否存在。 更多信息: http://laravel.com/docs/4.2/validation#custom-validation-rules
答案 1 :(得分:2)
我相信我找到了解决方案:
$validator->extendImplicit('not_present', function($attribute, $value, $parameters)
{
return !array_key_exists($attribute, $this->data);
});
我没有静态调用extendImplicit,因为Validator类对象被注入到我的类的控制器中。
我需要访问$ this-> data($ this引用Validator对象)以确保要验证的数组中不存在该键。
答案 2 :(得分:1)
基于@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()
,我们可以静态使用Validator。
第二种方法(extend
和false
)
Validator::extend('not_present', function($attribute, $value, $parameters, $validator)
{
return false;
});
您可以使用extend
,因为如果数据不具有该属性,我们就不需要执行规则(因为这正是我们想要的对吗?)
在文档上:
默认情况下,当不存在正在验证的属性或包含所需规则定义的空值时,不会运行包括定制扩展名在内的常规验证规则。 more info
重要:唯一的区别是使用extend
时,空字符串将不会运行验证。但是,如果您在中间件上设置了TrimStrings
和ConvertEmptyStringsToNull
(默认设置为AFAIK),将没有问题
答案 3 :(得分:0)
对于在 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
规则,但最终这样做了,因为结果和概念逻辑非常相同。换个角度看。
答案 4 :(得分:0)
我知道这个问题真的很老,但你也可以使用
'email' => 'sometimes|required|not_regex:/^/i',
如果电子邮件存在于请求中,正则表达式将匹配请求中的任何字符,如果电子邮件是空字符串但存在于请求中,则有时|需要 strong> 会抓住那个。