Maison >développement back-end >tutoriel php >Construisez des ressources de repos avec Laravel

Construisez des ressources de repos avec Laravel

William Shakespeare
William Shakespeareoriginal
2025-02-20 11:50:10528parcourir

Construisez des ressources de repos avec Laravel

Dans cette partie, nous commencerons à travailler avec l'interface de repos. Créer une API REST sur Laravel n'est pas très difficile. Tout ce que nous devons garder à l'esprit, c'est que nous avons affaire à Emberjs et que nous ne voulons pas écrire un nouvel adaptateur à partir de zéro. Comme d'habitude, vous pouvez trouver le code source de cette partie sur github.

Les plats clés

  • Utiliser les conventions Ember.js lors de la construction d'API REST avec Laravel pour assurer la compatibilité et rationaliser le processus de développement.
  • Créer des contrôleurs de ressources dans Laravel en utilisant l'outil de ligne de commande artisan pour gérer efficacement les ressources reposantes sans avoir besoin de définir manuellement les opérations CRUD.
  • Organisez efficacement les routes en les regroupant sous un espace de noms spécifique dans Laravel, en améliorant la structure et l'accessibilité de l'API.
  • Implémentez la gestion des erreurs et le formatage de réponse dans les contrôleurs pour gérer la récupération des données et assurer des points de terminaison API robustes.
  • Tirez parti des classes de ressources éloquentes et API de Laravel pour transformer les données du modèle en réponses JSON, facilitant une intégration facile avec des cadres frontaux comme Ember.js.

par où commencer?

C'est une question difficile. Ember a son propre flux de travail et sa logique. Si nous commençons à écrire notre repos avec cette logique à l'esprit, nous allons gagner du temps, nous aurons une belle architecture et quelque chose de réutilisable. Je pense qu'Ember a fait un bon choix avec leur architecture de repos. Jetez un œil à la façon dont Ember attend les données.

Supposons que nous voulons récupérer un utilisateur. Ember attend quelque chose comme ceci:

{
      "user": {
        "firstName": "firstName",
        "lastName": "lastName"
      }
    }

Si nous voulons récupérer une liste d'utilisateurs, Ember s'attendrait à un JSON comme ceci:

{
      "users": 
      [
          {
            "firstName": "firstPersonsName",
            "lastName": "lastname"
          },
          {
            "firstName": "secondPersonName",
            "lastName": "lastName"
          }
      ]
    }

Le premier nécessite «l'utilisateur», mais le second nécessite des «utilisateurs». Le second est pluriel. Ember a également mis des règles pour cela. Si vous ne spécifiez pas le pluriel vous-même en utilisant:

Ember.Inflector.inflector.irregular('formula', 'formulae');

Emberjs fera une hypothèse et demandera des «formules». Parfois, c'est bien que le cadre lui-même fournit de telles choses, mais d'autre part, les choses peuvent devenir incontrôlables si vous oubliez ces détails.

Avant de s'aventurer plus profondément avec Ember, un avertissement: Ember est difficile et puissant. Prenez le temps d'apprendre comment cela fonctionne.

Si nous complimons un peu les choses et mettons quelques relations entre les objets, par exemple, nous disons que l'utilisateur a des photos. Comment émenilions-nous cela?

{
      "user": {
        "id": 1,
        "name": "firstName",
        "lastname": "lastname,
        "photos": [1, 2, 3]
      },
    
      "photos": 
      [
          {
            "id": 1,
            "title": "Lorem Ipsum"
          },
          {
            "id": 2,
            "title": "Lorem Ipsum"
          }
      ]
    }

Il s'agit d'une relation un à plusieurs. Si nous demandons un utilisateur, ses photos seront également prises. Nous avons déjà mis en place des relations dans Laravel, vous pouvez les utiliser si vous voulez et consommer ces relations sur Ember aussi.

J'ai commencé avec Ember pour voir comment ce cadre veut les données. C'est plus facile si vous savez comment construire la structure. La validation et l'obtention des données de la base de données sont faciles, mais la création d'une interface de repos solide et une interface intelligente, c'est la partie difficile.

Préparation pour le reste

Lorsque vous développez quelque chose, une maquette peut être très utile. Même si vous êtes un programmeur de gourou et que vous détestez traiter avec Photoshop ou GIMP, il existe de bons outils pour le prototypage. J'ai utilisé Balsamiq et mon prototype en première page était le suivant:

