3
votes

l'api laravel n'affiche pas le message de la validation de la demande

J'ai des problèmes avec le gestionnaire d'erreurs dans mon api backend laravel, ne pas afficher le message d'erreur de la validation.

routes / api

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


}

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
Route::group([

    'middleware' => 'api',

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

Le fait est que lorsque par facteur j'envoie le mot de passe en blanc ou n'envoie pas de courrier par exemple, il m'envoie à page insted de m'envoyer un json avec toutes les erreurs comme avant. Je ne sais pas quoi faire. J'ai essayé avec un message personnalisé dans SignUpRequest, mais ce n'est pas le problème, pensez à une sorte de redirection dans le gestionnaire d'erreurs.


4 commentaires

Pendant que vous utilisez les demandes de formulaire, il ne retournera pas json, utilisez la façade du validateur à l'intérieur du contrôleur et enverra la réponse si le validateur échoue


Peut-être que dans la version précédente (5.6) je peux utiliser cette façon et travailler en m'envoyant le json avec les différentes erreurs? Comment puis-je utiliser la façade de validation à la place?


Merci de me guider. J'ai résolu l'ajout de la fonction protégée failedValidation (Validator $ validator) {throw new HttpResponseException (response () -> json ($ validator-> errors (), 422)); }


Je pense que la bonne approche consiste à ajouter un gestionnaire d'exceptions: laravel.com/docs/8.x/ erreurs


4 Réponses :


9
votes

Ajoutez simplement ce code à SignUpRequest

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



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


0 commentaires

9
votes

Utilisation de la demande de formulaire; Si la validation échoue, une réponse de redirection sera générée pour renvoyer l'utilisateur à son emplacement précédent. C'est pourquoi vous redirigez vers la page au lieu de la réponse JSON.

Laravel a une méthode protégée méthode "failedValidation". Remplacez cette méthode dans votre classe de demande de formulaire.

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

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


1 commentaires

Je n'ai pas trouvé cela même dans le document officiel de Laravel, vous m'avez sauvé la journée, merci!



0
votes

Ajoutez simplement ce code à 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);
}


0 commentaires

1
votes

Simplement, dans votre App \ Exceptions \ Handler, vous devez enregistrer votre gestion des exceptions personnalisée dans la méthode register ():

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


0 commentaires