web-dev-qa-db-fra.com

REST API in Laravel lors de la validation de la demande)

J'essaie actuellement de créer une API RESTful avec Laravel et je suis actuellement en train de créer un nouvel utilisateur. Ce n'est qu'un test et j'obtiens un résultat lorsque vous essayez de valider la demande en utilisant la validation dans Laravel; voici le résultat:

enter image description here

J'ai essayé d'en créer un nouveau avec 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 je ne sais pas comment retourner l'erreur lors de la validation. Mais il continue de me donner ce code HTML comme indiqué dans l'image lorsque j'essayais de faire le if avec validation->fails(). Existe-t-il un moyen d'obtenir la validation au format JSON?

31
Aoi

Vous devriez probablement renvoyer des erreurs (qui est une instance de Illuminate\Support\MessageBag) et encoder cela. Une instance MessageBag vous permet de la convertir directement en sa représentation JSON.

$errors = $validation->errors();

return $errors->toJson();

Maintenant, je ne veux pas lancer mon propre klaxon, mais j'ai récemment développé un package d'API RESTful pour Laravel qui fait tout cela pour vous et tout ce que vous devez faire est de lever une exception simple. Voir mon - dingo/api package et le wiki sur renvoyant des erreurs . Fondamentalement, au lieu de renvoyer les erreurs, vous lèveriez 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."]
    }
}
25
Jason Lewis

ces codes vous aideront 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;
22
bhupendraosd

Laravel fournit immédiatement une méthode de validation que vous pouvez appeler depuis votre contrôleur.

si vous cochez la classe abstraite Laravel Controller, vous constaterez qu'elle 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); tant que votre classe de contrôleur é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 le validateur $ échoue, la méthode générera une erreur en fonction du type de demande, s'il est ajax (dans ce cas, vous devez inclure dans les en-têtes de demande (Accept application/json), Il retournera une réponse JSON contenant la validation les erreurs.

4
zak.http

Pour laravel 5.5 et plus, voir les documents: AJAX Requests & Validation

TL; DR: En cas d'échec de la validation, une réponse json avec un 422 est renvoyé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 de réponse, donc pour voir les messages d'erreur si vous utilisez axios, essayez ceci dans la console de votre navigateur:

axios.post('/api/your-route-here')
    .then(response => {
        console.log(response.data);
    }).catch(error => {
    console.log(error.response.data.errors)
});
2
mwal