web-dev-qa-db-fra.com

Désactiver la redirection de validation de demande dans Laravel 5.4

J'essaie donc de développer une API de repos pour un projet interne et j'ai un problème qui, lorsque la validation de la demande de formulaire échoue, affiche la réponse @index.

J'ai donc deux itinéraires.

Route::get('/api/clients', 'ClientController@index');
Route::post('/api/clients', 'ClientController@store');

@index liste tous les clients, @store crée un nouveau client et j'ai un validateur de demande de formulaire sur la méthode @store qui vérifie qu'un nom est fourni pour le client.

Ce que je veux, c’est que lorsque le validateur échoue, il affiche une réponse JSON avec les erreurs de validation. Mais ce que je pense que cela se produit, c’est que la validation échoue. Elle redirige donc vers la même page, mais la redirection est GET au lieu de POST. Elle répertorie donc tous les clients.

Je sais que vous pouvez définir vos en-têtes de manière à ce que cela ressemble à une requête ajax, dans laquelle la réponse JSON sera correctement affichée, mais je souhaite qu'elle affiche la réponse JSON, qu'elle soit ajax ou non.

J'ai essayé de surcharger la méthode response dans mon validateur, ce qui n'a pas fonctionné. J'ai essayé de définir la méthode wantsJson dans le validateur pour renvoyer true, ce qui, encore une fois, n'a pas fonctionné.

L'aide serait très appréciée.

Le code est en dessous ...

web.php

Route::get('/api/clients', 'ClientController@index');
Route::get('/api/clients/{client}', 'ClientController@show');
Route::post('/api/clients', 'ClientController@store');
Route::put('/api/clients/{id}', 'ClientController@update');
Route::delete('/api/clients/{id}', 'ClientController@delete');

ClientController.php

namespace App\Http\Controllers;

use App\Client;
use App\Http\Requests\ClientRequest;

class ClientController extends Controller
{

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(ClientRequest $request)
    {
        return Client::create([
            'title'   => request('title'),
            'user_id' => auth()->id()
        ]);
    }

ClientRequest.php

<?php

namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ClientRequest 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 [
            'title' => 'required'
        ];
    }

    /**
     * Get the failed validation response for the request.
     *
     * @param array $errors
     * @return JsonResponse
     */
     public function response(array $errors)
     {
         dd('exit'); // Doesn't work
     }
}
5
KeironLowe

Tu peux essayer comme ça

Incluez d'abord l'utilisation comme ci-dessous dans votre demande de formulaire 

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

et alors

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

maintenant, si vous essayez de valider, il reviendra comme

{
"title": [
"The  title field is required."
]
}
16
iCoders

Lors de la demande, nous devrions envoyer des informations d’en-tête.

Accept: application/json
Content-Type: application/json

Voilà, laravel ne redirigera pas et n’enverra pas le message d’erreur en JSON.

7
Christophvh

Essaye ça

Ouvrir le fichier app/Exceptions/Handler.php

Inclure l'utilisation

use Illuminate\Validation\ValidationException;

puis ajouter une méthode

    /**
     * Create a response object from the given validation exception.
     *
     * @param  \Illuminate\Validation\ValidationException  $e
     * @param  \Illuminate\Http\Request  $request
     * @return \Symfony\Component\HttpFoundation\Response
     */
    protected function convertValidationExceptionToResponse(ValidationException $e, $request)
    {
        if ($e->response) {
            return $e->response;
        }

        return response()->json($e->validator->errors()->getMessages(), 422);
    }

vous pouvez maintenant obtenir une réponse standard validationFailure comme une requête ajax

7
Dmitry Guzun

Je viens de créer une ApiFormRequest qui écrase FormRequest::failedValidation comme ceci:

<?php
// app/Http/Requests/ApiFormRequest.php
namespace App\Http\Requests;

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

class ApiFormRequest extends FormRequest
{

    protected function failedValidation(Validator $validator): void
    {
        $jsonResponse = response()->json(['errors' => $validator->errors()], 422);

        throw new HttpResponseException($jsonResponse);
    }
}

Ensuite, vous utilisez simplement comme ceci

<?php
namespace App\Http\Requests;

use Illuminate\Foundation\Http\FormRequest;

class ClientRequest extends ApiFormRequest
{
    // ...
0
RousseauAlexandre