0

Je souhaite personnaliser le format du message d'erreur flashé, qui est reçu après que je fais quelque chose comme $this->validator($request->all())->validate();Personnalisation du format d'erreur Flashed - Laravel 5.3

Pour une demande ajax, il répond avec:

{ 
    "name": [ 
     "The name field is required." 
    ], 
    "email": [ 
     "The email field is required." 
    ], 
} 

Mais je veux que ça ressemble

{ 
    "status": "fail", 
    "errors": { 
     "name": [ 
      "The name field is required." 
     ], 
     "email": [ 
      "The email field is required." 
     ], 
    } 
} 

J'ai lu le documentation sous Personnalisation de l'erreur Flashed Format et ajouté méthode formatValidationErrors dans ma Controller classe, mais il ne fait aucune différence.

public function formatValidationErrors(Validator $validator) 
{ 
    return ['status' => 'fail', 'errors' => $validator->errors()->getMessages()]; 
} 

Il ne change pas même si je change la méthode formatValidationErrors dans le trait Illuminate\Foundation\Validation\ValidatesRequests d'origine

Je suis obligé de construire ont ce format dans tous les appels de demande et donc il y a un code-duplication. Ce serait bien si je pouvais simplement appeler $this->validator($request->all())->validate() et il formats automatiquement selon mes besoins.

+0

Je voulais juste dire, le stru cture fourni par laravel est en fait beaucoup plus utile que la variante que vous recherchez :) –

+0

Edited ma question pour "Pourquoi j'ai besoin de cela?" – Kanav

+0

La raison d'avoir deux niveaux d'erreurs de validation est que vous pouvez avoir plusieurs erreurs de validation pour un même champ (par exemple, le nom d'utilisateur est trop court et le nom d'utilisateur contient des caractères non autorisés). Je suggère de coller avec la structure originale qui a été générée par Laravel, et de le consommer, faites un adaptateur simple pour le convertir en une structure désirée. –

Répondre

0

La façon de changer est de créer une classe qui étend validateur et remplacer la méthode addError. Voici un exemple de code:

<?php 

namespace App\Validators; 

use Illuminate\Support\MessageBag; 
use Illuminate\Validation\Validator; 

class RestValidator extends Validator { 

    /** 
    * Add an error message to the validator's collection of messages. 
    * 
    * @param string $attribute 
    * @param string $rule 
    * @param array $parameters 
    * @return void 
    */ 
    protected function addError($attribute, $rule, $parameters) 
    { 
     $message = $this->getMessage($attribute, $rule); 

     $message = $this->doReplacements($message, $attribute, $rule, $parameters); 

     $customMessage = new MessageBag(); 

     $customMessage->merge(['code' => strtolower($rule.'_rule_error')]); 
     $customMessage->merge(['message' => $message]); 

     $this->messages->add($attribute, $customMessage); 
    } 
} 

Maintenant, vous pouvez structurer la validation de vos contrôleurs comme ceci:

$rules = [ 
    // Your rules here 
]; 

$attributes = [ 
    // The attributes you're checking here 
]; 

$validator = Validator::make($attributes, $rules); 

if ($validator->fails()) { 
    $errorMessage = [ 
     'status' => 'fail', 
     'errors' => $validator->errors() 
    ]; 

    return $errorMessage; 
} 

// The rest of your code goes here 
+0

Je suis sûr que l'approche est plus simple. – Kanav

0

Essayez dans votre modèle,

public function response(array $errors) 
{ 
    if (($this->ajax() && !$this->pjax()) || $this->wantsJson()) { 
     $errors = array('status' => 'fail', 'errors' => $errors); 
     return new JsonResponse($errors, 422); 
    } 
    return $this->redirector->to($this->getRedirectUrl()) 
     ->withInput($this->except($this->dontFlash)) 
     ->withErrors($errors, $this->errorBag); 
} 

Il en résultera comme prévu ,

{ 
"status": "fail", 
    "error": { 
    "name": [ 
     "The name field is required." 
    ], 
    "email": [ 
     "The email field is required" 
    ] 
    } 
}