Construisez des ressources de repos avec Laravel

Permet de commencer à le construire. Open /App/views/index.php. Cela sert de notre application à une seule page. Nous avons créé ce fichier dans la première partie de cette série.

{
      "user": {
        "firstName": "firstName",
        "lastName": "lastName"
      }
    }

Permettez-moi d'expliquer cela. La balise NAV est responsable de la navigation. La balise UL avec la zone de titre de classe est un texte qui est utilisé comme logo qui est lié au premier niveau de l'application. J'ai également ajouté une liste déroulante avec une liste de catégories. Dirigez-vous vers la Fondation 5 Docs si vous voulez en savoir plus. La plupart du temps, ce ne sont que des opérations de copie / coller, alors ne vous inquiétez pas pour cette partie.

De plus, j'ai utilisé le système de grille de Foundation pour la zone de contenu. Cela serait rempli de toutes les informations et sera modifié lors de la navigation. Toutes les mises à jour internes seront gérées par Ember. Nous allons construire seulement 3 modèles ici. Un pour les utilisateurs, un pour une seule photo et un pour la page de destination.

Avez-vous remarqué que tout notre code se trouve dans une balise de script? Ember utilise le guidon comme langue de modèle. Le type de texte / handlebars est un type spécial de script. Si vous utilisez Ember and Grodbars pendant un certain temps, vous avez probablement utilisé des noms de modèles. Je ne les spécifie pas dans celui-ci car ce modèle sera utilisé comme conteneur pour toute l'application. Si vous ne spécifiez pas de nom, Ember l'utilise comme modèle d'application.

Les contrôleurs de ressources

Au fur et à mesure que j'ai développé cette application très simple, j'ai constaté que les contrôleurs de ressources sont utiles lors du développement d'API REST. C'est le point de l'architecture de repos - tout est une ressource. Toutes les ressources peuvent avoir un verbe HTTP appliqué: obtenir, publier, supprimer, mettre (mettre à jour). Tous les verbes ne sont pas nécessaires.

{
      "users": 
      [
          {
            "firstName": "firstPersonsName",
            "lastName": "lastname"
          },
          {
            "firstName": "secondPersonName",
            "lastName": "lastName"
          }
      ]
    }

C'est ainsi que nous créons un contrôleur de ressources via Artisan. L'option - à l'exception éteint ces deux méthodes de ce contrôleur. Nous n'avons pas besoin des méthodes de création et de modification. La méthode de création traite de l'interface graphique de la création de cette ressource. Au fur et à mesure que nous créons une application d'une page, il n'est pas sage de créer une vue à l'extérieur de Ember.

Créez un autre contrôleur de ressources pour les catégories. Comme vous pouvez le voir, seuls les méthodes d'affichage et d'index sont disponibles dans ce contrôleur. Je pense que montrer une catégorie individuelle et récupérer toutes les catégories est suffisant.

{
      "user": {
        "firstName": "firstName",
        "lastName": "lastName"
      }
    }

Un autre contrôleur est le contrôleur d'images. Pourquoi des images contrôleur si nous en avons déjà une? Parce que nous avons besoin d'un point final pour servir les images. Dropbox détient nos images, mais nous ne pouvons pas y accéder de l'extérieur. Si vous voulez rendre un dossier public, vous devez payer. C’est la première raison. La deuxième raison est que je ne veux pas que chaque image soit publique. En un mot, ce contrôleur saisira l'image de Dropbox et le servira au client.

{
      "users": 
      [
          {
            "firstName": "firstPersonsName",
            "lastName": "lastname"
          },
          {
            "firstName": "secondPersonName",
            "lastName": "lastName"
          }
      ]
    }

et le dernier mais non le moindre est le Controller User:

Ember.Inflector.inflector.irregular('formula', 'formulae');

la route

Maintenant que nous avons les contrôleurs, nous devons relier ces contrôleurs à leurs itinéraires connexes. Mettons à jour /app/routes.php. Tout d'abord, regrouvez-les dans un espace de noms d'URL en utilisant Route :: Groupe.

{
      "user": {
        "id": 1,
        "name": "firstName",
        "lastname": "lastname,
        "photos": [1, 2, 3]
      },
    
      "photos": 
      [
          {
            "id": 1,
            "title": "Lorem Ipsum"
          },
          {
            "id": 2,
            "title": "Lorem Ipsum"
          }
      ]
    }

