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

ttp71kqs  于 2023-06-30  发布在  其他
关注(0)|答案(9)|浏览(92)

我在我的后端laravel API中有错误处理程序的问题,不显示验证的错误消息。
路由/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.'
            ]);
        }
    }

注册请求

<?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',
        ];
    }

}

问题是,当 Postman 我发送密码在空白或不发送邮件,例如,它送我到主页面,而不是给我一个JSON与所有的错误像以前一样。我不知道该怎么办我尝试在SignUpRequest中使用自定义消息,但这不是问题,认为在错误处理程序中有某种重定向。

jtjikinw

jtjikinw1#

只需将该代码添加到SignUpRequest

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


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

idfiyjo82#

您需要检查一个设置必须在Postman中的头数据中添加Accept Type
接受:application/json
这是我的工作……

pepwfjgg

pepwfjgg3#

使用表单请求;如果验证失败,则将生成重定向响应,以将用户发送回其先前位置。这就是为什么你重定向回页面而不是响应JSON。
Laravel有一个受保护的方法“failedValidation”。在表单请求类中覆盖此方法。

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

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

uz75evzq4#

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

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

kiayqfof5#

TL;DR添加以下标题:Accept: application/json
正如这里的一些用户所提到的,默认情况下,当表单请求失败时,应用程序将尝试将用户重定向回其先前的位置。这就是为什么你收到的是一个网页而不是一个JSON响应。
我们也可以覆盖“failedValidation”方法。但我建议在请求Accept: application/json上设置以下头。
Laravel将根据Accept头返回相应的响应。对于application/json,Laravel将返回一个带有表单错误的JSON响应。

yzuktlbb

yzuktlbb6#

简单地说,在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 );
    } );
}
eimct9ow

eimct9ow7#

将此方法添加到formRequest类中。它在laravel9中工作

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

class PostRequest extends FormRequest
{
    protected function failedValidation(Validator $validator)
    {
        throw new HttpResponseException(response()->json([
            'success' => false,
            'message' => 'Validation errors',
            'data'    => $validator->errors(),
        ]));
    }
    /**
     * 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()
    {
        switch ($this->method()) {
            case 'GET':
            case 'DELETE':{
                    return [];
                }
            case 'POST':{
                    return [
                        'title' => 'string|unique:posts|required',
                        'body'  => 'required',
                        'image' => 'string|nullable',

                    ];
                }
            case 'PUT':{
                    return [
                        'title' => 'string|unique:posts|required',
                        'body'  => 'required',
                        'image' => 'string|nullable',

                    ];
                }
        }
    }
}
zengzsys

zengzsys8#

在laravel 9/10
在我的例子中,我有一个小的POSTAPI控制器,它处理一个短逻辑。
我想把它包含在类中,不使用任何FormRequest规则,因为它只有一个方法来创建一个资源,只有一个参数
这就是我所做的:

// use Illuminate\Support\Facades\Validator;
    // use Illuminate\Http\Exceptions\HttpResponseException;
    $validator = Validator::make($request->all(), [
        'mac_address' => ['required',new MacArrayCheck]
    ]);

    if ($validator->fails()) {
        throw new HttpResponseException(response()->json($validator->errors(), 422));
    }
 
    // ... logic here when all validations passes

Laravel 10 Doc手动验证

t3irkdon

t3irkdon9#

只需将该代码添加到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);
}

相关问题