Sei uno sviluppatore PHP. Ho capito. Anche io. Il mio viaggio verso PHP non ha preso la strada normale che la maggior parte degli sviluppatori PHP percorrono nella loro ricerca del linguaggio di programmazione perfetto. Inizialmente ho iniziato come sviluppatore Java e ho passato circa 10 anni a vivere in quella terra. Ero uno di quegli irriducibili sviluppatori Java che quando PHP veniva introdotto in una conversazione, iniziavo a sparare cose come impresa, scalabilità e altre sciocchezze.

Ho iniziato a lavorare su un progetto open source che aveva bisogno di un front-end web sociale circa 5 anni fa e il team doveva scegliere un linguaggio di programmazione per il sito. Ho esplorato Java e molti altri linguaggi, ma ho scelto PHP per una serie di motivi. È stata dura ingoiare il mio orgoglio e iniziare a programmare in PHP, ma quello che è successo durante quel progetto è stato a dir poco un miracolo. Mi sono innamorato del linguaggio e ho iniziato a usarlo per tutti i progetti che potevo trovare, lasciando le mie radici Java nella polvere. PHP mi ha servito bene negli ultimi 5 anni, ma ero ancora alla ricerca del Santo Graal di un linguaggio di programmazione che fosse veloce da sviluppare, con un supporto aziendale, performante e scalabile e che fornisse anche una forte comunità di sviluppatori. Credo che Node.js soddisfi tutti i miei requisiti pur essendo un linguaggio in rapida crescita ed evoluzione.

La prima cosa che dovete capire è che Node.js non è solo per gli sviluppatori hipster o gli early adopters. È in uso da alcuni dei siti web più trafficati su Internet oggi e sta continuando a conquistare i cuori e le menti degli sviluppatori. È veramente ad un punto in cui ci si può fidare di lui anche per i sistemi più complicati.

Node.js è JavaScript##

Se stai pensando di dover imparare un nuovo linguaggio per essere produttivo con Node.js, probabilmente ti sbagli. La maggior parte degli sviluppatori ha già familiarità con JavaScript e questo è il linguaggio e la semantica con cui lavorerai quando codifichi in Node.js. Infatti, un recente articolo pubblicato da Red Monk che cerca di dare un senso ai progetti github per determinare i linguaggi più popolari ha JavaScript come re. I primi tre linguaggi sono i seguenti:

  • JavaScript
  • Java
  • PHP

Data la popolarità di JavaScript e la sua adozione diffusa nel nostro settore, se non hai ancora familiarità con esso, è probabilmente il momento di metterti sotto e iniziare a impararlo.

Se Node.js usa solo JavaScript, cos’è esattamente? ##

In poche parole, Node.js è una piattaforma per attività lato server. Utilizza il linguaggio di programmazione Javascript e ha una pletora di librerie disponibili come moduli npm. Puoi pensare a questi moduli npm come a dipendenze di librerie che possono essere soddisfatte con Composer se vieni dalla terra di PHP. Infatti, il sistema di gestione delle dipendenze predefinito per PHP (Composer) è stato ispirato da Node.js secondo il sito ufficiale. È probabile che se hai bisogno di un po’ di funzionalità e non hai voglia di scrivere tutto il codice da solo, c’è un modulo npm disponibile che fornisce già le caratteristiche che stai cercando.

Le applicazioni Node sono normalmente implementate quando è necessario massimizzare l’efficienza utilizzando I/O non bloccanti ed eventi asincroni. Una cosa che gli sviluppatori PHP devono sapere è che le applicazioni Node.js vengono eseguite in un singolo thread. Tuttavia, il codice backend di Node.js utilizza più thread per operazioni come la rete e l’accesso ai file. Dato questo, Node è perfetto per le applicazioni in cui si desidera un’esperienza quasi in tempo reale.

Inizio con un progetto di esempio###

Per il resto di questo post, ti mostrerò come prendere velocità con Node.js venendo da un background PHP. L’applicazione di esempio che scriveremo è un semplice servizio di backend che fornirà la posizione di ogni negozio Walmart. Ho scelto Walmart per questo esempio perché, molto semplicemente, è il Santo Graal di tutti i grandi magazzini. Se Walmart non ce l’ha, non ne avete bisogno.

