Laravel在表单请求验证中的“唯一”自定义消息验证

时间:2019-07-18 14:59:32

标签: laravel validation request unique message

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

我按照文档中的说明创建了该功能,但是它并未显示我的信息,而是默认信息(电子邮件:[“电子邮件已被接收。”])

/**
 * 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" 
    ];
}

但这不是我想要的,我想分别定制消息,我应该怎么做?

1 个答案:

答案 0 :(得分:0)

您不能使用此:

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;
});
  

ModelFirstTable ModelSecondTable 必须分别用第一个和第二个表的模型名称替换。

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

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"
    ];
}

希望有帮助。