2017-03-27 2 views
0

J'ai quelques questions de base relatives à l'organisation d'une application API. Bien que ce soit une question générale, il pourrait être intéressant que j'utilise Laravel.Comment organiser correctement une application API avec Laravel

Ma structure est la suivante:

  • Un repos api avec les terminaux pointant vers différentes méthodes dans les classes du contrôleur. L'objet transmis est de type Request.
  • Les classes de contrôleur effectuent toutes les validations d'entrée (via les méthodes de validation), les autorisations (via Gates) et extraient les modèles respectifs de la base de données (en fonction d'un identifiant de la demande). Dans le cas où les modèles n'existent pas, il renvoie une erreur. Enfin, le contrôleur appelle la méthode correspondante dans mes classes Service, en passant l'objet modèle.
  • Les classes de service effectuent maintenant différentes actions sur l'instance de modèle (par exemple, la mise à jour du nom d'utilisateur), persistent la mise à jour (en utilisant Eloquent) et retournent finalement l'instance de modèle mise à jour au contrôleur.
  • Le contrôleur "enveloppe" l'objet retourné dans une réponse json et le renvoie au client (j'aime simplement retourner l'objet mis à jour au lieu de simplement renvoyer le succès ou l'ID).

Mes questions et problèmes:

  1. est l'organisation de mon code ok?
  2. Comme indiqué, les erreurs de validation etc. sont générées par mes contrôleurs. Cependant, que se passe-t-il si quelque chose ne va pas dans mon service (c'est-à-dire plus bas)? comment puis-je dire à mon contrôleur que quelque chose s'est mal passé, afin qu'il puisse renvoyer une réponse JSON 403 (par exemple) au client? Exemple: mon UserService tente de mettre à jour l'adresse e-mail. Cependant, il existe déjà une entrée avec cet e-mail, le service doit donc renvoyer une erreur au contrôleur, qui à son tour renvoie un message d'erreur 403 json-encoded au client.
  3. Comme indiqué, toute la validation, l'autorisation et ainsi de suite est fait dans mon contrôleur. les méthodes du contrôleur sont faites spécialement pour les requêtes http et prennent ainsi un objet Request en entrée et retournent json. Que faire si je veux appeler ces méthodes directement à partir de mon application, par exemple à partir d'un autre contrôleur? Si j'appelle la classe de service respective directement, je ne peux pas bénéficier de toutes les validations et vérifications effectuées dans le contrôleur. Cependant, si j'appelle le contrôleur, il attend un objet Request en entrée et renvoie une réponse HTTP Json, ce que je ne veux pas non plus lorsque j'appelle d'un autre contrôleur, évidemment. Comment dois-je faire cela?

J'espère que mes problèmes sont suffisamment clairs !? Toute aide est grandement appréciée.

Merci, Michael

Répondre

1

Je peux répondre à deux de ces choses.

  1. Je pense que cela semble correct pour une API; assurez-vous simplement de garder la logique de l'API séparée de la logique de l'application. La façon dont je fais cela est via le routage; /api/{version}/... à titre d'exemple.

  2. Utilisez les blocs try { ... } catch { ... } pour gérer les erreurs imprévues (comme les exceptions SQL, etc.) et renvoyez response()->json([...], 403); dans ces cas.

  3. Utilisez le guzzle/http (y compris EXIGE dans votre composer.json et l'exécution d'un composer install ou composer update) paquet pour envoyer des demandes de routes/contrôleurs dans votre application. Vous pouvez simplement accéder à un itinéraire de votre application GET ou POST vers un itinéraire /api/...; il le reconnaîtra comme Request et aura des fonctions pour gérer la réponse JSON retournée. Voir http://docs.guzzlephp.org/en/latest/ pour des exemples.

C'est cependant un peu une question ouverte; Il est préférable d'essayer de créer votre API et de résoudre les problèmes spécifiques qui se posent.

+0

merci beaucoup, c'est exactement j'espérais obtenir une réponse! Je vais essayer de revenir au cas où des questions se poseraient! THX!!! – michimaxi