Ici, nous avons spécifié un préfixe, l'espace de noms. Tout ce qui se trouve à l'intérieur de ce groupe est accessible comme ceci:

<script type="text/x-handlebars">
    
        <!-- The navigation top-bar -->
        <nav  data-topbar>

            <ul >
                <li >
                    <h1><a href="#">Photo Upload</a></h1>
                </li>
            </ul>

            <section >

                <!-- Left Nav Section -->
                <ul >
                    <li >
                        <a href="#">Categories</a>
                        <ul >
                            <li><a href="#">Category1</a></li>
                            <li><a href="#">Category2</a></li>
                            <li><a href="#">Category3</a></li>
                            <li><a href="#">Category4</a></li>
                        </ul>
                    </li>
                </ul>

            </section>

            <div ></div>
            
        </nav><!-- END Navigation -->
        
        <!-- Content -->
        <div style="margin-top: 50px;">
            <!-- The content will be here -->
        </div><!-- END Content -->

    </script>

De plus, nous pouvons spécifier des filtres à l'intérieur de ce groupe. Par exemple, vous pouvez ajouter un filtre Auth :: OnceBasic ('Username') ou en créer un et l'ajouter dans ce groupe. Vous pouvez également utiliser d'autres authentifications.

Ajoutez trois contrôleurs à l'intérieur de ce groupe. Photocontroller, UserController et catégorie contrôleur.

php artisan controller:make PhotoController --except=create,edit

Ajoutez le contrôleur d'images en dehors de ce groupe. Je ne pense pas que ce contrôleur ait besoin d'un espace de noms - les images sont des images et il est inutile de leur donner un espace de noms.

php artisan controller:make CategoryController --only=show,index

En fin de compte, le fichier /app/routes.php devrait ressembler à ceci:

php artisan controller:make ImagesController --only=show

Remarquez que les noms de ressources sont pluriels, en raison de l'exigence d'Ember.

remplir ces contrôleurs

Maintenant, nous pouvons commencer à construire quelque chose. Je ne vais pas tout couvrir ici parce qu'il est très difficile d'expliquer toutes les choses - pour en savoir plus en profondeur, voir cette série. Commençons par le contrôleur photo.

La méthode index () doit renvoyer les dernières photos de la base de données. Ici, nous pourrions faire de la pagination, mais je ne veux pas que les choses deviennent trop complexes. S'il y aura suffisamment d'intérêt pour les commentaires, nous mettrons à jour cette application dans un futur article.

php artisan controller:make UserController --only=show,index

Laissez-moi expliquer cela. J'ai inséré tout dans un essai, une prise et enfin bloquer. Si quelque chose ne va pas, renvoyez un JSON différent avec un code d'état.

<span>Route<span>::</span>group(array('prefix' => 'api/v1'), function()
</span>    <span>{
</span>        
    
    <span>});</span>

Cela prend 9 photos de la base de données. Ensuite, prenez chaque photo et affichez-la dans un tableau formaté qui sera converti au format JSON plus tard.

Si tout se passe bien ou si une exception n'est pas lancée par Eloquent, cela affiche la bonne sortie. Si vous souhaitez afficher un code d'état spécifique, assistez à chaque exception qui peut être lancée par éloquent et affichez le bon code d'état.

Remplissons la méthode Show () maintenant. Encore une fois, nous voulons récupérer toutes les informations sur la photo avec l'ID donné.

example.com/api/v1

Lors de la création de votre propre application, n'oubliez pas d'ajouter la validation à la saisie de l'utilisateur.

La logique de l'UserController est presque la même. Cette fois, nous demanderons le modèle utilisateur.

{
      "user": {
        "firstName": "firstName",
        "lastName": "lastName"
      }
    }

Tout est presque identique, seul le modèle et les champs changent. La sortie JSON. La méthode Show ressemblera à ceci:

{
      "users": 
      [
          {
            "firstName": "firstPersonsName",
            "lastName": "lastname"
          },
          {
            "firstName": "secondPersonName",
            "lastName": "lastName"
          }
      ]
    }

Cette fonction récupère un utilisateur avec l'ID donné.