Entro la fine di questo post sul blog, vedrete quanto sia facile e veloce creare un’API basata su REST usando Node.js che è alimentata dal popolare database MongoDB. Ho scelto questo esempio basato su REST perché la creazione di un’API di backend è diventata rapidamente un caso d’uso comune nella maggior parte delle applicazioni moderne.

Io avevo originariamente pianificato di creare la stessa applicazione sia in PHP che in Node.js per aiutarvi a facilitare la transizione, ma per coprire tutti i diversi framework e modi di creare servizi basati su REST in PHP, sarebbe stato necessario un intero libro e semplicemente non può essere coperto in un singolo post sul blog. Allora ho pensato di usare solo il framework Laravel, dato che sta continuando a crescere in popolarità. Tuttavia, raggiungerei solo un quarto degli sviluppatori PHP. Personalmente, il mio framework preferito è CodeIgniter, ma sta rapidamente perdendo terreno e ora rappresenta solo meno dell’8% della popolazione di sviluppatori PHP. Sitepoint ha recentemente pubblicato un articolo che discute proprio di questo e fornisce il seguente grafico che rappresenta i framework che mostrano le maggiori promesse per il 2014.

Viste le grandi differenze su come configurare le connessioni al database e creare servizi REST per ogni framework, assumerò che tu sappia come fare questo per il tuo framework in PHP e invece mi concentrerò solo sul codice Node.js.

Creazione della nostra applicazione Node.js##

Per il resto di questo post, creeremo l’applicazione Walmart locator usando il framework LoopBack API di StrongLoop. Come bonus aggiuntivo, vi guiderò attraverso l’installazione di Node.js su OSX. Quindi prendi la tua tazza di caffè, siediti, rilassati e mettiamoci al lavoro.

Passo 1: Installazione di Node.js##

Il modo più semplice per installare Node.js è tramite uno dei pacchetti binari disponibili per la maggior parte dei sistemi operativi. Punta il tuo browser al seguente URL e scarica quello corretto per il tuo sistema operativo:

http://nodejs.org/download/

Una volta caricata questa pagina, dovresti vedere quanto segue:

Se stai usando Mac OSX, clicca sul file .pkg universale. Questo salverà il programma di installazione sul tuo computer locale. Una volta che il file è stato scaricato, avvia il programma di installazione facendo doppio clic sul file .pkg che è stato scaricato e ti verrà presentata la finestra di dialogo di installazione:

Completa il processo di installazione utilizzando tutte le impostazioni predefinite e infine clicca sul pulsante di chiusura per uscire dal programma una volta che l’installazione ha avuto successo. Abbastanza facile, eh?

Step 2: Installare LoopBack con NPM

Ora che abbiamo Node.js installato sul nostro sistema locale, vogliamo installare i pacchetti LoopBack che è fornito da StrongLoop. LoopBack è un framework API open source che fornisce funzionalità che ti renderanno la vita più facile quando inizierai a imparare come scrivere e distribuire software scritto in Node.js.

Per installare LoopBack, useremo il comando npm che fa parte della distribuzione principale di Node.js. NPM è il gestore ufficiale dei pacchetti per installare le librerie o i moduli da cui dipendono le vostre applicazioni. Dato che questo post è scritto per gli sviluppatori PHP, un modo semplice per pensare ai moduli NPM è quello di metterlo in relazione con Composer. Usando il sistema di dipendenze di Composer, gli sviluppatori sono in grado di specificare le dipendenze nel loro file composer.json. Una volta che i pacchetti sono stati definiti nel file composer.json, uno sviluppatore PHP ha semplicemente bisogno di lanciare il comando install che dovrebbe essere simile al seguente:

$ php composer.phar install

Moduli NPM funziona allo stesso modo e utilizza il file package.json per permettere di specificare le dipendenze per una particolare applicazione. Puoi anche installare le dipendenze dalla riga di comando per renderle disponibili sul tuo sistema locale. Non preoccupatevi se non lo capite ancora, perché tratteremo il file package.json in modo più dettagliato in un passo successivo.

