php - 验证器 - 返回所有错误消息

标签 php validation laravel laravel-5 laravel-5.1

目前,Laravel 中的验证器似乎只为每个字段返回一条错误消息,尽管该字段可能具有多个规则和消息。 (注意:我目前正在将一个空数组作为 $data 传递给 Validator::make)

我想做的是构建每个字段的规则和消息的数组,这些规则和消息可能会重新用于前端验证。像这样的事情:

{
    "name": {
        "required": [
            "The name field is required."
        ],
        "max:255": [
            "The name field may not be greater than 255."
        ]
    },
    "email": {
        "required": [
            "The email field is required."
        ],
        "email": [
            "The email field must be a valid email address."
        ],
        "max:255": [
            "The email field may not be greater than 255."
        ]
    }
}

Illuminate\Validation\Validator 中的 getMessage 方法看起来会让我接近能够自己构建一些东西,但它是一个 protected 方法。

有人知道如何让 Validator 实例输出所有规则和消息吗?

最佳答案

Currently the Validator in Laravel only appears to return one error message per field, despite the field potentially having multiple rules and messages.

一旦单个验证规则失败,给定字段的验证就会停止。这就是每个字段仅收到一条错误消息的原因。

像您提供的示例中那样获取验证消息,Laravel 的验证器不提供此类选项,但您可以通过扩展 Validator 类轻松实现这一点。

首先,创建新类:

<?php namespace Your\Namespace;

use Illuminate\Validation\Validator as BaseValidator;

class Validator extends BaseValidator {
  public function getValidationMessages() {
    $messages = [];
    foreach ($this->rules as $attribute => $rules) {
      foreach ($rules as $rule) {
        $messages[$attribute][$rule] = $this->getMessage($attribute, $rule);
      }
    } 

    return $messages;
  }
}

正如您所看到的,输出与您的示例略有不同。不需要为给定的属性和规则返回消息数组,因为数组中始终只有一条消息,因此我只在那里存储一个字符串。

其次,您需要确保使用您的验证器类。为了实现这一点,您需要使用Validator外观注册您自己的验证器解析器:

Validator::resolver(function($translator, array $data, array $rules, array $messages, array $customAttributes) {
  return new \Your\Namespace\Validator($translator, $data, $rules, $messages, $customAttributes);
});

您可以在 AppServiceProvider::boot() 方法中执行此操作。

现在,为了获取给定验证器的验证消息,您只需调用:

Validator::make($data, $rules)->getValidationMessages();

请记住,此代码尚未经过测试。如果您发现代码有任何问题或拼写错误,请告诉我,我将非常乐意为您解决问题。

关于php - 验证器 - 返回所有错误消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32053668/

相关文章:

php - 如何在PHP中使用foreach循环MYSQL月at将月份添加到+1个月?

php - 没有可见的感谢页面的Google Analytics(分析)电子商务跟踪

JavaScript 数组不使用 Ajax 发布到 PHP 文件

php - 'onclick' 似乎没有调用带有 'submit' 按钮的函数

javascript - JQuery 验证失败

java - 在用户输入时验证数据类型

java - 在哪一层实现 validator dao 响应?

php - 查询生成器 laravel 中的算术运算

php - 如何区分要抛出,授权或验证的错误?

拉拉维尔。每个用户的多个 channel 或个人 channel ?