自定义 Laravel 验证消息。

80

我正在尝试为Laravel 5创建自定义验证消息。以下是我迄今为止尝试过的内容:

$messages = [
    'required'  => 'Harap bagian :attribute di isi.',
    'unique'    => ':attribute sudah digunakan',
];
$validator = Validator::make($request->all(), [
    'username' => array('required','unique:Userlogin,username'),
    'password' => 'required',
    'email'    => array('required','unique:Userlogin,email'),$messages
]);

if ($validator->fails()) { 
    return redirect('/')
        ->withErrors($validator) // send back all errors to the login form
        ->withInput();
} else {
    return redirect('/')
        ->with('status', 'Kami sudah mengirimkan email, silahkan di konfirmasi');   
}   

但是它没有起作用。消息仍然与默认消息相同。我该如何修复它,以便我可以使用我的自定义消息?


4
这些年来,没有人指出这个简单的打字错误。在“Validator::make()”函数内部,将“$messages”变量错误地放置在规则数组中。 - miken32
13个回答

124

Laravel 5.7.*

你也可以尝试以下方法。对我来说,这是在验证请求时制作自定义消息的最简单的方式:

public function store()
{
    request()->validate([
        'file' => 'required',
        'type' => 'required'
    ],
    [
        'file.required' => 'You have to choose the file!',
        'type.required' => 'You have to choose type of the file!'
    ]);
}

4
由于时间紧迫,我需要在一个地方完成这项任务,所以这对我来说是最容易的。虽然这很方便,但如果您需要在多个地方使用自定义消息,将它们全部放在一个地方会更明智。这样可以更轻松地跟踪,并且使代码更易读,而不是在每个验证语句中都有自定义消息。我点赞了你的回答,因为它符合我的特殊用例,并且我想感谢你(尽管,SO不建议感谢和me too帖子,但你需要知道你帮助我解决了问题,我按时完成了任务)。 - Mexen
非常感谢 @Mexen,我很高兴能够帮助! - Jankyz
@Geo4you 非常感谢,这真的帮了我很多。 - Masood

101
如果你使用最简单的$this->validate(),那么你应该编写类似以下代码的内容。
$rules = [
        'name' => 'required',
        'email' => 'required|email',
        'message' => 'required|max:250',
    ];

    $customMessages = [
        'required' => 'The :attribute field is required.'
    ];

    $this->validate($request, $rules, $customMessages);

2
我应该用什么来填充$request变量? - Luis Alfredo Serrano Díaz

32
您可以提供自定义的消息,例如:
$rules = array(
            'URL' => 'required|url'
        );    
$messages = array(
                'URL.required' => 'URL is required.'
            );
$validator = Validator::make( $request->all(), $rules, $messages );

if ( $validator->fails() ) 
{
    return [
        'success' => 0, 
        'message' => $validator->errors()->first()
    ];
}

或者

你尝试的方法中,你错过了 Validator::replacer() 函数,这个函数可以替换掉 :variable

Validator::replacer('custom_validation_rule', function($message, $attribute, $rule, $parameters){
    return str_replace(':foo', $parameters[0], $message);
});

你可以从这里阅读更多内容,并且替换器可在这里找到。


有没有使用它的示例? - YVS1102
为第一种方法添加了示例。 - Jigar Shah

31

对于 Laravel 8.x、7.x、6.x,一旦自定义规则定义完成,您可以在控制器验证中像这样使用:


Translated:

For Laravel 8.x, 7.x, 6.x, once the custom rule is defined, you can use it in your controller validation like this:

$validatedData = $request->validate([
       'f_name' => 'required|min:8',
       'l_name' => 'required',
   ],
   [
    'f_name.required'=> 'Your First Name is Required', // custom message
    'f_name.min'=> 'First Name Should be Minimum of 8 Character', // custom message
    'l_name.required'=> 'Your Last Name is Required' // custom message
   ]
);

你可以使用以下内容来进行本地化:

['f_name.required'=> trans('user.your first name is required'],

希望这有所帮助...


1
太棒了!我在文档中错过了这个。谢谢你! - Nick

13
$rules = [
  'username' => 'required,unique:Userlogin,username',
  'password' => 'required',
  'email'    => 'required,unique:Userlogin,email'
];

$messages = [
  'required'  => 'The :attribute field is required.',
  'unique'    => ':attribute is already used'
];

$request->validate($rules,$messages);
//only if validation success code below will be executed

这与一年前发布的先前的答案相同。 - miken32

7

如果您将请求作为单独的文件使用:

 public function rules()
 {
    return [
        'preparation_method' => 'required|string',
    ];
 }

public function messages()
{
    return [
        'preparation_method.required' => 'Description is required',
    ];
}

在 Laravel 6+ 中进行了测试


7

运行以下命令在Laravel上创建自定义规则
假设名称为CustomRule

php artisan make:rule CustomRule

因此,类似于PHP代码的命令被创建出来。

如果所需关键字不在规则中,该规则将不起作用。

<?php

namespace App\Rules;

use Illuminate\Contracts\Validation\Rule;

class CustomRule implements Rule
{
    /**
     * Create a new rule instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    /**
     * Determine if the validation rule passes.
     *
     * @param  string  $attribute
     * @param  mixed  $value
     * @return bool
     */
    public function passes($attribute, $value)
    {
        //return  true or false
    }

    /**
     * Get the validation error message.
     *
     * @return string
     */
    public function message()
    {
        return 'The validation error message.';
    }
}


现在是时候使用它了,但首先如果我们没有,应该创建一个请求类。

php artisan make:request CustomRequest

CustomRequest.php

<?php


namespace App\Http\Requests\Payment;

use App\Rules\CustomRule;
use Illuminate\Foundation\Http\FormRequest;

class CustomRequest extends FormRequest
{


    /**
     * Get the validation rules that apply to the request.
     *
     * @return array
     */
    public function rules(): array
    {
        return [
            'custom' => ['required', new CustomRule()],
        ];
    }

    /**
     * @return array|string[]
     */
    public function messages(): array
    {
        return [
            'custom.required' => ':attribute can not be empty.',
        ];
    }
}

在您的控制器上,您应该向控制器注入自定义请求

您的控制器方法

class FooController
{
    public function bar(CustomRequest $request)
    {
        
    }
}


7
//Here is the shortest way of doing it.
 $request->validate([
     'username' => 'required|unique:Userlogin,username',
     'password' => 'required',
     'email'    => 'required|unique:Userlogin,email'
 ],
 [
     'required'  => 'The :attribute field is required.',
     'unique'    => ':attribute is already used'
 ]);
//The code below will be executed only if validation is correct.

5
    $rules = [
        'name' => 'required',
        'email' => 'required|email',
        'message' => 'required|max:250',
    ];

    $customMessages = [
        'required' => 'The :attribute field is required.',
        'max' => 'The :attribute field is may not be greater than :max.'
    ];

    $this->validate($request, $rules, $customMessages);

5

对于那些未能解决这个问题的人(在 Laravel 8.x 上测试通过):

$validated = Validator::make($request->all(),[
   'code' => 'required|numeric'
  ],
  [
    'code.required'=> 'Code is Required', // custom message
    'code.numeric'=> 'Code must be Number', // custom message       
   ]
);

//Check the validation
if ($validated->fails())
{        
    return $validated->errors();
}

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