Per installare LoopBack, possiamo lanciare un singolo comando che scaricherà e installerà tutte le dipendenze di cui abbiamo bisogno per il pacchetto. Aprite la vostra finestra di terminale ed eseguite il seguente comando:

$ npm install -g strongloop

Nota: Potreste dover usare sudo a seconda della vostra installazione

Cosa è appena successo? Abbiamo detto a npm che vogliamo installare il pacchetto strongloop fornendo anche l’opzione -g. L’opzione -g rende il pacchetto disponibile come pacchetto globale per chiunque sul sistema da usare ed è disponibile per tutte le applicazioni. Una volta eseguito il comando di cui sopra, NPM scaricherà il pacchetto così come tutte le dipendenze richieste. A seconda della velocità del tuo sistema, questo potrebbe richiedere alcuni minuti per essere completato.

Step 3: Creare la nostra applicazione##

Creare un’applicazione usando l’API LoopBack è molto facile e diretto. Apri semplicemente la tua finestra del terminale e dai il seguente comando per creare una nuova applicazione chiamata 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’utilità slc creerà ora un nuovo progetto basato su LoopBack chiamato locatewalmart e configurerà il progetto. Quando ci viene richiesto il nome dell’applicazione, possiamo mantenere quello predefinito.

What's the name of your application? locatewalmart

Dopo aver eseguito il comando di cui sopra, verrà creata una nuova directory per il tuo progetto. Passa alla directory dell’applicazione con il comando cd:

$ cd locatewalmart

Ora che abbiamo creato la nostra applicazione, vogliamo aggiungere il supporto per MongoDB come datasource per il loopback.

Step 4: Definire il nostro DataSource###

Per poter comunicare con MongoDB, dobbiamo aggiungere un datasource alla nostra applicazione. Lo facciamo eseguendo:

$ 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)

Step 5: Puntare al vero datasource###

Per comunicare con MongoDB, dobbiamo puntare il datasource all’istanza reale di MongoDB. LoopBack definisce tutta la configurazione del datasource nel file datasource.json che si trova nella directory root/server della tua applicazione. Apri questo file e aggiungi un datasource per MongoDB come mostrato nel seguente codice:

{ "db": { "name": "db", "connector": "memory" }, "mymongo": { "name": "mymongo", "connector": "mongodb" "url": "mongodb://localhost:27017/locatewalmart" }}

Nota: Assicurati di fornire il corretto URL di connessione per il tuo database MongoDB. Per questo esempio, ho un database creato localmente chiamato locatewalmart che voglio usare per il mio datasource.

Ora che abbiamo definito il nostro database, ci sono un paio di cose extra che dobbiamo fare. Prima di tutto dobbiamo specificare che la nostra applicazione dipende dal pacchetto loopback-connector-mongodb. Per specificare una dipendenza, si modifica il file package.json che è simile alla modifica del file composer.json in PHP. Aprite il file package.json che si trova nella directory principale della vostra applicazione e aggiungete il loopback-connector-mongodb alla sezione delle dipendenze. Dopo di che puoi eseguire npm install.

In alternativa puoi semplicemente eseguire:

$ npm install loopback-connector-mongodb --save

Questo aggiornerà automaticamente il package.json. La sezione dovrebbe assomigliare alla seguente:

"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" }

Step 6: Importare i dati in MongoDB###

Ora che abbiamo il nostro datasource configurato, dobbiamo caricare il set di dati nel nostro database MongoDB.

La prima cosa che vogliamo fare è scaricare un file JSON che ha tutti i dati che vogliamo restituire. Puoi prenderlo al seguente URL:

https://dl.dropboxusercontent.com/u/72466829/walmart.json

Una volta che hai scaricato l’insieme di dati, importalo semplicemente nel tuo database usando il comando mongoimport come mostrato qui sotto:

$ mongoimport --jsonArray -d locatewalmart -c store --type json --file walmart.json -h yourMongoHost --port yourMongoPort -u yourMongoUsername -p yourMongoPassword

Dovresti vedere i seguenti risultati:

connected to: 127.0.0.12014-08-17T13:07:26.301-0400 check 9 31762014-08-17T13:07:26.305-0400 imported 3176 objects

