【问题标题】:Laravel Validation: grouped validationLaravel 验证:分组验证
【发布时间】:2016-09-01 14:45:19
【问题描述】:

我正在尝试向我的请求验证器中添加一组字段的验证,以确保该组字段不超过一定数量。用户提交表单后,他们可以以 pdf 形式查看它,我的目标是确保 f_namem_namel_name 的集合不会遇到 pdf 上的另一组文本(从而使它难以辨认)。

基本上,我想要这样的东西:

public function rules()
{
  return [
    'f_name' + 'm_name' + 'l_name' => 'max:50',
    ...
  ];
}

我已经搜索了所有内容,但我能找到的唯一相关问题就是如何进行验证。如果有人知道如何在验证中对值进行分组或链接到以前提出的问题,请告诉我。谢谢小伙伴们。

【问题讨论】:

  • 我认为您可以使用自定义验证器并将多个字段传递给它,这里有一个示例有点旧但我相信它仍然有效laravel.io/forum/…
  • 是否要将=> 'max:50', 应用于所有'f_name' + 'm_name' + 'l_name'
  • @Abbasi 将 'max:50' 应用到每个字段将给我总共 150 的最大值,然后将在页面上的其他文本中运行。我正在寻找 3 个不超过 50 个。
  • 在这种情况下,我认为自定义验证器将是@Igomezma 提到的不错选择
  • 确实如此。我目前正在调查。我以前从来没有搞乱过扩展核心 Laravel,所以我可能需要一段时间才能弄清楚在哪里以及如何扩展它。

标签: php validation laravel


【解决方案1】:

Laravel 不支持使用一个规则堆栈进行多字段验证。尝试编写自定义验证器或重新发明轮子:

public function rules()
{
    $fields = [
        "max: 50" => ["f_name", "m_name", "l_name"]
    ];
    $rules = [];

    foreach($fields as $rule => $fieldArray){
        if(is_array($fieldArray)){
            foreach($fieldArray as $field){
                $rules[$field] = $rule; 
            } 
        }
    }
  return $rules;
}

【讨论】:

  • 他不希望每个都最多 50 个,他希望串联最多 50 个。
  • @JoelHinz 好的)thanx,我刚刚阅读了评论)然后他应该使用自定义验证器)
【解决方案2】:

您需要一个自定义验证器,以便添加多个字段。 在您的 AppServiceProvider 中,如下所示:

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Validator::extend('groupedFieldsLongerThan50', function($attribute, $value, $parameters, $validator) {
            $f_name = array_get($this->data, $parameters[0]);
            $m_name = array_get($this->data, $parameters[1]);
            $l_name = array_get($this->data, $parameters[2]);

            if((strlen($f_name)+strlen($m_name)+strlen($l_name))<=50)
                  return true;

            return false;
        });
    }

    ...

在声明规则的地方添加:

'f_name' => 'groupedFieldsLongerThan50:f_name,m_name,l_name'

【讨论】:

  • 这给了我一个Undefined variable: data 错误,因为$this = AppServiceProvider 而不是Validator... 有什么办法可以解决这个问题?我尝试将$this 更改为$validator,但我无法访问其受保护的属性。
猜你喜欢
  • 2019-02-21
  • 2018-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-17
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多