【问题标题】:Validator - return all error messages验证器 - 返回所有错误消息
【发布时间】:2015-11-10 06:48:35
【问题描述】:

目前 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 方法看起来可以让我接近能够自己构造一些东西,但它是一个受保护的方法。

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

【问题讨论】:

    标签: php validation laravel laravel-5 laravel-5.1


    【解决方案1】:

    目前 Laravel 中的验证器似乎只为每个字段返回一条错误消息,尽管该字段可能有多个规则和消息。

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

    在您提供的示例中获取验证消息时,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();
    

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

    【讨论】:

    • 在尝试artisan serve 时获取[ReflectionException] Class translator does not exist。我试图在这里的一个香草项目上做到这一点:github.com/4lun/laravel-5.1-extend-validation-class/tree/master/…
    • 我更新了答案。注册必须在提供者的 boot() 方法中进行,而不是在 register() 中进行,因为调用 register() 时容器中还没有翻译器。我还将 Validator::resolve() 更改为 Validator::resolver()
    • 闭包中第一个参数 $data 的类型提示错误,删除它可以解决该问题,但会导致 $translator 的属性未定义,尽管删除 $this-&gt;translator 似乎有效。经过一番测试,我发现回调中的第一个参数可以用来传递 $translator: Validator::resolver(function ($translator, array $data, array $rules, array $messages, array $customAttributes) { return new \App\Validator($translator, $data, $rules, $messages, $customAttributes); }); 现在一切正常。非常感谢您的帮助!
    • 抱歉,因为我在复制不正确的方法签名之前采用了 resolve 而不是解析器方法 :) 我更新了答案,你能检查一下吗?
    猜你喜欢
    • 1970-01-01
    • 2015-11-20
    • 1970-01-01
    • 2017-08-15
    • 2018-04-30
    • 2014-11-15
    • 2021-04-08
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多