Reste L'API dans Laravel lors de la validation de la requête

Je suis en train d'essayer de construire une API RESTful avec Laravel et je suis en train de créer un nouvel utilisateur. Ce n'est qu'un test et j'obtiens quelques résultats en essayant de valider la requête en utilisant la validation dans Laravel; voici le résultat:

enter image description here

j'ai essayé d'en créer une nouvelle par ce code:

public function store()
{

    $validation = Validator::make(Request::all(),[ 
        'username' => 'required|unique:users, username',
        'password' => 'required',
    ]);

    if($validation->fails()){


    } else{
            $createUser = User::create([
                'username' => Request::get('username'),
                'password' => Hash::make(Request::get('password')) 
            ]);
    }
}

mais alors je ne sais pas comment retourner l'erreur de validation. Mais il continue à me donner ce HTML comme a montré dans l'image quand j'ai essayé de faire le si validation->fails(). Y a-t-il un moyen d'obtenir la validation dans le format JSON?

17
demandé sur halfer 2014-04-19 01:25:35

4 réponses

vous devriez probablement retourner les erreurs (ce qui est une instance de Illuminate\Support\MessageBag) et encoder. MessageBag instance vous permet de le convertir directement à sa représentation JSON.

$errors = $validation->errors();

return $errors->toJson();

Je ne veux pas me vanter, mais j'ai récemment développé une API RESTful pour Laravel qui fait tout cela pour vous et tout ce que vous avez à faire est de lancer une exception simple. Voir mon Dingo / api paquet et le Wiki sur retour d'erreurs. En gros, au lieu de en retournant les erreurs, vous lanceriez une exception.

throw new Dingo\Api\Exception\StoreResourceFailedException('Could not create a new user.', $validation->errors());

il serait représenté par le JSON suivant.

{
    "message": "Could not create a new user.",
    "errors": {
        "username": ["The username is already in use."]
    }
}
20
répondu Jason Lewis 2014-04-18 23:40:50

ce code vous aidera, en travaillant pour moi.

$response = array('response' => '', 'success'=>false);
$validator = Validator::make($request->all(), $rules);
    if ($validator->fails()) {
        $response['response'] = $validator->messages();
    }else{
//process the request
}
return $response;
19
répondu bhupendraosd 2016-09-08 11:14:47

Laravel fournit hors de la boîte une méthode de validation que vous pouvez appeler depuis votre Controller.

si vous vérifiez le Laravel Controller classe abstraite, vous trouverez qu'il utilise un trait appelé ValidatesRequests

   abstract class Controller extends BaseController
{
    use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
}

vous pouvez donc utiliser une méthode $this->validate(Request $request, array $rules); comme vous l'avez longtemps que votre contrôleur de classe étend le Contrôleur

la déclaration de méthode complète est

public function validate(Request $request, array $rules, array $messages = [], array $customAttributes = [])
    {
        $validator = $this->getValidationFactory()->make($request->all(), $rules, $messages, $customAttributes);

        if ($validator->fails()) {
            $this->formatValidationErrors($validator);
        }
    }

si $ validator échoue, la méthode lancera une erreur en fonction du type de requête, si il s'agit d'ajax (dans ce cas, vous devez inclure dans la requête des en-têtes (Accept application/json) il retournera une réponse JSON contenant les erreurs de validation.

3
répondu zak.http 2016-03-16 12:25:19

pour laravel 5.5 et plus, voir docs: demandes AJAX & Validation

TL; DR: en cas d'échec de la validation, une réponse json avec un 422 est retournée avec les messages d'erreur de validation. Il m'a fallu un peu de temps pour trouver ces erreurs de validation dans l'objet response, alors pour voir les messages d'erreur si vous utilisez axios, essayez ceci dans votre console de navigateur:

axios.post('/api/your-route-here')
    .then(response => {
        console.log(response.data);
    }).catch(error => {
    console.log(error.response.data.errors)
});
1
répondu mwal 2018-05-22 06:51:07