Passo 7: Creare il nostro modello di Store##

Un modello può essere pensato negli stessi termini in cui si pensa ai modelli in PHP se si usa un framework MVC. È una rappresentazione di un oggetto, che in questo caso è un negozio di Walmart. LoopBack fornisce un modo conveniente per creare oggetti modello usando la linea di comando. Aprite la vostra finestra di terminale, andate nella cartella del progetto e date il seguente comando:

$ slc loopback:model

Questo inizierà una sessione interattiva dove potrete definire il vostro modello. La prima cosa che ti verrà chiesta è il datasource a cui vuoi associare il modello. Noi selezioneremo il datasource mymongo che abbiamo appena creato prima. Poi verrà chiesto il nome plurale per il modello. Usiamo quello predefinito (negozi) e premiamo invio.

 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):

Una volta premuto il tasto invio, vi verrà richiesto di specificare le proprietà del modello di negozio. Puoi pensare a questo come alle var che definisci su una classe in PHP.

Enter an empty property name when done. Property name:

Le proprietà che vogliamo aggiungere sono il tipo di negozio, la data di apertura, la latitudine e la longitudine.

 Property name: opendate invoke loopback:property

Una volta premuto enter, ti verrà chiesto di fornire il tipo di dati per ogni proprietà specificata. Il primo elemento sarà opendate e vogliamo selezionare che sia di tipo data. Selezionate date e premete il tasto invio.

 Property type: string number boolean object array❯ date buffer geopoint (other)

Poi vi verrà chiesto se volete questa proprietà come obbligatoria per la validazione dello schema. Inseriamo “sì”.

 Required? (y/N) : y

Vi verrà poi chiesto il tipo di dati per ogni proprietà rimanente. Fornisci le seguenti risposte:

 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

Digita “sì” e premi il tasto invio.

Congratulazioni! Hai appena creato il tuo primo oggetto modello usando LoopBack insieme a Node.js. Per vedere cosa è stato effettivamente creato sotto le coperte, apri il file store.json che si trova nella directory root/common/models della tua applicazione. Trovate la voce stores che sarà simile alla seguente:

{ "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": }

Come potete vedere, abbiamo un modello creato e le proprietà che abbiamo definito sono assegnate al modello del negozio. Il campo public specifica che vogliamo esporre questo modello al mondo tramite un servizio web REST.

La mappatura del modello all’origine dei dati è definita nel model-config.json sotto la cartella app root/server. Il campo datasource specifica il datasource che questo modello userà per le operazioni CRUD.

"store": { "dataSource": "mymongo", "public": true }

Step 8: Testare l’API basata su REST##

Indovina cosa? Hai appena creato il tuo primo servizio web basato su REST usando Node.js. Non è stato così male, vero? Verifichiamo puntando il nostro browser all’applicazione che abbiamo appena creato. Potete farlo andando al seguente URL:

http://0.0.0.0:3000/api/stores/

Vi verrà presentata una rappresentazione JSON di tutti i negozi Walmart che abbiamo importato nel database, come mostrato nella seguente immagine:

Using the StrongLoop Explorer###

Bene, è fantastico. Abbiamo un endpoint REST che restituirà tutti i negozi di Walmart nel database, ma le cose sembrano essere ancora un po’ carenti in quanto non abbiamo un’interfaccia di gestione per lavorare con i dati o per verificare che tutte le operazioni CRUD funzionino. Fortunatamente, StrongLoop fornisce un comodo browser che vi permetterà di esplorare tutti gli endpoint che la vostra applicazione ha. Per provarlo, aprite il vostro browser e andate al seguente URL:

http://0.0.0.0:3000/explorer/

Una volta caricata la pagina Explorer, espandete l’API stores per vedere tutte le operazioni disponibili che sono permesse sull’oggetto modello. Questo è mostrato nell’immagine seguente:

Come esempio di ciò che puoi fare con Explorer, espandi l’API /stores/findOne e clicca sul link Try it out! che interrogherà il database e restituirà un record come mostrato nell’immagine seguente:

Passiamo oltre aggiungendo una rappresentazione cartografica##

