Laravel 5.5 使用自定义消息进行验证

Laravel 5.5 validate with custom messages

我正在 laravel 应用程序中处理密码更改表。我想将验证器与自定义错误消息一起使用。

我的代码如下所示:

  $rules = [
    'username' => 'required|max:255',
    'oldpassword' => 'required|max:255',
    'newpassword' => 'required|min:6|max:255|alpha_num',
    'newpasswordagain' => 'required|same:newpassword',
  ];
  $messages = [
     'username.required' => Lang::get('userpasschange.usernamerequired'),
     'username.max:255' => Lang::get('userpasschange.usernamemax255'),
     'oldpassword.required' => Lang::get('userpasschange.oldpasswordrequired'),
     'oldpassword.max:255' => Lang::get('userpasschange.oldpasswordmax255'),
     'newpassword.required' => Lang::get('userpasschange.newpasswordrequired'),
     'newpassword.min:6' => Lang::get('userpasschange.newpasswordmin6'),
     'newpassword.max:255' => Lang::get('userpasschange.newpasswordmax255'),
     'newpassword.alpha_num' => Lang::get('userpasschange.newpasswordalpha_num'),
     'newpasswordagain.required' => Lang::get('userpasschange.newpasswordagainrequired'),
     'newpasswordagain.same:newpassword' => Lang::get('userpasschange.newpasswordagainsamenewpassword'),
 ];

  $validator = Validator::make($request->all(), $rules, $messages);
  $validator->setCustomMessages($messages);

  Log::debug("custommessages: " . json_encode($messages));
  Log::debug("messages: " . json_encode($validator->messages()));

在日志中 custommessages 显示了我的自定义消息,但在下一行是原始的 messages

我在official doc工作。

有人遇到过这个问题吗?

谢谢提前回答!

Validator::make

中指明消息后
$validator = Validator::make($request->all(), $rules, $messages);

你不应该再指出它们

$validator->setCustomMessages($messages); // don't do that

注意

使用请求验证的更好方法是移动them to another file

重写和推荐的实现方式。 参考手册https://laravel.com/docs/5.5/validation#creating-form-requests

使用请求文件。

  1. 运行 php artisan make:request UpdateUserPasswordRequest
  2. 写入请求文件

2020 年 2 月编辑:在授权方法的最新版本 Laravel 中,可以使用全局 auth() 对象代替 \Auth,因此 \Auth::check() 将变为 auth()- >检查()。如果从框架中删除某些内容,两者仍然有效并会更新

 <?php
     
     namespace App\Http\Requests;
 
     class UpdateUserPasswordRequest extends FormRequest
     {
         /**
          * Determine if the user is authorized to make this request.
          *
          * @return bool
          */
         public function authorize()
         {
             // only allow updates if the user is logged in
             return \Auth::check();
              // In laravel 8 use Auth::check() 
             // edit you can now replace this with return auth()->check();
         }
     
         /**
          * Get the validation rules that apply to the request.
          *
          * @return array
          */
         public function rules()
         {
             return [
                 'username' => 'required|max:255',
                 'oldpassword' => 'required|max:255',
                 'newpassword' => 'required|min:6|max:255|alpha_num',
                 'newpasswordagain' => 'required|same:newpassword',
             ];
         }
     
         /**
          * Get the validation attributes that apply to the request.
          *
          * @return array
          */
         public function attributes()
         {
             return [
                 'username'            => trans('userpasschange.username'),
                 'oldpassword'             => trans('userpasschange.oldpassword'),
                 'newpassword'             => trans('userpasschange.newpassword'),
                 'newpasswordagain'       => trans('userpasschange.newpasswordagain'),
             ];
         }
     
         /**
          * Get the validation messages that apply to the request.
          *
          * @return array
          */
         public function messages()
         {
     // use trans instead on Lang 
             return [
          'username.required' => Lang::get('userpasschange.usernamerequired'),
          'oldpassword.required' => Lang::get('userpasschange.oldpasswordrequired'),
          'oldpassword.max' => Lang::get('userpasschange.oldpasswordmax255'),
          'newpassword.required' => Lang::get('userpasschange.newpasswordrequired'),
          'newpassword.min' => Lang::get('userpasschange.newpasswordmin6'),
          'newpassword.max' => Lang::get('userpasschange.newpasswordmax255'),
          'newpassword.alpha_num' =>Lang::get('userpasschange.newpasswordalpha_num'),
          'newpasswordagain.required' => Lang::get('userpasschange.newpasswordagainrequired'),
          'newpasswordagain.same:newpassword' => Lang::get('userpasschange.newpasswordagainsamenewpassword'),
           'username.max' => 'The :attribute field must  have under 255 chars',
             ];
         }
  1. 在用户控制器中
<?php namespace App\Http\Controllers;


// VALIDATION: change the requests to match your own file names if you need form validation
use App\Http\Requests\UpdateUserPasswordRequest as ChangePassRequest;
//etc

class UserCrudController extends Controller
{
public function chnagePassword(ChangePassRequest $request)
{
 // save new pass since it passed validation if we got here
}
}
$messages = [
     'username.required' => Lang::get('userpasschange.usernamerequired'),
     'username.max' => Lang::get('userpasschange.usernamemax255'),
     'oldpassword.required' => Lang::get('userpasschange.oldpasswordrequired'),
     'oldpassword.max' => Lang::get('userpasschange.oldpasswordmax255'),
     'newpassword.required' => Lang::get('userpasschange.newpasswordrequired'),
     'newpassword.min' => Lang::get('userpasschange.newpasswordmin6'),
     'newpassword.max' => Lang::get('userpasschange.newpasswordmax255'),
     'newpassword.alpha_num' => Lang::get('userpasschange.newpasswordalpha_num'),
     'newpasswordagain.required' => Lang::get('userpasschange.newpasswordagainrequired'),
     'newpasswordagain.same:newpassword' => Lang::get('userpasschange.newpasswordagainsamenewpassword'),
 ];

尽量不要使用这个 :255 和 :6 结尾。


错误:

'username.max:255' => Lang::get('userpasschange.usernamemax255'),

正确:

'username.max' => Lang::get('userpasschange.usernamemax255'),

对于Laravel7.x,6.x,5.x
定义自定义规则后,您可以在控制器验证中使用它,例如:

$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'],

希望这对您有所帮助...