Do not speak Portuguese? Translate this site with Google or Bing Translator
Integrar Laravel NodeJS Express Socket IO

Posted on: April 22, 2022 06:04 PM

Posted by: Renato

Categories: Laravel nodejs developer

Views: 122

Como integrar Laravel, NodeJS + Express + Socket.IO


Comunicação em tempo real


Eu já tinha em mente que teria que usar o NodeJS com o Express, porém queria um exemplo sem Redis-Server.

## Enough, show me the code!


Para que você possa entender o processo vou deixar abaixo um fluxograma com a regra do negócio.

Basicamente é isso. Por que usar eventos no Laravel? Por pelo menos dois motivos:

- “Desafoga” o controller. Não precisamos fazer tudo na função no controller. Cria um evento e executa o que precisa nele.
- O projeto fica mais organizado, limpo, legível e de fácil manutenção.

Vou partir da premissa que você já tem o Laravel instalado e o Node instalado e configurado no seu sistema operacional. A partir disso vamos instalar e configurar o servidor NodeJS com o Socket.IO.
No exemplo abaixo estarei utilizando a versão 7.* do Laravel, mas se quiser usar outra não tem problema, desde que você saiba utilizar os recursos de cada versão.

## Servidor NodeJS

1 - Crie uma pasta, pode ser irmã do seu projeto Laravel. Depois entre nela.

$ mkdir server-laravel-nodejs
$ cd server-laravel-nodejs
2 - Instale as dependências.

$ npm install express socketio
3 - Crie um arquivo chamado app.js e digite o seguinte código abaixo.

4 - Para testar o servidor NodeJS no terminal execute o comando abaixo e verifique a saída do comando.

$ node app.js
// Output: Servidor Rodando na Porta 8888
5. Para testar no navegador, acesse http://localhost:8888. Verifique a resposta no navegador.

Feito isso, seu servidor NodeJS está funcionando com sucesso. Mas ainda falta a página do cliente, do usuário que irá receber a resposta do servidor NodeJS.

## Laravel — Página do Cliente


Vamos fazer algo idêntico a uma função Facebook. Vamos criar uma publicação fixa na página e dar um like. O cliente que estará usando outra instância do navegador receberá uma notificação em tempo real de que alguém curtiu sua publicação.
Muitos criariam um chat de exemplo, eu não.

O diferencial é que dentro dessa página tem o código abaixo fazendo conexão com o servidor NodeJS na porta 8888.

 





Estou usando jQuery para facilitar a programação e estou importando o jQuery e o Socket.IO para cliente como CDN. Mas você pode fazer como quiser, funcionará da mesma forma, desde que você se conecte no endereço correto do servidor.

Também estou colocando na página um CSS e um JS do Toast jQuery para alertas customizados.
Acesse o site na rota de sua preferência na qual criou essa view e veja no terminal que o NodeJS irá mostrar uma mensagem confirmando que tem alguém conectado. "It’s is Socket.IO!"

Estou enviando uma requisição para o Laravel quando clico no botão CURTIR com um valor chamado name que estou pegando o valor do atributo data-name.

CURTIR


## Events


Para criar um evento execute o comando do artisan na raiz do projeto Laravel. Um arquivo será criado dentro da pasta app/Events/LikeEvent.php.

$ php artisan make:event LikeEvent


Criamos o evento, mas isso não basta. É preciso registrar no arquivo EventServiceProvider.php o evento e qual o arquivo que será executado quando o evento for escutado. Registre o evento no array $listen e no valor dele que é do tipo array já defina qual arquivo que será responsável por executar a função de quando esse evento for escutado. O arquivo será criado abaixo.

protected $listen = [
   'App\Events\LikeEvent' => [
        'App\Listeners\LikeListener', // Esse arquivo será criado abaixo
   ],
];

Depois disso crie o arquivo que será responsável por executar a função quando escutar o evento. Para isso execute o comando abaixo. O arquivo será criado em app/Listeners/LikeListener.php.

$ php artisan make:listener LikeListener


Dentro do arquivo tem o código abaixo. A função handler() já vai estar declarada dentro do arquivo, então é só completá-la. Esse parte do código que vai executar alguma coisa quando o evento for disparado e escutado. E é nesse código que faço conexão com o servidor NodeJS.

Perceba que tem a URL do servidor e é feita uma requisição via CURL no NodeJS. Concatenado a URL tem um endpoint que é a rota que será acessada no Express.

public function handle($event)
{
    $urlSite        = 'http://localhost:8888/';
    $urlWebSocket   = $urlSite.'/'.$event->endpoint;
    $dataParams     = http_build_query($event->params);
    $ch             = curl_init();
    try{
        curl_setopt($ch, CURLOPT_URL, $urlWebSocket);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, TRUE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, FALSE);
        curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
        curl_setopt($ch, CURLOPT_POSTFIELDS, $dataParams);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded'));
        $response   = curl_exec($ch);
        $codeHttp   = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        if($codeHttp != 200){
            return $response;
        }
        else{
            return false;
        }       
    }
    catch(Exception $e){
        return $e;
    }
}


