laravel api不显示来自请求验证的消息

时间:2019-02-03 16:09:19

标签: laravel validation error-handling laravel-5.6 laravel-5.7

我的后端laravel API中存在错误处理程序问题,不显示来自验证的错误消息。

routes / api

<?php
Route::group([

    'middleware' => 'api',

], function ($router) {
    Route::post('access/sign-up', 'AuthenticationController@signUp');
});

AuthenticationController

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
use App\Http\Requests\SignUpRequest;
use Illuminate\Http\Request;
use App\User;


    class AuthenticationController extends Controller
    {
        /**
         * Create a new AuthenticationController instance.
         *
         * @return void
         */
        public function __construct()
        {
            $this->middleware('auth:api', ['except' => ['signUp']]);
        }


        /**
         * 
         *
         * @return \Illuminate\Http\JsonResponse
         */
        public function signUp(SignUpRequest $request)
        {
            //User::create($request->all());
            return response()->json([
                'data' => 'Usuario creado correctamente.'
            ]);
        }
    }

SignUpRequest

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class SignUpRequest extends FormRequest
{
    /**
     * Determine if the user is authorized to make this request.
     *
     * @return bool
     */
    public function authorize()
    {
        return true;
    }

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


}

问题是,当邮递员发送空白密码或不发送邮件时,它会将我发送到主页,以向我发送一个json格式的错误,像以前一样。我不知道该怎么办。 我尝试在SignUpRequest中使用自定义消息,但这不是问题,请考虑在错误处理程序中进行某种重定向。

7 个答案:

答案 0 :(得分:3)

您只需要检查一项设置,必须在 Postman 的标题数据中添加 Accept Type

接受:application/json

这对我来说是可行的...

答案 1 :(得分:2)

只需将该代码添加到SignUpRequest

 use Illuminate\Contracts\Validation\Validator;
 use Illuminate\Http\Exceptions\HttpResponseException;



protected function failedValidation(Validator $validator)
{
    throw new HttpResponseException(response()->json($validator->errors(), 422));
}

答案 2 :(得分:1)

使用表单请求;如果验证失败,将生成重定向响应以将用户发送回其先前的位置。这就是为什么您重定向回页面而不是响应JSON的原因。

Laravel具有一种受保护的方法“ failedValidation”方法。在您的表单请求类中覆盖此方法。

  protected function failedValidation(\Illuminate\Contracts\Validation\Validator $validator)
{

    throw new \Illuminate\Validation\ValidationException(response()->json($validator->errors(), 422));
}

答案 3 :(得分:1)

只需在App \ Exceptions \ Handler中,您必须在register()方法中注册自定义异常处理:

public function register() {
    
    $this->renderable( function ( ValidationException $ex, $request ) {
        
        $response = [
            'ErrorCode' => 'my_error_code',
            'ErrorMessage' => $ex->validator->errors()
        ];
        
        return response()->json( $response );
    } );
}

答案 4 :(得分:0)

只需将该代码添加到App\Exceptions\Handler

public function render($request, Exception $exception)
{
    if ($exception instanceof ValidationException) {
    return response()->json([
            'status' => false,
            'error' => [
                'type' => 'form',
                'code' => 400,
                'description' => 'Bad request.',
                'detail' => $exception->validator->errors()
            ]
        ], 422);
    }

    return parent::render($request, $exception);
}

答案 5 :(得分:0)

TL;DR 添加以下标题:Accept: application/json

正如这里的一些用户所提到的,默认情况下,当表单请求失败时,应用程序将尝试将用户重定向回他们之前的位置。这就是为什么您收到的是网页而不是 JSON 响应。

我们还可以覆盖“failedValidation”方法。但我建议在请求 Accept: application/json 上设置以下标头。

Laravel 将根据 Accept 标头返回适当的响应。对于 application/json,Laravel 将返回带有表单错误的 JSON 响应。

答案 6 :(得分:0)

laravel 8 更新,ValidationException 中的第一个参数是 Validator 类:

protected function failedValidation(Validator $validator)
{
    throw new ValidationException($validator, response()->json($validator->errors(), 422));
}