7 votes

Comment afficher les erreurs de validation dans l'api de Laravel tout en ayant un fichier de demande de formulaire séparé du contrôleur ?

J'ai un fichier de demande de formulaire qui gère mes validations séparément de mon contrôleur. Comment renvoyer les erreurs de validation après un appel à l'API dans le contrôleur ?

//mon contrôleur

/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function orders(GetOrdersRequest $request, OrderRepository $orderRepository)
{

    $order = $orderRepository->allOrders($request->paginate);

    return $this->sendSuccess('Orders retrieved successfully', $order);
}

16voto

Adam Points 2731

La classe FormRequest contient une fonction appelée failedValidation :

protected function failedValidation(Validator $validator)
{
    throw (new ValidationException($validator))
                ->errorBag($this->errorBag)
                ->redirectTo($this->getRedirectUrl());
}

Il se déclenche lorsque la validation échoue. Pour les points de terminaison de l'API, cette demande est une mauvaise réponse parce qu'il s'agit d'une redirection et qu'elle contient beaucoup trop d'informations. Pour retourner une réponse json propre et json propre et léger, il suffit d'oerwrite la fonction failedValidation dans votre FormRequest pour une réponse correspondante à votre API. Voici un exemple :

protected function failedValidation(Validator $validator)
{
    $errors = $validator->errors();

    $response = response()->json([
        'message' => 'Invalid data send',
        'details' => $errors->messages(),
    ], 422);

    throw new HttpResponseException($response);
}

Crédit à https://stackoverflow.com/a/56726819/2311074

6voto

Neil Tuts Points 21

Vous ne pourrez pas récupérer les erreurs de cette manière puisque le FormRequest lèvera une exception avant que la requête n'atteigne votre contrôleur en cas d'erreur de validation. Cependant, vous pouvez attraper l'erreur dans la demande de formulaire elle-même et modifier la réponse à l'aide de la fonction failedValidation méthode

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

class OrderRequest extends FormRequest
{
    public function authorize()
    {
        //
    }

    public function rules()
    {
        //
    }

    public function failedValidation(Validator $validator)
    {
        $errors = $validator->errors(); // Here is your array of errors
        throw new HttpResponseException($errors);
    }
}

4voto

Erkan Özkök Points 689

La classe de requête Laravel renvoie automatiquement lorsque la validation échoue. Vous devez afficher les messages d'erreur dans le fichier view(blade). Vous pouvez suivre documentation officielle .

Pour les API, il renvoie automatiquement une réponse JSON comprenant les messages d'erreur.

En principe, vous pouvez le faire dans le fichier blade :

@if($errors->has('email'))
    <span class="error">{{ $errors->get('email') }}</span>
@endif

0voto

men32z Points 1

Je pense que ce n'est pas possible, mais vous pouvez utiliser la méthode prepareForValidation() dans votre FormRequest et manipuler les données avant de les valider.

0voto

Prince Dorcis Points 704

Même lors de l'utilisation d'un formulaire, Laravel gère la validation pour vous automatiquement sans que vous ayez à faire quoi que ce soit. En cas d'échec de la validation, un message errors sera renvoyée et vous pourrez y accéder dans la réponse à votre demande. response.data.errors (en fonction de la bibliothèque que vous utilisez pour les requêtes, bien sûr) contiendra les erreurs. Par exemple :

errors: {
    name: ["The name must be at least 2 characters"]
}

Il s'agit d'un exemple fictif. Faites un test rapide en forçant la requête à échouer et en consignant la réponse dans la console pour voir ce que cela donne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X