Seleccionar página

Fuente:

Laravel & Socket.io

En este post, vamos a hacer un ejemplo de cómo usar notificaciones en tiempo real emitidos desde Laravel a un cliente con Angular.

El flujo de información es tal como sigue: en Laravel tenemos un formulario para enviar un mensaje a una ruta de Laravel que disparará un evento. El manejador de ese evento (listener) recogerá el mensaje y lo enviará a Redis por un canal que nombraremos nosotros. Redis enviará el mensaje por otro canal que el servidor Node estará escuchando. Node emite un evento por un socket que será escuchado por Socket.io desde el cliente Angular. Por último, el cliente Angular creará una notificación en cuanto le llegue el mensaje desde el socket.

En primer lugar, debemos tener instalado en nuestro PC lo siguiente:

Un vez descargados e instalados los programas necesarios, instalaremos de forma global con composer el instalador para proyectos nuevos en Laravel con el comando:

Ahora, crearemos en nuestro servidor local, en mi caso Xampp, una carpeta con un proyecto nuevo de laravel. Para ello, navegamos al directorio «C:\xampp\htdocs» y con el atajo de teclado SHIFT+CLICK DERECHO del ratón , abrimos un Terminal y ejecutamos el comando:

Siendo «larachat» el nombre de nuestro proyecto Laravel desde el cual empezaremos a trabajar en este tutorial.

A continuación, estos son los pasos divido en 3 partes:

  • Parte Laravel:
    • Instalar el paquete Redis.
    • Configurar Laravel para gestionar la emisión de mensajes (broadcasting) por Redis.
    • Crear rutas para mostrar formulario y gestión del mensaje.
    • Crear controlador que gestione los mensajes.
    • Crear evento y su manejador (event and listener).
    • Crear la vista para el envio del mensaje.
    • Crear script con jquery para el envio del mensaje por AJAX e incrustarlo en la vista de envio del mensaje.
  • Parte Node:
    • Crear un package.json con las dependencias necesarias.
    • Crear un servidor con Node que usará Redis, Socket.io y Express principalmente.
  • Parte Angular:
    • Crear un bower.json con las dependencias.
    • Crear las rutas del chat.
    • Crear las vistas del chat.
    • Crear el controlador de los mensajes recibidos por socket.

Parte Laravel


Instalamos el paquete de Redis para Laravel:

Para evitar conflicto con Redis en el entorno PHP, renombramos el Facade «Redis» de Laravel a «LRedis» , tal que:

Editamos el archivo «.env» para que use el driver Redis:

Configuramos las rutas:

Turno del controlador:

Abrimos y editamos:

Creamos el evento y su manejador:

Abrimos y editamos el evento:

Abrimos y editamos el manejador del evento:

Creamos la vista de formulario para el envio de mensaje:

writemessage.blade.php

Parte NODE


En la raiz de nuestro proyecto Laravel, creamos un diretorio «node» y dentro creamos un archivo con las dependencias necesarias de nuestro servidor Node ejecutando el comando «npm init»:

Instalamos las depencias con el comando «npm install» que creará la carpeta «node_modules» con las dependencias que necesitamos.

Para tener centralizadas las constantes de nuestra aplicación en general, añadiremos esta constante de Node.js al archivo de variables de entorno de Laravel:

Turno de crear el servidor Node.js:

Parte Angular


Creamos un directorio en «C:\xampp\htdocs» que llamaremos «angular»

Instalamos los siguientes paquetes de Node – Yeoman, Bower, Grunt  y Angular Generator – de forma global:

Apartir de aquí, desarollaremos nuestra aplicacion Angular generando los archivos a base de comandos tal y como hacemos con Laravel.

Creamos la app de angular:

Descargamos los módulos que necesitamos:

Creamos las rutas:

Creamos el servicio Socket para usarlo en cualquier controlador donde lo inyectemos:

Abrimos y editamos:

Creamos el controlador para recibir las notificaciones:

Abrimos y editamos:

Creamos una vista básica y simple para ver las notificaciones:

Abrimos y editamos la vista index.html añadiéndole al final el script de socket.io:

Por último, vamos a probar el funcionamiento, para ello hay que abrir:

  • Un Terminal para Redis, como está instalado de forma global en el SO, ejecutamos «redis-cli monitor».
  • Un Terminal para Node, desde la carpeta «node» ejecutamos «npm start».
  • Un Terminal para la app de Angular, desde la carpeta «angular» ejecutamos «grunt serve» que abrirá el navegador, clicamos sobre la opción «Notificaciones».
  • Una pestaña del navegador y vamos a esta URL: http://localhost/writemessage.

Si todo va bien, al escribir un mensaje en la pestaña donde se ejecuta «writemessage» y pulsando enviar, veremos cómo y qué recibe Redis y luego qué recibe Node en los Terminales.

Si después de enviar el mensaje, pulsamos sobre la pestaña de la app Angular, veremos que salta la notificación HTML5.

Esto es todo por este tutorial, espero que te haya gustado!