是否存在"不存在"的验证规则?

时间:2015-02-27 11:30:55

标签: php arrays validation laravel

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

这将是"必需"的完全相反。验证规则。

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

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

谢谢

修改

我目前正在使用Laravel 5

修改

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

5 个答案:

答案 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上。

第一种方法extendImplicitarray_key_exists

Validator::extendImplicit('not_present', function($attribute, $value, $parameters, $validator)
{
    return !array_key_exists($attribute, $validator->getData());
});

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

第二种方法extendfalse

Validator::extend('not_present', function($attribute, $value, $parameters, $validator)
{
    return false;
});

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

在文档上:

  

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

重要:唯一的区别是使用extend时,空字符串将不会运行验证。但是,如果您在中间件上设置了TrimStringsConvertEmptyStringsToNull(默认设置为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> 会抓住那个。