【问题标题】:Is there a validation rule for "not present"?“不存在”是否有验证规则?
【发布时间】:2015-04-30 02:36:14
【问题描述】:

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

这与“必需的”验证规则完全相反。

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

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

谢谢

编辑:

我目前正在使用 Laravel 5

编辑:

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

【问题讨论】:

  • 可能是您以错误的方式处理此问题。为什么数组中会出现不应该出现的键/值?在这种情况下,更新函数中的一些防御性编程可能会更好。
  • 我只是想确保没有人会将值传递给我不想更新的列。目前更新只应用在一个位置,所以如果需要我可以手动取消设置值,但将来可能会有更多的情况,我希望验证器阻止这种情况。

标签: php arrays validation laravel


【解决方案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 上应该可以。

      第一种方法extendImplicitarray_key_exists

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

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

      第二种方法extendfalse

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

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

      在文档上:

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

      重要提示:唯一的区别是使用extend,空字符串不会运行验证。但是如果你在中间件上设置了TrimStringsConvertEmptyStringsToNull(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
          • 再次感谢您的回答。毕竟,它让我找到了可行的解决方案。
          • 不客气。我不喜欢给出完整的解决方案。所以知道你会感觉很好,因为你自己解决了它,只是一个提示;-)
          猜你喜欢
          • 2021-01-11
          • 1970-01-01
          • 2018-03-16
          • 2020-10-12
          • 2016-09-27
          • 2016-08-03
          • 1970-01-01
          • 2011-10-25
          • 2015-05-22
          相关资源
          最近更新 更多