Fantastico, abbiamo creato un endpoint basato su REST che restituirà una lista di tutti i negozi Walmart nel nostro database. Per illustrare ulteriormente la velocità con cui si possono sviluppare applicazioni complete con StrongLoop, costruiamo un front-end reattivo che contiene una mappa con i pin per ogni negozio Walmart.

Passo 1: Creare la directory pubblica###

Di default, come specificato nel file app.js del progetto, qualsiasi file nella directory pubblica situata nella directory principale delle applicazioni sarà servito al richiedente. Tuttavia, questa directory potrebbe non esistere per impostazione predefinita, quindi abbiamo bisogno di crearla. Aprite il vostro terminale e passate alla directory principale della vostra applicazione ed eseguite il seguente comando:

$ mkdir public

Passo 2: Creare la mappa reattiva###

La prossima cosa che dobbiamo fare è creare una bella rappresentazione dei dati. Dal momento che abbiamo la latitudine e la longitudine di ogni negozio, sarebbe bello esprimere questo contenuto con una mappa che l’utente può trascinare, ingrandire e ridurre, ecc. Questo compito è in realtà molto più facile di quanto ci si possa aspettare se sfruttiamo alcune librerie esistenti. Alla fine della creazione di questa vista reattiva, il risultato sarà come il seguente:

Inoltre, l’utente sarà in grado di zoomare su un livello molto dettagliato della mappa per visualizzare il Walmart più vicino come mostrato nell’immagine seguente:

Il codice per la vista web dell’applicazione sfrutta le proprietà di longitudine e latitudine che abbiamo definito sul nostro oggetto modello e importato nel database. Useremo anche la popolare libreria Leaflet per creare la mappa e posizionare i pin, o marcatori, sulla mappa.

Per creare questa mappa, create un nuovo file nella directory pubblica chiamato locatewalmart.html e aggiungete il seguente codice JavaScript:

<!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 &copy; <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>

Come potete vedere, il codice è solo HTML e JavaScript standard. La parte interessante è la funzione getPins(e) dove facciamo una chiamata REST all’API che abbiamo creato precedentemente in questo post. Poi iteriamo su ogni negozio e creiamo un pin dato la latitudine e la longitudine di ogni negozio. Piuttosto ingegnoso, eh?

Conclusione##

In questo post del blog vi ho mostrato come creare un servizio web basato su REST che restituisce un elenco di negozi Walmart negli Stati Uniti. Dopo aver creato il servizio web usando Loopback, abbiamo aggiunto una rappresentazione front end dei dati. Con pochissimo lavoro, siamo stati in grado di sviluppare un’applicazione completamente funzionante molto più velocemente di quanto si potrebbe fare con il loro attuale linguaggio di scelta. Abbiamo anche discusso alcune delle somiglianze tra Node.js e PHP. Anche se considero ancora PHP un grande linguaggio, personalmente ho scoperto che Node.js è un ottimo linguaggio successivo da imparare dato il ricco ecosistema di librerie e la velocità con cui sono in grado di creare applicazioni.

Ho incluso una tabella veloce a cui puoi fare riferimento quando confronti Node.js con PHP.

Caratteristica

PHP

Node.js

Grande IDE

Sì, scelta multipla con IntelliJ, Zend Studio, Netbeans, ecc

Sì, scelta multipla con Eclipse, Visual Studio, Codenvy, ecc

Gestione delle dipendenze

Composer, PEAR

NPM

Enterprise Ready

Grande ecosistema di librerie

Sì, ma a volte difficile da trovare

Framework comuni

CodeIgniter, CakePHP, Laravel, ecc

Express, Meteor, ecc

Supporto database

Non-IO non bloccante

No

Test frameworks

Applicazioni in tempo realeapplicazioni in tempo reale

Sì, con processi aggiuntivi come Apache WebSocket ecc.

Costruito nel server web

No, la maggior parte delle persone usa insieme ad Apache

  • Pronto per sviluppare API in Node.js e a collegarle ai vostri dati? Controlla il framework Node.js LoopBack. Abbiamo reso facile iniziare sia localmente che sul tuo cloud preferito, con una semplice installazione npm.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.