Le dernier contrôleur avec lequel nous avons affaire est le Controller d'images. La logique est aussi simple que de saisir les images du système de fichiers et de les servir. C'est simple lorsque vous enregistrez des fichiers et récupérez avec le système de fichiers local ou le système de fichiers du serveur. Malheureusement, vous ne pouvez pas enregistrer des fichiers sur Heroku, donc vous utiliserons Dropbox et servir ces fichiers à partir de ce point final.

Importez le client Dropbox et l'adaptateur FlySystem. Si notre environnement est local, nous utiliserons FlySystem avec l'adaptateur local; Si l'environnement est la production, utilisez l'adaptateur Dropbox. Attribuez la classe FlySystem dans une variable privée à l'intérieur de ce contrôleur.

Ember.Inflector.inflector.irregular('formula', 'formulae');

La méthode Show servira ce fichier et la méthode Detrère supprimera ce fichier du système de fichiers. En utilisant cette bibliothèque, nous mettons un niveau d'abstraction dans notre application.

{
      "user": {
        "id": 1,
        "name": "firstName",
        "lastname": "lastname,
        "photos": [1, 2, 3]
      },
    
      "photos": 
      [
          {
            "id": 1,
            "title": "Lorem Ipsum"
          },
          {
            "id": 2,
            "title": "Lorem Ipsum"
          }
      ]
    }

La fonction destrust () est très simple. Sélectionnez simplement ce fichier en utilisant la méthode de suppression et en passant le nom du fichier à supprimer. Si le fichier n'est pas trouvé, retournez un 404.

<script type="text/x-handlebars">
    
        <!-- The navigation top-bar -->
        <nav  data-topbar>

            <ul >
                <li >
                    <h1><a href="#">Photo Upload</a></h1>
                </li>
            </ul>

            <section >

                <!-- Left Nav Section -->
                <ul >
                    <li >
                        <a href="#">Categories</a>
                        <ul >
                            <li><a href="#">Category1</a></li>
                            <li><a href="#">Category2</a></li>
                            <li><a href="#">Category3</a></li>
                            <li><a href="#">Category4</a></li>
                        </ul>
                    </li>
                </ul>

            </section>

            <div ></div>
            
        </nav><!-- END Navigation -->
        
        <!-- Content -->
        <div style="margin-top: 50px;">
            <!-- The content will be here -->
        </div><!-- END Content -->

    </script>

En fin de compte, l'imageController devrait ressembler à ceci:

php artisan controller:make PhotoController --except=create,edit

Le format que nous avons servi est HTML. Ok, c'est un peu bizarre. Nous voulions servir des images, pas HTML. Cependant, ce n'est pas un problème car le navigateur recherche le format de fichier et reconnaît comment utiliser ce fichier.

Allez-y et essayez de créer le catégorie contrôleur. Je l'ai laissé de côté comme un exercice pour vous.

tester l'API

Je dois admettre que je suis amoureux de phpstorm, et pour tester les API de repos, j'utilise un outil appelé REST Client. C'est une interface graphique qui simplifie les tests. Vous pouvez également utiliser Curl à partir du terminal si vous le souhaitez. Faisons quelques tests:

php artisan controller:make CategoryController --only=show,index

Et c'est ce qui est retourné:

Construisez des ressources de repos avec Laravel

avec le client de rest de phpstorm, je reçois le même résultat dans JSON.

Construisez des ressources de repos avec Laravel

Et si je veux voir les résultats dans un meilleur format, je peux simplement appuyer sur l'icône JS sur le côté gauche de l'outil et le client du reste me donne une représentation plus agréable.

Construisez des ressources de repos avec Laravel

Vous pouvez également tester d'autres verbes comme Supprimer et Poster. Allez-y et testez autant que vous le pouvez. Il existe d'autres clients que vous pouvez utiliser pour les tests: la console de repos et le facteur sont deux d'entre eux. Le premier est disponible uniquement sur Chrome, et le second, Postman, est disponible sur Chrome et Firefox. Postman semble plus simple et plus convivial. Allez-y et essayez-les.

Conclusion

Laravel simplifie nos travaux de construction d'API REST avec des contrôleurs de ressources. Nous avons vu comment l'interface doit être construite en utilisant des conventions Ember. Ember a choisi une bonne interface et en s'en tienant à cette logique, vous pouvez réutiliser facilement votre code sur d'autres plates-formes.

