gpt4 book ai didi

php - 从 Laravel 中的验证器发送自定义响应

转载 作者:行者123 更新时间:2023-12-02 03:38:49 27 4
gpt4 key购买 nike

我有一个注册用户路由,它需要 nameemailpassword 。如果数据正确,即存在唯一的电子邮件和参数,那么它工作得很好,但如果用户已经注册,那么 Laravel 会以其自己的格式发送自动错误消息。我希望无论成功还是失败,返回格式都保持一致。

注册成功返回数据:

{
"status": "success",
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJzdWIiOjUsImlzcyI6Imh0dHA6Ly8xMjcuMC4wLjE6ODAwMC9hcGkvYXV0aC9yZWdpc3RlciIsImlhdCI6MTUyMTI3NTc5MiwiZXhwIjoxNTIxMjc5MzkyLCJuYmYiOjE1MjEyNzU3OTIsImp0aSI6Ik1wSzJSYmZYU1dobU5UR0gifQ.fdajaDooBTwP-GRlFmAu1gtC7_3U4ygD1TSBIqdPHf0"
}

但如果出现错误,它会以其他格式发送数据。

{"message":"The given data was invalid.","errors":{"email":["The email has already been taken."]}}

我希望它们两者保持一致。成功返回数据就好了。但如果发生故障我想自定义数据。像这样的事情:

{"status":"error","message":"The given data was invalid.","errors":{"email":["The email has already been taken."]}}

基本上,我需要 status 参数随每个响应一起出现。

另外,我在使用 Postman 时有一个查询,当发生错误时,输出是纯 HTML,HTML 页面是默认的 Laravel 页面,另一方面,当 Angular 发送相同的请求时,错误是我刚刚粘贴在上面的 json 格式。由于 Angular 在任何情况下都会得到 JSON 响应,这对我来说很好。但为什么 postman 没有向我显示该回复。

注册 Controller :

public function register(RegisterRequest $request)
{
$newUser = $this->user->create([
'name' => $request->get('name'),
'email' => $request->get('email'),
'password' => bcrypt($request->get('password'))
]);
if (!$newUser) {
return response()->json(['status'=>'error','message'=>'failed_to_create_new_user'], 500);
}

return response()->json([
'status' => 'success',
'token' => $this->jwtauth->fromUser($newUser)
]);
}

注册请求处理程序:

 public function authorize()
{
return true;
}

/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'name' => 'required',
'email' => 'required | email | unique:users,email',
'password' => 'required'
];
}

最佳答案

如果我理解正确的话,您总是会得到没有“状态”键的错误响应。

当前代码会发生以下几件事:

  • RegisterController@register(RegisterRequest $request) 由路由调用
  • Laravel 看到您使用 RegisterRequest 类作为参数,并将为您实例化该类。
  • 实例化此类意味着它将直接验证规则。
  • 如果不符合规则,laravel 会直接响应发现的错误。
  • 此响应将始终位于 Laravel 的默认“布局”中,并且代码停在那里。

结论:当您的验证规则不满足时,您的代码甚至不会被触发。

我研究了一个解决方案并提出了这个:

public function register(Illuminate\Http\Request $request)
{
//Define your validation rules here.
$rules = [
'name' => 'required',
'email' => 'required | email | unique:users,email',
'password' => 'required'
];
//Create a validator, unlike $this->validate(), this does not automatically redirect on failure, leaving the final control to you :)
$validated = Illuminate\Support\Facades\Validator::make($request->all(), $rules);

//Check if the validation failed, return your custom formatted code here.
if($validated->fails())
{
return response()->json(['status' => 'error', 'messages' => 'The given data was invalid.', 'errors' => $validated->errors()]);
}

//If not failed, the code will reach here
$newUser = $this->user->create([
'name' => $request->get('name'),
'email' => $request->get('email'),
'password' => bcrypt($request->get('password'))
]);
//This would be your own error response, not linked to validation
if (!$newUser) {
return response()->json(['status'=>'error','message'=>'failed_to_create_new_user'], 500);
}

//All went well
return response()->json([
'status' => 'success',
'token' => $this->jwtauth->fromUser($newUser)
]);
}

现在,不符合您的验证规则仍然会触发错误,但是您的错误,而不是 laravel 的内置错误:)

希望对您有帮助!

关于php - 从 Laravel 中的验证器发送自定义响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49334141/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com