如何在Laravel表单验证错误消息中使用自定义字段名

27

我正在尝试在Laravel中进行表单验证。我的表单中有一个名为“Category”的输入文本字段,而我将该字段名称缩写为“cat”。

我定义了以下验证规则:

public static $rules=array(
         "name"=>"required|min:3",
          "cat"=>"required"
           );

当验证失败时,我会得到如下错误消息

The name field is required.
The cat field is required.

但我希望将其显示为"The category field is required"而不是'cat'。
我如何在错误消息中更改'cat'为'Category'?

但是我想要把它显示为“类别字段是必需的”,而不是“cat”。
我该如何在错误信息中将“cat”更改为“Category”?

9个回答

48
您可以按照以下方式为您的字段指定自定义错误消息。
$messages = array(
    'cat.required' => 'The category field is required.',
);

$validator = Validator::make($input, $rules, $messages);
请参考Laravel文档中的自定义错误信息部分获取更多信息。
或者您可以像下面这样为您的字段名称保留一个映射关系。您可以将它们设置到验证器中。这样,您就可以看到描述性的名称,而不是真实的字段名称。
$attributeNames = array(
   'name' => 'Name',
   'cat' => 'Category',     
);

$validator = Validator::make ( Input::all (), $rules );
$validator->setAttributeNames($attributeNames);

1
好的,这很有帮助。但是我需要为必需、最小值、最大值等指定单独的消息,对吧?对于大型表单来说,这需要花费很多时间。你知道有没有一种方法可以在一行中更改所有类型的错误消息吗? - JOE
你只想将“cat”映射到“category”字段中,是吗?因此,默认消息将显示带有“categroy”文本。 - uiroshan
这是我一直梦寐以求的解决方案:D 谢谢! - Altin
1
attributeNames现在是make()方法的第三个参数。不再需要使用setter进行设置。 - Jason

28

您可以自定义每条消息,也可以在validation.php(resources/lang/en/)中更改属性字段名称。 要设置validation.php中的属性,请执行以下操作:

'attributes' => [
   'name' => 'Name',
   'cat' => 'Category',
   'field_name'=>'your attribute'
],

6
这应该是被采纳的答案。简单而甜美。 - Sw0ut

22

我正在使用它来处理表单中的动态行添加。这个答案是在管理较大的表单的情况下提供的。 这个答案适用于Laravel 5

表单请求

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;
use Response;

class SomeThingFormRequest extends Request {

public function authorize()
{
 //be nice
}

public function rules()
{
//my loop building an array of rules ex: $rules['thing.attribute.'.$x]
}

public function attributes()
{
    return [
        'thing.attribute'.$x => 'Nice Name',
    ];
}

如果您正在使用Laravel 5,希望这能为您指明正确的方向。我目前正在测试它。文档似乎在涉及此问题时存在一些疏漏?

我在框架(Illuminate\Foundation\Http\FormRequest.php)和(Illuminate\Validation\Validator.php)中进行了一些探索以寻找线索。


19

这里有一个替代方案: $this->validate(request(), [规则], [自定义消息], [自定义属性名]);

            $this->validate(request(), [
                'fname' => "required|alpha_dash|max:20",
                'lname' => "required|alpha_dash|max:30",
                'extensionName' => "required|alpha_dash|max:20",
                'specialization' => "max:100",
                'subSpecialization' => "max:100"
            ], [], 
            [
                'fname' => 'First Name',
                'lname' => 'Last Name',
                'extensionName' => 'Extension Name',
                'specialization'=> 'Specialization',
                'subSpecialization'=> 'Sub Specialization'
            ]);

这对我来说已经足够了,谢谢。 - Ethem

5

只需前往 resources/lang/en/validation.php

那里有一个名为attributes的空数组。

在此添加您的属性名称,例如'cat'=>'category'

现在所有验证消息都会显示类别而不是猫。


1
在Laravel 8中,这是定制验证属性和消息的最佳方式。
$request->validate([
            'cat' => "required| min:7 |max:15"
            //validation Area
        ], 
       [
        //customize Message
       ], 
        [
            'cat' => 'Category'
            //Customize Attributes Name
        ]);

1
我想这样就可以了:

我认为这样就可以了:

Validator::make($request->all(), [
  "name" => "required|min:3",
  "cat" => "required"
], [], [
  "cat" => "category"
])->validate();

1
这是一个替代方案:

$data = ['name' => e(Input::get('name')), 'cat' => e(Input::get('cat'))];
$rules = ['name' => 'required|min:3', 'cat' => 'required'];
// pass an item from lang array if you need to
$nice_input_names = ['cat' => trans('lang_file.a_name_for_the_category_input')];

$validator = Validator::make($data, $rules, $messages, $nice_input_names);

如何在Request类文件中实现此操作 - Amarjit Singh

0

Paul Dela Vega的回答对我非常有帮助,但由于声望不够,无法发表评论。

Laravel Docs (8.x)中没有任何关于此的信息。也许这是一个很好的建议,可以将其添加到Laravel文档中,因为它对像我这样的初学者非常有帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接