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
}
}
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."
]
}
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.
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
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
{
// ...