2017-07-31 60 views
1

我实现使用Laravel 5.4认证过程基于AJAX的登录。Laravel验证响应通过AJAX

我不断收到422反应,所以经过一番研究,我想出了这个验证方法我LoginController(其覆盖AuthenticatesUsers特点方法:

protected function validateLogin(Request $request) 
{ 
    $validator = Validator::make($request->all(), [ 
     $this->username() => 'required|email|max:50|unique:users', 
     'nickname' => 'required|max:30|min:6|unique:users', 
     'password' => 'required|confirmed|min:6', 
    ]); 

    if ($validator->fails()) { 

     $responseBag = $validator->getMessageBag()->toArray(); 
     $responseBag['type'] = ['error']; 

     if($request->ajax()) { 
      return response()->json($responseBag, 422); 
     } 

     $this->throwValidationException(
      $request, $validator 
     ); 

    } 
} 

我期待这样的响应:

array:3 [ 
    "nickname" => array:1 [ 
    0 => "The nickname field is required." 
    ] 
    "password" => array:1 [ 
    0 => "The password confirmation does not match." 
    ] 
    "type" => array:1 [ 
    0 => "error" 
    ] 
] 

但我得到这个回应

{email: "These credentials do not match our records."} 

如果我dd($messageBag)回应前,然后我得到预期的结果。我错过了什么?

回答

1

如果你看一下LoginController:login方法定义,$this->validateLogin不退还,不应该。

$this->validate抛出时请求验证失败,其相应的处理对AJAX和正常请求异常。

你应该写你的验证为:

protected function validateLogin(Request $request) 
{ 
    $this->validate($request, [ 
     $this->username() => 'required|email|max:50|unique:users', 
     'nickname' => 'required|max:30|min:6|unique:users', 
     'password' => 'required|confirmed|min:6', 
    ]); 
} 

}

+0

您好,感谢您的答复。如果我在'if'语句之前使用'dd($ request-> ajax())',它将返回true。如果我放在'if'语句中的'dd',它会触发,所以越来越到'返回JSON'声明。另外,我正在使用'jQuery'(V3,最新版本)''后缀''.ajax'函数。这已经在prev中起作用了。 Laravel版本确定。 – TheRealPapa

+0

@TheRealPapa谢谢。请参阅最新的答案。 –