表单请求验证中的 Laravel“独特”自定义消息验证

Posted

技术标签:

【中文标题】表单请求验证中的 Laravel“独特”自定义消息验证【英文标题】:Laravel "unique" Custom Message Validation in Form Request Validation 【发布时间】:2019-11-27 13:35:04 【问题描述】:

我创建了表单请求验证,但在为多个“唯一”验证器自定义自定义验证消息时遇到问题

我创建了文档中说的函数,但是它没有显示我的消息,而是显示默认消息(电子邮件:[“电子邮件已被占用。”])

/**
 * Get the validation rules that apply to the request.
 *
 * @return array
 */
public function rules()

    return [
        'email' => "required|string|email|unique:table1,email|unique:table2,email"
    ];


/**
 * Get the error messages for the defined validation rules.
 *
 * @return array
 */
public function messages()

    return [
        "email.unique:table1,email" => "Error message for table 1",
        "email.unique:table2,email" => "Completely different error message for table 2"
    ];

如果我使用,我可以输出自定义结果:

public function messages()

    return [
        "email.unique" => "Same message for table 1 and table 2 error messages" 
    ];

但这不是我想要的,我想单独自定义消息,我应该怎么做?

【问题讨论】:

我认为你需要两个不同的请求 @MateusJunges 你所说的两个不同的请求是什么意思? 【参考方案1】:

你不能用这个:

public function messages()

    return [
        "email.unique:table1,email" => "Error message for table 1",
        "email.unique:table2,email" => "Completely different error message for table 2"
    ];

您无法通过表名来区分这两个唯一规则。

我的建议:

您可以创建自己的自定义验证规则 (check the docs) 以应用 unique:table1unique:table2,名称不同(例如:unique_first_table 和 unique_second_table)。然后你可以这样做:

$messages = [
    'email.unique_table_1' => 'Error message for table 1',
    'email.unique_table_2' => 'Completely different error message for table 2',
];

自定义验证规则:

在您的 AppServiceProvider 文件中,输入以下代码:

use Validator;

//In the boot method:
Validator::extend('unique_table_1', function ($attribute, $value, $parameters, $validator) 
    if(ModelFirstTable::where('email', $value)->count() > 0)
        return false;
    return true;
);

Validator::extend('unique_table_2', function ($attribute, $value, $parameters, $validator) 
    if(ModelSecondTable::where('email', $value)->count() > 0)
        return false;
    return true;
);

ModelFirstTableModelSecondTable 必须分别替换为您的第一个和第二个表的模型名称。

然后,在您的表单请求中使用它:

public function rules()

    return [
        'email' => "required|string|email|unique_table_1|unique_table_2"
    ];


public function messages()

     return [
        "email.unique_table_1" => "Error message for table 1",
        "email.unique_table_2" => "Completely different error message for table 2"
    ];

希望对你有帮助。

【讨论】:

谢谢!这是工作! 很高兴能帮到你!

以上是关于表单请求验证中的 Laravel“独特”自定义消息验证的主要内容,如果未能解决你的问题,请参考以下文章

Laravel Spark 中的自定义验证消息

自定义laravel表单请求验证类(FormRequest共用一个rules())

在 Laravel 5 中使用表单请求验证时如何添加自定义验证规则

Laravel 自定义验证消息参数

Laravel 5.5 FormRequest 自定义表单请求验证类

laravel api 验证自定义消息