## Controller


Criei um controller chamado FrontendController. O código em si apenas chamará um evento (do Laravel para o NodeJS) que será escutado e executado pelo Laravel, enviando uma requisição para o Express no NodeJS que disparará um evento (do NodeJS para os Clientes) para todos os clientes conectados no servidor.
Dentro do arquivo criei uma função simples. No topo do arquivo não esqueça de fazer o use. E não esqueça de criar a rota para essa função.

Route::post('like', '[email protected]');


## Veja a função abaixo.

use App\Events\LikeEvent;
public function like(Request $request){
   $params = [
       'name'      => $request->get('name'),
       'message'   => $request->get('name'). ' curtiu sua publicação',
       'id'        => $request->get('id')
    ];
   // FIRE EVENT
   event(new LikeEvent($params, 'like'));
}


Então, quando eu clicar no botão CURTIR a função acima será executada que disparará um evento. O evento será escutado pelos listeners que executará uma função que enviará uma requisição via CURL para o Express do NodeJS.
Respira um pouco!
3… 2… 1… ! E o Express disparará um evento para os clientes conectados e aí você poderá fazer alguma graça. Nesse caso coloquei um popup para notificar o usuário.

Resultado.

## Conclusão


Foi isso o que eu consegui sem o Redis. Eu gostei bastante do resultado.
É verdade, são dois servidores (PHP e NodeJS), mas foi a única forma no momento que eu achei para integrar essas tecnologias. Mas para facilitar eu sempre coloco a regra do negócio no PHP. O NodeJS é apenas utilizado para emitir eventos para os clientes.
Espero que gostem desse artigo e seja útil para a comunidade.
E se houver dúvidas responderei o mais rápido possível.

Segue link do projeto no GitLab: Repositório do Projeto.

 

 

Fontes: Diego Alves

 

- https://medium.com/rocketseat/como-integrar-laravel-nodejs-socket-io-2b06a069b8e3


4

Share
About Author

Renato

Developer

Add a Comment
Comments 0 Comments

No comments yet! Be the first to comment

Blog Search


Categories

OUTROS (11) Variados (108) PHP (98) Laravel (105) Black Hat (3) front-end (23) linux (75) postgresql (30) Docker (9) rest (4) soap (1) webservice (3) October (1) CMS (2) node (6) backend (10) ubuntu (36) devops (14) nodejs (4) npm (1) nvm (0) git (2) firefox (1) react (6) reactnative (5) collections (0) javascript (3) reactjs (7) yarn (0) adb (1) solid (0) blade (2) models (1) controllers (0) log (0) html (2) hardware (2) aws (14) Transcribe (1) transcription (1) google (3) ibm (1) nuance (1) PHP Swoole (4) mysql (22) macox (2) flutter (1) symfony (1) cor (1) colors (2) homeOffice (2) jobs (1) imagick (2) ec2 (1) sw (1) websocket (1) markdown (1) ckeditor (1) tecnologia (12) faceapp (1) eloquent (10) query (2) sql (32) ddd (2) nginx (5) apache (4) certbot (1) lets-encrypt (2) debian (9) liquid (1) magento (1) ruby (1) LETSENCRYPT (1) Fibonacci (1) wine (1) transaction (1) pendrive (1) boot (1) usb (1) prf (1) policia (1) federal (1) lucena (1) mongodb (4) paypal (1) payment (1) zend (1) vim (1) ciencia (6) js (1) nosql (1) java (1) JasperReports (1) phpjasper (1) covid19 (1) saude (1) athena (1) cinnamon (1) phpunit (1) binaural (1) mysqli (3) database (28) windows (1) vala (1) json (2) oracle (1) mariadb (2) dev (12) webdev (21) s3 (4) storage (1) kitematic (1) gnome (2) web (1) intel (1) piada (1) cron (2) dba (9) lumen (1) ffmpeg (1) android (2) aplicativo (1) fedora (2) shell (2) bash (2) script (2) lider (1) htm (1) csv (1) dropbox (1) db (2) combustivel (2) haru (1) presenter (1) gasolina (1) MeioAmbiente (1) Grunt (0) biologia (1) programming (19) performance (1) brain (1) smartphones (1) telefonia (1) privacidade (1) opensource (1) microg (1) iode (1) ssh (1) zsh (1) terminal (1) dracula (1) spaceship (1) mac (1) idiomas (1) laptop (1) developer (16) api (1) data (1) matematica (1) seguranca (1) 100DaysOfCode (5) hotfix (1) documentation (1) laravel (1) RabbitMQ (1) Elasticsearch (1) redis (1) Raspberry (2) Padrao de design (2) JQuery (0) AngularJS (0) Dicas (3) kubenetes (0) vscode (1)

New Articles



Get Latest Updates by Email