Vous êtes un développeur PHP. J’ai compris. Moi aussi. Mon parcours vers PHP n’a pas pris la route normale que la plupart des développeurs PHP empruntent dans leur quête du langage de programmation parfait. J’ai commencé comme développeur Java et j’ai passé environ 10 ans à vivre dans ce monde. J’étais l’un de ces développeurs Java purs et durs qui, lorsque PHP était introduit dans une conversation, je commençais à débiter des choses comme l’entreprise, l’évolutivité et d’autres bêtises.
J’ai commencé à travailler sur un projet open source qui avait besoin d’un front-end web social il y a environ 5 ans et l’équipe devait choisir un langage de programmation pour le site. J’ai exploré Java et la plupart des autres langages, mais j’ai opté pour PHP pour un certain nombre de raisons. J’ai eu du mal à ravaler ma fierté et à commencer à coder en PHP, mais ce qui s’est passé au cours de ce projet tient du miracle. Je suis tombé amoureux de ce langage et j’ai commencé à l’utiliser pour le plus grand nombre de projets possible, tout en laissant mes racines Java dans la poussière. PHP m’a bien servi au cours des cinq dernières années, mais je cherchais toujours le Saint Graal d’un langage de programmation rapide à développer, soutenu par les entreprises, performant et évolutif, tout en offrant une forte communauté de développeurs. Je crois que Node.js répond à toutes mes exigences tout en étant un langage en pleine croissance et évolution.
La première chose que vous devez comprendre est que Node.js n’est pas seulement pour les développeurs branchés ou les adopteurs précoces. Il est utilisé par certains des sites Web les plus fréquentés sur Internet aujourd’hui et continue de gagner le cœur et l’esprit des développeurs. Il est vraiment à un point où vous pouvez lui faire confiance même pour le plus compliqué des systèmes.
Node.js est JavaScript##
Si vous pensez que vous devez apprendre un tout nouveau langage pour être productif avec Node.js, vous avez probablement tort. La plupart des développeurs sont déjà familiers avec JavaScript et c’est le langage et la sémantique avec lesquels vous travaillerez lorsque vous coderez dans Node.js. En fait, un article récent publié par Red Monk qui tente de donner un sens aux projets github pour déterminer les langages les plus populaires a fait de JavaScript le roi. Les trois premiers langages sont les suivants :
- JavaScript
- Java
- PHP
Étant donné la popularité de JavaScript et son adoption généralisée dans notre industrie, si vous n’êtes pas déjà familier avec lui, il est probablement temps de vous atteler à son apprentissage.
Si Node.js utilise simplement JavaScript, qu’est-ce que c’est exactement ? ##
En un mot, Node.js est une plateforme pour les activités côté serveur. Il utilise le langage de programmation Javascript et dispose d’une pléthore de bibliothèques disponibles sous forme de modules npm. Vous pouvez considérer ces modules npm comme des dépendances de bibliothèques qui peuvent être satisfaites par Composer si vous venez du pays de PHP. En fait, le système de gestion des dépendances par défaut pour PHP (Composer) a été inspiré par Node.js selon le site officiel. Il y a de fortes chances que si vous avez besoin d’un peu de fonctionnalité et que vous n’avez pas envie d’écrire tout le code vous-même, il y a un module npm disponible qui fournit déjà les fonctionnalités que vous recherchez.
Les applications Node sont normalement mises en œuvre lorsque vous devez maximiser l’efficacité en utilisant des E/S non bloquantes et des événements asynchrones. Un piège que les développeurs PHP doivent connaître est que les applications Node.js fonctionnent dans un seul thread. Cependant, le code backend Node.js utilise plusieurs threads pour des opérations telles que l’accès au réseau et aux fichiers. Compte tenu de cela, Node est parfait pour les applications où une expérience en temps quasi réel est souhaitée.
Démarrer avec un exemple de projet##
Pour le reste de ce billet de blog, je vais vous montrer comment vous mettre à niveau avec Node.js en venant d’un fond PHP. L’exemple d’application que nous allons écrire est un simple service dorsal qui fournira l’emplacement de chaque magasin Walmart. J’ai choisi Walmart pour cet exemple parce que, tout simplement, c’est le Saint Graal de tous les grands magasins. Si Walmart ne l’a pas, vous n’en avez pas besoin.
À la fin de ce billet de blog, vous verrez comment il est rapide et facile de créer une API basée sur REST en utilisant Node.js qui est alimentée par la populaire base de données MongoDB. J’ai choisi cet exemple basé sur REST parce que la création d’une API dorsale est rapidement devenue un cas d’utilisation courant dans la plupart des applications modernes.
J’avais initialement prévu de créer la même application à la fois en PHP et en Node.js pour faciliter la transition pour vous, mais afin de couvrir tous les différents frameworks et façons de créer des services basés sur REST en PHP, cela justifierait un livre entier et ne peut tout simplement pas être couvert dans un seul billet de blog. J’ai alors pensé à utiliser le framework Laravel, dont la popularité ne cesse de croître. Cependant, je ne toucherais encore qu’un quart des développeurs PHP. Personnellement, mon framework préféré est CodeIgniter, mais il perd rapidement du terrain et ne représente plus que moins de 8 % de la population des développeurs PHP. Sitepoint a récemment publié un article discutant de cette même chose et fournit le tableau suivant représentant les frameworks les plus prometteurs pour 2014.
Compte tenu des grandes différences dans la façon de configurer les connexions de base de données et de créer des services REST pour chaque framework, je vais supposer que vous savez comment faire cela pour votre framework en PHP et au lieu de cela, je vais me concentrer uniquement sur le code Node.js.
Création de notre application Node.js##
Pour le reste de ce post, nous allons créer l’application de localisation Walmart en utilisant le framework LoopBack API de StrongLoop. En prime, je vous guiderai dans l’installation de Node.js sur OSX. Alors prenez votre tasse de café, asseyez-vous, détendez-vous et mettons-nous au travail.
Etape 1 : Installation de Node.js##
La façon la plus simple d’installer Node.js est via l’un des paquets binaires disponibles pour la plupart des systèmes d’exploitation. Dirigez votre navigateur vers l’URL suivante et téléchargez celui qui convient à votre système d’exploitation :
http://nodejs.org/download/
Une fois cette page chargée, vous devriez voir ce qui suit :
Si vous utilisez Mac OSX, cliquez sur le fichier .pkg universel. Cela permettra d’enregistrer le programme d’installation sur votre ordinateur local. Une fois le fichier téléchargé, lancez le programme d’installation en double-cliquant sur le fichier .pkg qui a été téléchargé et le dialogue d’installation vous sera présenté :
Complétez le processus d’installation en utilisant tous les paramètres par défaut et enfin cliquez sur le bouton de fermeture pour quitter le programme une fois l’installation réussie. Plutôt facile, hein ?
Étape 2 : Installation de LoopBack avec NPM
Maintenant que nous avons Node.js installé sur notre système local, nous voulons installer les paquets LoopBack qui est fourni par StrongLoop. LoopBack est un framework API open source qui fournit des fonctionnalités qui vous faciliteront la vie lorsque vous commencerez à apprendre comment écrire et déployer des logiciels écrits en Node.js.
Pour installer LoopBack, nous utiliserons la commande npm qui fait partie de la distribution de base de Node.js. NPM est le gestionnaire de paquets officiel pour installer les bibliothèques ou les modules dont dépendent vos applications. Étant donné que ce billet est écrit pour les développeurs PHP, une façon simple de penser aux modules NPM est de les relier à Composer. Grâce au système de dépendances de Composer, les développeurs sont en mesure de spécifier les dépendances dans leur fichier composer.json. Une fois que les paquets ont été définis dans le fichier composer.json, un développeur PHP doit simplement émettre la commande install qui devrait être similaire à ce qui suit:
$ php composer.phar install
NPM modules fonctionne de la même manière et utilise le fichier package.json pour vous permettre de spécifier les dépendances pour une application particulière. Vous pouvez également installer des dépendances à partir de la ligne de commande pour les rendre disponibles sur votre système local. Ne vous inquiétez pas si vous ne comprenez pas tout de suite car nous couvrirons le fichier package.json plus en détail dans une étape ultérieure.
Pour installer LoopBack, nous pouvons émettre une seule commande qui téléchargera et installera toutes les dépendances dont nous avons besoin pour le paquet. Ouvrez votre fenêtre de terminal et émettez la commande suivante :
$ npm install -g strongloop
Note : Vous devrez peut-être utiliser sudo en fonction de votre installation
Que vient-il de se passer ? Nous avons dit à npm que nous voulions installer le paquet strongloop tout en fournissant également l’option -g
. L’option -g
rend le paquet disponible en tant que paquet global pour toute personne sur le système et est disponible pour toutes les applications. Une fois que vous exécutez la commande ci-dessus, NPM téléchargera le paquet ainsi que toutes les dépendances qui sont nécessaires. Selon la vitesse de votre système, cela peut prendre quelques minutes.
Etape 3 : Création de notre application##
Créer une application en utilisant l’API LoopBack est très facile et direct. Il suffit d’ouvrir votre fenêtre de terminal et de lancer la commande suivante pour créer une nouvelle application appelée locatewalmart
.
$ slc loopback _-----_ | | .--------------------------. |--(o)--| | Let's create a LoopBack | `---------´ | application! | ( _´U`_ ) '--------------------------' /___A___\ | ~ | __'.___.'__ ´ ` |° ´ Y ` Enter a directory name where to create the project: locatewalmart create locatewalmart/ info change the working directory to locatewalmart
L’utilitaire slc
va maintenant créer un nouveau projet basé sur LoopBack appelé locatewalmart
et configurer le projet. Quand on nous demande le nom de l’application, nous pouvons garder la valeur par défaut.
What's the name of your application? locatewalmart
Après avoir exécuté la commande ci-dessus, un nouveau répertoire pour votre projet sera créé pour votre application. Passez au répertoire de l’application avec la commande cd:
$ cd locatewalmart
Maintenant que nous avons notre application créée, nous voulons ajouter le support de MongoDB comme source de données pour le bouclage.
Etape 4 : Définir notre DataSource##
Afin de communiquer avec MongoDB, nous devons ajouter une source de données à notre application. Nous le faisons en exécutant:
$ slc loopback:datasource mymongo Enter the data-source name: mymongo Select the connector for mymongo:PostgreSQL (supported by StrongLoop)Oracle (supported by StrongLoop)Microsoft SQL (supported by StrongLoop)❯ MongoDB (supported by StrongLoop)SOAP webservices (supported by StrongLoop)REST services (supported by StrongLoop)Neo4j (provided by community)(Move up and down to reveal more choices)
Etape 5 : Pointer vers la vraie datasource##
Afin de communiquer avec MongoDB, nous devons pointer la datasource vers l’instance MongoDB réelle. LoopBack définit toute la configuration des datasources dans le fichier datasource.json
qui se trouve dans le répertoire root/server
de vos applications. Ouvrez ce fichier et ajoutez une datasource pour MongoDB comme indiqué dans le code suivant:
{ "db": { "name": "db", "connector": "memory" }, "mymongo": { "name": "mymongo", "connector": "mongodb" "url": "mongodb://localhost:27017/locatewalmart" }}
Note : Assurez-vous de fournir l’URL de connexion correcte pour votre base de données MongoDB. Pour cet exemple, j’ai une base de données créée localement appelée locatewalmart que je veux utiliser pour ma source de données.
Maintenant que nous avons notre base de données définie, il y a quelques choses supplémentaires que nous devons faire. Tout d’abord, nous devons spécifier que nos applications dépendent du paquet loopback-connector-mongodb
. Pour spécifier une dépendance, vous modifiez le fichier package.json qui est similaire à l’édition du fichier composer.json
en PHP. Ouvrez le fichier package.json
qui se trouve dans le répertoire racine de votre application et ajoutez le loopback-connector-mongodb
à la section des dépendances. Après cela, vous pouvez exécuter npm install.
Alternativement, vous pouvez simplement exécuter:
$ npm install loopback-connector-mongodb --save
Cela mettra automatiquement à jour le package.json
. La section devrait ressembler à ce qui suit:
"dependencies": { "compression": "^1.0.3", "errorhandler": "^1.1.1", "loopback": "^2.0.0", "loopback-boot": "^2.0.0", "loopback-connector-mongodb": "^1.4.1", "loopback-datasource-juggler": "^2.0.0", "serve-favicon": "^2.0.1" }
Etape 6 : Importer des données dans MongoDB##
Maintenant que nous avons notre source de données configurée, nous devons charger l’ensemble de données dans notre base de données MongoDB.
La première chose que nous voulons faire est de télécharger un fichier JSON qui a toutes les données que nous voulons retourner. Vous pouvez le récupérer à l’URL suivante:
https://dl.dropboxusercontent.com/u/72466829/walmart.json
Une fois que vous avez téléchargé l’ensemble de données, il suffit de l’importer dans votre base de données en utilisant la commande mongoimport comme indiqué ci-dessous:
$ mongoimport --jsonArray -d locatewalmart -c store --type json --file walmart.json -h yourMongoHost --port yourMongoPort -u yourMongoUsername -p yourMongoPassword
Vous devriez voir les résultats suivants :
connected to: 127.0.0.12014-08-17T13:07:26.301-0400 check 9 31762014-08-17T13:07:26.305-0400 imported 3176 objects
Etape 7 : Création de notre modèle Store##
Un modèle peut être considéré dans les mêmes termes que vous pensez aux modèles en terre PHP si vous utilisez un framework MVC. C’est une représentation d’un objet qui, dans ce cas, est un magasin Walmart. LoopBack offre un moyen pratique de créer des objets modèles en utilisant la ligne de commande. Ouvrez votre fenêtre de terminal, allez dans le dossier du projet et lancez la commande suivante:
$ slc loopback:model
Cela va commencer une session interactive où vous pouvez définir votre modèle. La première chose qui vous sera demandée est la source de données à laquelle vous voulez associer le modèle. Nous allons sélectionner la source de données mymongo que nous venons de créer auparavant. Ensuite, il vous sera demandé le nom pluriel du modèle. Utilisons le nom par défaut (stores) et appuyons sur la touche entrée.
Enter the model name: store Select the data-source to attach store to:db (memory)❯ mymongo (mongodb) Expose store via the REST API? Yes Custom plural form (used to build REST URL):
Une fois que vous aurez appuyé sur la touche entrée, vous serez invité à spécifier les propriétés du modèle de magasin. Vous pouvez penser à cela comme à des var(s) que vous définissez sur une classe en PHP.
Enter an empty property name when done. Property name:
Les propriétés que nous voulons ajouter sont le type de magasin, la date d’ouverture, la latitude et la longitude.
Property name: opendate invoke loopback:property
Une fois que vous avez appuyé sur la touche entrée, vous serez invité à fournir le type de données pour chaque propriété spécifiée. Le premier élément sera opendate et nous voulons sélectionner qu’il est de type date. Sélectionnez date et appuyez sur la touche entrée.
Property type: string number boolean object array❯ date buffer geopoint (other)
Puis on vous demandera si vous voulez que cette propriété soit obligatoire pour la validation du schéma. Nous entrerons « oui ».
Required? (y/N) : y
On vous demandera ensuite le type de données pour chaque propriété restante. Donnez les réponses suivantes :
Property name: type_store invoke loopback:property Property type: (Use arrow keys)❯ string number boolean object array date buffer geopoint (other) Required? (y/N) : yLet's add another store property.Enter an empty property name when done. Property name: latitude invoke loopback:property Property type: (Use arrow keys)❯ string number boolean object array date buffer geopoint (other) Required? (y/N) : yLet's add another store property.Enter an empty property name when done. Property name: longitude invoke loopback:property Property type: (Use arrow keys)❯ string number boolean object array date buffer geopoint (other) Required? (y/N) : y
Tapez « oui » et appuyez sur la touche entrée.
Félicitations ! vous venez de créer votre premier objet modèle en utilisant LoopBack en conjonction avec Node.js. Pour voir ce qui a été réellement créé sous les couvertures, ouvrez le fichier store.json
qui est situé dans le répertoire root/common/models
de votre répertoire d’application. Trouvez l’entrée stores qui ressemblera à ce qui suit:
{ "name": "store", "base": "PersistedModel", "properties": { "opendate": { "type": "date", "required": true }, "type_store": { "type": "string", "required": true }, "latitude": { "type": "string", "required": true }, "longitude": { "type": "string", "required": true } }, "validations": , "relations": {}, "acls": , "methods": }
Comme vous pouvez le voir, nous avons un modèle créé et les propriétés que nous avons définies sont affectées au modèle de magasin. Le champ public spécifie que nous voulons exposer ce modèle au monde via un service web REST.
Le mappage du modèle à la datasource est défini dans le model-config.json
sous le dossier racine de l’app/serveur. Le champ datasource spécifie la source de données que ce modèle utilisera pour les opérations CRUD.
"store": { "dataSource": "mymongo", "public": true }
Etape 8 : Tester l’API basée sur REST##
Devinez quoi ? Vous venez de créer votre premier service web basé sur REST en utilisant Node.js. Ce n’était pas si mal, n’est-ce pas ? Vérifions-le en faisant pointer notre navigateur vers l’application que nous venons de créer. Vous pouvez le faire en allant à l’URL suivante:
http://0.0.0.0:3000/api/stores/
Vous serez présenté avec une représentation JSON de tous les magasins Walmart que nous avons importés dans la base de données comme le montre l’image suivante:
Utilisation de l’explorateur StrongLoop##
Bien, c’est génial. Nous disposons d’un point de terminaison REST qui renvoie tous les magasins Walmart de la base de données, mais les choses semblent encore manquer un peu, car nous n’avons pas d’interface de gestion pour travailler avec les données ou vérifier que toutes les opérations CRUD fonctionnent. Heureusement, StrongLoop propose un navigateur pratique qui vous permettra d’explorer tous les points de terminaison de votre application. Pour le tester, ouvrez votre navigateur et accédez à l’URL suivante :
http://0.0.0.0:3000/explorer/
Une fois la page de l’explorateur chargée, développez l’API stores
pour voir toutes les opérations disponibles qui sont autorisées sur l’objet modèle. Ceci est montré dans l’image suivante:
Comme exemple de ce que vous pouvez faire avec l’Explorateur, développez l’API /stores/findOne
et cliquez sur le lien Try it out!
qui interrogera la base de données et retournera un enregistrement comme le montre l’image suivante :
Pour aller un peu plus loin en ajoutant une représentation cartographique##
Awesome, nous avons créé un endpoint basé sur REST qui renverra une liste de tous les magasins Walmart dans notre base de données. Pour illustrer davantage la rapidité avec laquelle on peut développer des applications complètes avec StrongLoop, construisons un front-end réactif qui contient une carte avec des épingles pour chaque magasin Walmart.
Etape 1 : Créer le répertoire public##
Par défaut, comme spécifié dans le fichier app.js du projet, tout fichier dans le répertoire public situé dans le répertoire racine des applications sera servi au demandeur. Cependant, ce répertoire peut ne pas exister par défaut, nous devons donc le créer. Ouvrez votre terminal et passez au répertoire racine de votre application et lancez la commande suivante:
$ mkdir public
Etape 2 : Créer la carte responsive##
La prochaine chose que nous devons faire est de créer une belle représentation des données. Puisque nous avons la latitude et la longitude de chaque magasin, il serait formidable d’exprimer ce contenu avec une carte que l’utilisateur peut faire glisser, zoomer, etc. Cette tâche est en fait beaucoup plus facile que vous ne le pensez si nous tirons parti de certaines bibliothèques existantes. A la fin de la création de cette vue responsive, le résultat ressemblera à ce qui suit:
De plus, l’utilisateur pourra zoomer à un niveau très détaillé de la carte pour voir le Walmart le plus proche comme le montre l’image suivante:
Le code de la vue web de l’application tire profit des propriétés de longitude et de latitude que nous avons définies sur notre objet modèle et importées dans la base de données. Nous utiliserons également la populaire bibliothèque Leaflet pour créer la carte et placer les épingles, ou marqueurs, sur la carte.
Pour créer cette carte, créez un nouveau fichier dans le répertoire public nommé locatewalmart.html
et ajoutez le code JavaScript suivant :
<!doctype html><html lang="en"><head> <title>Walmart Stores</title> <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.5.1/leaflet.css" /><!--> <link rel="stylesheet" href="http://cdn.leafletjs.com/leaflet-0.5.1/leaflet.ie.css" /><!--><script src="https://code.jquery.com/jquery-2.0.0.min.js"></script><link href='http://fonts.googleapis.com/css?family=oswald' rel='stylesheet' type='text/css'><meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /><style type="text/css">body { padding: 0; margin: 0;}html, body, #map { height: 100%; font-family: 'oswald';}.leaflet-container .leaflet-control-zoom { margin-left: 13px; margin-top: 70px;}#map { z-index: 1;}#title { z-index: 2; position: absolute; left: 10px; }</style></head><body><h1>Walmart Stores</h1><div></div><script src="http://cdn.leafletjs.com/leaflet-0.5.1/leaflet.js"></script><script>center = new L.LatLng(39.83, -98.58);zoom = 5;var map = L.map('map').setView(center, zoom);var markerLayerGroup = L.layerGroup().addTo(map);L.tileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {maxZoom: 18,attribution: 'Map data © <a href="http://openstreetmap.org">OpenStreetMap</a> contributors, <a href="http://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>'}).addTo(map);function getPins(e){url = "http://0.0.0.0:3000/api/stores";$.get(url, pinTheMap, "json")}function pinTheMap(data){//clear the current pinsmap.removeLayer(markerLayerGroup);//add the new pinsvar markerArray = ;var lastNumber = 0;for (var i = 0; i < data.length; i++){store = data;if(store.latitude.length > 0 && store.longitude.length>0) {markerArray.push(L.marker());}}markerLayerGroup = L.layerGroup(markerArray).addTo(map);}map.whenReady(getPins)</script></body></html>
Comme vous pouvez le voir, le code est juste du HTML et du JavaScript standard. La partie intéressante est la fonction getPins(e) où nous faisons un appel REST à l’API que nous avons créée précédemment dans cet article de blog. Nous itérons ensuite sur chaque magasin et créons une épingle en fonction de la latitude et de la longitude de chaque magasin. Plutôt astucieux, hein ?
Conclusion##
Dans ce billet de blog, je vous ai montré comment créer un service web basé sur REST qui renvoie une liste des magasins Walmart aux États-Unis. Après avoir créé le service web à l’aide de Loopback, nous avons ajouté une représentation frontale des données. Avec très peu de travail, nous avons pu développer une application entièrement fonctionnelle beaucoup plus rapidement que ce que l’on pourrait faire avec le langage de son choix. Nous avons également discuté de certaines des similitudes entre Node.js et PHP. Bien que je considère toujours PHP comme un excellent langage, j’ai personnellement trouvé que Node.js fait un excellent langage suivant à apprendre étant donné le riche écosystème de bibliothèques et la vitesse avec laquelle je suis capable de créer des applications.
J’ai inclus un tableau rapide que vous pouvez consulter lorsque vous comparez Node.js à PHP.
Fonctionnalité |
PHP |
Node.js |
Grand IDE |
Oui, choix multiples avec IntelliJ, Zend Studio, Netbeans, etc |
Oui, choix multiple avec Eclipse, Visual Studio, Codenvy, etc |
Gestion des dépendances |
Composer, PEAR |
NPM |
Prêt pour l’entreprise |
Oui |
Oui |
Grand écosystème de bibliothèques |
Oui, mais parfois difficile à trouver |
Oui |
Cadres communs |
CodeIgniter, CakePHP, Laravel, etc |
Express, Meteor, etc |
Support des bases de données |
Oui |
Oui |
Non-bloquante |
Non |
Oui |
Tests de test |
Oui |
Oui |
Applications temps réeltemps réel |
Oui, avec des processus supplémentaires tels que Apache WebSocket, etc. |
Oui |
Serveur web intégré |
Non, la plupart des gens l’utilisent conjointement avec Apache |
Oui |
- Prêt à développer des API dans Node.js et les connecter à vos données ? Découvrez le framework Node.js LoopBack. Nous avons fait en sorte qu’il soit facile de commencer soit localement soit sur votre cloud préféré, avec un simple npm install.