Dans cette partie, je me suis concentré davantage sur les concepts et je n'ai pas fait trop de codage. Le remplissage de toutes les méthodes et l'ajout de validation auraient étendu inutilement ce post, alors qu'il est déjà assez long et dans une longue série. Lors du développement, vous devez toujours valider l'entrée. Ne l'oubliez pas et testez, testez, testez. Les tests devraient être votre meilleur ami.

Dans le dernier épisode de cette série, nous allons tout rassembler dans une application en direct entièrement fonctionnelle.

Les questions fréquemment posées sur la création de ressources de repos avec Laravel

Comment créer un contrôleur de ressources dans Laravel?

Dans Laravel, vous pouvez créer un contrôleur de ressources à l'aide de l'outil de ligne de commande Artisan. La commande est PHP Artisan Make: Controller ContrônerName - Resource. Remplacez «ControLername» par le nom que vous souhaitez donner à votre contrôleur. Cette commande créera un contrôleur avec des méthodes pour toutes les opérations CRUD nécessaires. N'oubliez pas que le nom du contrôleur doit être sous forme singulière et devrait être un nom de classe PHP valide.

Quel est le but des ressources éloquentes de Laravel?

Laravel Les ressources éloquentes sont utilisées pour transformer votre Modèles ORM éloquents et collections de modèles au format JSON. Ceci est particulièrement utile lors de la construction d'API, car il vous permet de contrôler la forme et le format exact des données que vous souhaitez envoyer dans vos réponses API. Il fournit un moyen cohérent et gérable de contrôler la sortie des données.

Comment utiliser les ressources de l'API Laravel?

Pour utiliser les ressources API Laravel, vous devez d'abord créer une classe de ressources. Cela peut être fait en utilisant la commande Artisan Command PHP Artisan Make: Resource ResourceName. Une fois la classe de ressources créée, vous pouvez définir la transformation de la méthode TOARRAY de votre ressource. Pour retourner une ressource à partir d'un itinéraire, vous renvoyez simplement une nouvelle instance de la classe de ressources, en transmettant les données que vous souhaitez transformer.

Comment puis-je personnaliser les données renvoyées par une ressource Laravel?

Vous pouvez personnaliser les données renvoyées par une ressource Laravel en modifiant la méthode TOARRAY dans votre classe de ressources. La méthode TOARRAY est l'endroit où vous mappez les attributs du modèle éloquent à vos attributs de réponse API. Vous pouvez ajouter, supprimer ou modifier les attributs au besoin.

Quelle est la différence entre une ressource et une collection dans Laravel?

Dans Laravel, une classe de ressources représente un seul modèle qui doit être transformé en une structure JSON, tandis qu'une classe de collecte de ressources représente une collection des ressources. Une collection de ressources est utilisée pour transformer un tableau ou une collection de modèles en JSON.

Comment créer une collection de ressources dans Laravel?

Pour créer une collection de ressources dans Laravel, vous pouvez utiliser le Artisan Command Php Artisan Make: Resource ResourceCenameCollection - Collection. Cela créera une classe de collection de ressources où vous pouvez définir la transformation de la collection.

Comment retourner une collection de ressources à partir d'un itinéraire à Laravel?

pour renvoyer une collection de ressources à partir d'un itinéraire Dans Laravel, vous renvoyez simplement une nouvelle instance de la classe de collecte de ressources, transmettant la collection de modèles que vous souhaitez transformer.

Puis-je ajouter des métadonnées à une réponse des ressources dans Laravel?

Oui, vous pouvez ajouter des métadonnées à une réponse des ressources dans Laravel. Cela peut être fait en définissant une méthode avec la ressource. La méthode avec Retourne un tableau de méta-données que vous souhaitez inclure dans la réponse.

Comment gérer les attributs conditionnels dans les ressources Laravel?

Les ressources Laravel fournissent une méthode qui vous permet de Ajoutez conditionnellement les attributs à la réponse des ressources. La méthode quand accepte deux arguments: la condition qui détermine si l'attribut doit être inclus, et la valeur de l'attribut si la condition est vraie.

Puis-je utiliser des ressources Laravel avec la pagination?

Oui, les ressources Laravel fonctionnent parfaitement avec la pagination intégrée de Laravel. Lorsque vous paginez une requête éloquente de Laravel, Laravel renverra automatiquement une réponse JSON qui inclut les résultats paginés ainsi que les liens de pagination. Si vous souhaitez personnaliser la réponse paginée, vous pouvez utiliser une collection de ressources.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn