Você é um desenvolvedor PHP. Eu entendi. Eu também sou. Minha jornada para o PHP não tomou o caminho normal que a maioria dos desenvolvedores de PHP percorrem em sua busca pela linguagem de programação perfeita. Eu comecei inicialmente como desenvolvedor Java e passei cerca de 10 anos vivendo naquela terra. Eu era um daqueles desenvolvedores Java que quando o PHP era introduzido em uma conversa, eu começava a dizer coisas como empresa, escalabilidade e outros disparates.

Comecei a trabalhar em um projeto open source que precisava de um front-end web social há cerca de 5 anos e a equipe precisava escolher uma linguagem de programação para o site. Eu explorei Java e a maioria das outras linguagens mas me instalei no PHP por uma série de razões. Foi difícil engolir meu orgulho e começar a codificar em PHP, mas o que aconteceu durante esse projeto foi nada menos que um milagre. Eu me apaixonei pela linguagem e comecei a usá-la em tantos projetos que pude encontrar enquanto deixava minhas raízes Java no pó. O PHP tem me servido bem nos últimos 5 anos, mas eu ainda estava procurando por aquele santo graal de uma linguagem de programação que é rápida de desenvolver, tem suporte empresarial, é performante e escalável e ao mesmo tempo fornece uma forte comunidade de desenvolvedores. Eu acredito que o Node.js satisfaz todos os meus requisitos enquanto ainda é uma linguagem em rápido crescimento e evolução.

A primeira coisa que você precisa entender é que o Node.js não é apenas para os desenvolvedores hipster ou para os primeiros usuários. Ele está em uso por alguns dos sites mais traficados da Internet hoje em dia e continua a conquistar os corações e a mente dos desenvolvedores. Ele está realmente num ponto em que você pode confiar nele mesmo para o mais complicado dos sistemas.

Node.js é JavaScript###

Se você está pensando que precisa aprender uma linguagem totalmente nova para ser produtivo com o Node.js, você provavelmente está errado. A maioria dos desenvolvedores já estão familiarizados com JavaScript e essa é a linguagem e semântica com a qual você estará trabalhando ao codificar no Node.js. Na verdade, um artigo recente publicado pela Red Monk que tenta dar sentido aos projetos github para determinar as linguagens mais populares tem o JavaScript como o Rei. As três principais linguagens são as seguintes:

  • JavaScript
  • Java
  • PHP

Dada a popularidade do JavaScript e sua adoção difundida em nossa indústria, se você ainda não está familiarizado com ele, provavelmente é hora de se afivelar e começar a aprendê-lo.

Se o Node.js apenas usa JavaScript, o que é exactamente? ###

Em resumo, Node.js é uma plataforma para actividades do lado do servidor. Ele usa a linguagem de programação Javascript e tem uma infinidade de bibliotecas disponíveis como módulos npm. Você pode pensar nesses módulos npm como dependências de bibliotecas que podem ser satisfeitas com o Composer se você estiver vindo do terreno do PHP. Na verdade, o sistema de gerenciamento de dependências padrão para PHP (Composer) foi inspirado no Node.js, de acordo com o site oficial. As chances são, se você precisa de um pouco de funcionalidade e não gosta de escrever todo o código você mesmo, há um módulo npm disponível que já fornece as funcionalidades que você está procurando.

Aplicações de nó são normalmente implementadas quando você precisa maximizar a eficiência utilizando I/O não-bloqueio e eventos assíncronos. Uma coisa que os desenvolvedores de PHP devem saber é que as aplicações Node.js rodam em uma única thread. No entanto, o código backend Node.js usa múltiplos threads para operações como rede e acesso a arquivos. Dado isso, Node é perfeito para aplicações onde uma experiência quase em tempo real é desejada.

Começando com um projeto de amostra###

Para o restante deste post no blog, vou mostrar como se atualizar com Node.js vindo de um background PHP. A aplicação de exemplo que vamos escrever é um serviço de backend simples que vai fornecer a localização de cada loja Walmart. Eu escolhi o Walmart para este exemplo porque muito simplesmente, é o Santo Graal de todas as lojas de departamento. Se o Walmart não o tem, você não precisa dele.

Ao final deste post no blog, você verá como é rápido e fácil criar uma API baseada em REST usando Node.js que é alimentada pelo popular banco de dados MongoDB. Eu escolhi este exemplo baseado em REST porque criar uma API backend tornou-se rapidamente um caso de uso comum na maioria das aplicações modernas.

Eu tinha originalmente planejado criar a mesma aplicação tanto em PHP quanto em Node.js para ajudar a facilitar a transição para você, mas para cobrir todos os diferentes frameworks e formas de criar serviços baseados em REST em PHP, isso garantiria um livro inteiro e simplesmente não pode ser coberto em um único post do blog. Eu então pensei em usar apenas a estrutura Laravel, pois ela continua a crescer em popularidade. No entanto, eu ainda alcançaria apenas um quarto dos desenvolvedores de PHP. Pessoalmente, meu framework favorito é o CodeIgniter, mas ele está rapidamente perdendo terreno e agora representa apenas menos de 8% da população de desenvolvedores de PHP. Sitepoint publicou recentemente um artigo discutindo isso mesmo e fornece o seguinte gráfico que mostra as frameworks que mais prometem para 2014.

Dadas as vastas diferenças em como configurar conexões de banco de dados e criar serviços REST para cada framework, eu vou assumir que você sabe como fazer isso para a sua framework em PHP e, em vez disso, vai focar apenas no Nodo.js code.

Criando a nossa aplicação Node.js##

Para o resto deste post, vamos criar a aplicação de localização Walmart usando o framework LoopBack API do StrongLoop. Como um bônus adicional, vou guiá-lo através da instalação do Node.js no OSX. Então pegue sua xícara de café, sente-se, relaxe, e vamos ao trabalho.

Passo 1: Instalando Node.js###

A maneira mais fácil de instalar o Node.js é através de um dos pacotes binários disponíveis para a maioria dos sistemas operacionais. Aponte seu navegador para a seguinte URL e baixe a correta para seu sistema operacional:

http://nodejs.org/download/

Após esta página carregar, você deve ver o seguinte:

Se você estiver usando Mac OSX, clique no arquivo universal .pkg. Isto salvará o programa de instalação em seu computador local. Uma vez que o arquivo tenha sido baixado, inicie o programa de instalação clicando duas vezes no arquivo .pkg que foi baixado e você será apresentado o diálogo de instalação:

Completar o processo de instalação usando todos os padrões e finalmente clique no botão fechar para sair do programa uma vez que a instalação tenha sido bem sucedida. Muito fácil, huh?

Passo 2: Instalando o LoopBack com NPM

Agora temos o Node.js instalado em nosso sistema local, queremos instalar os pacotes LoopBack que é fornecido pelo StrongLoop. LoopBack é um framework API de código aberto que fornece funcionalidades que irão facilitar a sua vida enquanto você começa a aprender como escrever e implementar software escrito em Node.js.

Para instalar o LoopBack, nós estaremos usando o comando npm que faz parte do núcleo da distribuição Node.js. O NPM é o gerenciador de pacotes oficial para instalar bibliotecas ou módulos dos quais suas aplicações dependem. Dado que este post é escrito para desenvolvedores PHP, uma maneira fácil de pensar em módulos NPM é relacioná-lo com o Composer. Usando o sistema Composer dependencies, os desenvolvedores são capazes de especificar dependências em seu arquivo composer.json. Uma vez que os pacotes tenham sido definidos no arquivo composer.json, um desenvolvedor PHP simplesmente precisa emitir o comando de instalação que deve ser similar ao seguinte:

$ php composer.phar install

Módulos NPM funcionam da mesma maneira e usa o arquivo package.json para permitir que você especifique dependências para uma aplicação em particular. Você também pode instalar as dependências a partir da linha de comando para torná-las disponíveis no seu sistema local. Não se preocupe se você ainda não entendeu isso, pois iremos cobrir o arquivo package.json com mais detalhes em um passo posterior.

Para instalar o LoopBack, podemos emitir um único comando que irá baixar e instalar todas as dependências que precisamos para o pacote. Abra a janela do seu terminal e emita o seguinte comando:

$ npm install -g strongloop

Note: Poderá ter de usar o sudo dependendo da sua instalação

O que acabou de acontecer? Dissemos à npm que queremos instalar o pacote strongloop enquanto também fornecemos a opção -g. A opção -g torna o pacote disponível como um pacote global para qualquer pessoa no sistema para usar e está disponível para todas as aplicações. Uma vez executado o comando acima, o NPM irá baixar o pacote assim como quaisquer dependências que forem necessárias. Dependendo da velocidade do seu sistema, isso pode levar alguns minutos para ser concluído.

Passo 3: Criando nossa aplicação##

Criar uma aplicação usando a API LoopBack é muito fácil e direto. Basta abrir sua janela de terminal e emitir o seguinte comando para criar uma nova aplicação chamada 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

O utilitário slc irá agora criar um novo projeto baseado em LoopBack chamado locatewalmart e configurar o projeto. Quando nos é pedido o nome da aplicação, podemos manter o padrão.

What's the name of your application? locatewalmart

Após executar o comando acima, um novo diretório para o seu projeto será criado para a sua aplicação. Mude para o diretório da aplicação com o comando cd:

$ cd locatewalmart

Agora que tenhamos nossa aplicação criada, queremos adicionar suporte ao MongoDB como fonte de dados para loopback.

Passo 4: Definindo nosso DataSource###

Para nos comunicarmos com o MongoDB, precisamos adicionar uma fonte de dados à nossa aplicação. Fazemos isso executando:

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

Passo 5: Apontando para a fonte de dados real###

Para comunicar com o MongoDB, precisamos apontar a fonte de dados para a instância real do MongoDB. LoopBack define toda a configuração da fonte de dados no arquivo datasource.json que está localizado em suas aplicações root/server diretório. Abra este arquivo e adicione uma fonte de dados para o MongoDB como mostrado no seguinte código:

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

Note: Certifique-se de fornecer a URL de conexão correta para o seu banco de dados MongoDB. Para este exemplo, eu tenho um banco de dados criado localmente chamado locatewalmart que eu quero usar para minha fonte de dados.

Agora que temos nosso banco de dados definido, há um par de coisas extras que precisamos fazer. Primeiro de tudo, precisamos especificar que nossas aplicações dependem do pacote loopback-connector-mongodb. Para especificar uma dependência, você modifica o arquivo package.json que é similar a editar o arquivo composer.json em PHP. Abra o arquivo package.json que está localizado no diretório raiz da sua aplicação e adicione o arquivo loopback-connector-mongodb à seção de dependência. Depois disso você pode executar npm install.

Alternately você pode executar:

$ npm install loopback-connector-mongodb --save

Isto irá atualizar automaticamente o arquivo package.json. A seção deve parecer com o seguinte:

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

Passo 6: Importando dados para o MongoDB###

Agora temos nossa fonte de dados configurada, precisamos carregar o conjunto de dados em nosso banco de dados MongoDB.

A primeira coisa que queremos fazer é baixar um arquivo JSON que tenha todos os dados que queremos retornar. Você pode pegar isso na seguinte URL:

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

Após você ter o conjunto de dados baixado, simplesmente importe-o para sua base de dados usando o comando mongoimport como mostrado abaixo:

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

Você deve ver os seguintes resultados:

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: Criando nosso modelo de loja###

Um modelo pode ser pensado nos mesmos termos em que você pensa sobre modelos em terrenos PHP se você estiver usando um framework MVC. É uma representação de um objeto que neste caso é uma loja Walmart. LoopBack fornece uma maneira conveniente de criar objetos de modelo usando a linha de comando. Abra sua janela de terminal, vá para a pasta do projeto e emita o seguinte comando:

$ slc loopback:model

Isto iniciará uma sessão interativa onde você pode definir seu modelo. A primeira coisa que lhe será pedida é a fonte de dados com a qual você quer associar o modelo. Vamos selecionar a fonte de dados mymongo que acabamos de criar antes. Em seguida, será pedido o nome no plural do modelo. Vamos usar o padrão (stores) e pressione enter.

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

Após pressionar a tecla enter, você será solicitado a especificar as propriedades do modelo da loja. Você pode pensar nisso como var(s) que você define em uma classe em PHP.

Enter an empty property name when done. Property name:

As propriedades que queremos adicionar é o tipo de store, a data de abertura, a latitude e a longitude.

 Property name: opendate invoke loopback:property

Após pressionar enter, você será solicitado a fornecer o tipo de dados para cada propriedade especificada. O primeiro item será optendate e nós queremos selecionar que seja do tipo data. Selecione a data e pressione a tecla enter.

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

Então ser-lhe-á perguntado se quer esta propriedade como uma propriedade necessária para a validação do esquema. Entraremos com “sim”.

 Required? (y/N) : y

>

Ser-lhe-á então perguntado o tipo de dados para cada propriedade restante. Forneça as seguintes respostas:

 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

Digite “sim” e pressione a tecla enter.

Congratulações! você acabou de criar o seu primeiro objeto modelo usando LoopBack em conjunto com o Node.js. Para ver o que foi realmente criado sob as capas, abra o arquivo store.json que está localizado no diretório root/common/models do diretório de sua aplicação. Encontre a entrada das lojas que se parecerá com o seguinte:

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

Como pode ver, temos um modelo criado e as propriedades que definimos são atribuídas ao modelo da loja. O campo public especifica que queremos expor este modelo ao mundo através de um serviço web REST.

O mapeamento do modelo para a fonte de dados é definido no model-config.json sob a pasta raiz/servidor da aplicação. O campo dataource especifica a fonte de dados que este modelo usará para operações CRUD.

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

Passo 8: Teste a API baseada em REST###

Guess what? Você acabou de criar seu primeiro serviço web baseado em REST usando o Node.js. Isso não foi tão ruim, foi? Vamos conferir apontando nosso navegador para a aplicação que acabamos de criar. Você pode fazer isso indo para a seguinte URL:

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

Você será presenteado com uma representação JSON de todas as lojas do Walmart que importamos para o banco de dados como mostrado na seguinte imagem:

Usando o StrongLoop Explorer###

Bem, isso é ótimo. Temos um endpoint REST que retornará todas as lojas do Walmart no banco de dados, mas parece que ainda falta um pouco porque não temos uma interface de gerenciamento para trabalhar com os dados ou para verificar se todas as operações do CRUD estão funcionando. Felizmente, o StrongLoop fornece um navegador conveniente que lhe permitirá explorar todos os pontos finais que a sua aplicação tem. Para testar isso, abra seu navegador e vá para a seguinte URL:

http://0.0.0.0:3000/explorer/

Após a página do Explorer ter carregado, expanda a stores API para ver todas as operações disponíveis que são permitidas no objeto modelo. Isto é mostrado na seguinte imagem:

Como exemplo do que você pode fazer com o Explorer, expanda o /stores/findOne API e clique no link Try it out! que irá consultar a base de dados e retornar um registro como mostrado na imagem seguinte:

Aumentando um pouco mais as coisas adicionando uma representação do mapa##

Fantástico, temos criado um endpoint baseado em REST que retornará uma lista de todas as lojas do Walmart em nossa base de dados. Para ilustrar melhor a velocidade com que se pode desenvolver aplicações completas com o StrongLoop, vamos construir um front end que contenha um mapa com pinos para cada loja Walmart.

Passo 1: Criar o diretório público###

Por padrão, como especificado no arquivo app.js do projeto, quaisquer arquivos no diretório público localizado no diretório raiz das aplicações serão servidos ao requisitante. No entanto, este diretório pode não existir por padrão, então precisamos criá-lo. Abra seu terminal e mude para o diretório raiz da sua aplicação e emita o seguinte comando:

$ mkdir public

Passo 2: Crie o mapa de resposta###

A próxima coisa que precisamos fazer é criar uma bela representação dos dados. Como temos a latitude e longitude de cada loja, seria ótimo expressar esse conteúdo com um mapa que o usuário pode arrastar, aumentar e diminuir o zoom, etc. Estas tarefas são na verdade muito mais fáceis do que você poderia esperar se tirarmos proveito de algumas bibliotecas existentes. No final da criação desta vista reactiva, o resultado será parecido com o seguinte:

Furthermore, o utilizador será capaz de fazer zoom in a um nível muito detalhado do mapa para ver o Walmart mais próximo como mostrado na seguinte imagem:

O código para a vista web da aplicação tira partido das propriedades de longitude e latitude que definimos no nosso objecto modelo e que importamos para a base de dados. Também usaremos a popular biblioteca de Folhetos para criar o mapa e colocar os pinos, ou marcadores, no mapa.

Para criar este mapa, crie um novo arquivo no diretório público chamado locatewalmart.html e adicione o seguinte código 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>

Como você pode ver, o código é apenas HTML e JavaScript padrão. A parte interessante é a função getPins(e) onde fazemos uma chamada REST para a API que criamos anteriormente neste post do blog. Nós então iteramos sobre cada loja e criamos um pino dada a latitude e longitude de cada loja. Bastante elegante, huh?

Conclusion###

Neste post de blog eu mostrei como criar um serviço web baseado em REST que retorna uma lista de lojas Walmart nos Estados Unidos. Depois de criarmos o serviço web usando Loopback, adicionamos uma representação front end dos dados. Com muito pouco trabalho, fomos capazes de desenvolver uma aplicação totalmente funcional muito mais rápido do que se poderia ser capaz com sua linguagem atual de escolha. Também discutimos algumas das semelhanças entre o Node.js e o PHP. Embora eu ainda considere o PHP uma grande linguagem, eu pessoalmente descobri que o Node.js é uma ótima próxima linguagem a aprender, dado o rico ecossistema de bibliotecas e a velocidade com que eu sou capaz de criar aplicações.

Incluí uma tabela rápida que você pode consultar ao comparar Node.js com PHP.

Funcionalidade

PHP

Node.js

Grande IDE

Sim, escolha múltipla com IntelliJ, Zend Studio, Netbeans, etc

Sim, múltiplas escolhas incluindo Eclipse, Visual Studio, Codenvy, etc

Gestão de Dependência

Compositor, PEAR

NPM

Enterprise Ready

Sim

Sim

Grande ecossistema de bibliotecas

Sim, mas por vezes difícil de encontrar

Sim

Estruturas Comuns

CodeIgniter, CakePHP, Laravel, etc

Express, Meteor, etc

Suporte de base de dados

Sim

Sim

NãoIO de bloqueio

Não

Sim

Testes estruturas

Sim

Sim

Real-aplicações de tempo

Sim, com processos adicionais como o Apache WebSocket, etc.

Sim

Construído em servidor web

Não, a maioria das pessoas usa em conjunto com o Apache

Sim

  • Pronto para desenvolver APIs no Nó.js e conectá-los aos seus dados? Confira a estrutura Node.js LoopBack. Tornamos fácil começar localmente ou na sua nuvem favorita, com uma simples instalação npm.

Deixe uma resposta

O seu endereço de email não será publicado.