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