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:
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?
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."]
}
}
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;
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.
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)
});