Chat: Controladores
1Controlador Message
Este controlador se llama mediante AJAX. Recibe dos parámetros POST:
- from: el nombre de quien envía el mensaje.
- text: el texto del mensaje.
Los datos recibidos se envían al socket ZeroMQ PUSH (conectado al broker). El valor que devuelve al navegador es siempre true, serializado en JSON.
Aquí está el contenido del archivo controller/Message.php:
<?php
use \Temma\Attributes\View as TµView;
/** Controlador Message. */
#[TµView('~Json')]
class Message extends \Temma\Web\Controller {
/** Acción que recibe los nuevos mensajes. */
public function broadcast() {
// define el valor de retorno
$this['json'] = true;
// recupera los parámetros POST
$from = $_POST['from'] ?? null;
$text = $_POST['text'] ?? null;
// verifica los datos
if (!trim($from) || !trim($text))
return;
// envía los datos al broker
$this->zmq_client_push[''] = [
'from' => $from,
'text' => $text,
];
}
}
- Línea 3: se define un alias para el atributo usado para definir la vista que debe usar un controlador o una acción.
- Línea 6: uso del atributo para definir que el controlador Message siempre usa la vista Json.
- Línea 7: creación del controlador Message, que es un controlador clásico (hereda de \Temma\Web\Controller).
- Línea 9: definición de la acción broadcast().
- Línea 11: define que la acción siempre devolverá el valor booleano true.
- Líneas 13 y 14: recuperación de los datos POST.
- Líneas 16 y 17: comprueba que los datos recibidos no están vacíos (tras eliminar los espacios al principio y al final).
- Líneas 19 a 22: los datos se envían al socket ZeroMQ PUSH.
2Controlador Event
El navegador establece una conexión con este controlador, que abre una conexión SSE. Estas conexiones son un poco particulares, ya que permanecen abiertas para que el servidor pueda enviar eventos al navegador cuando quiera. Si la conexión se interrumpe, el navegador la reabrirá automáticamente.
El controlador Event abre un socket ZeroMQ SUB, conectado al socket PUB del broker. Una conexión PUB-SUB hace que, cada vez que el broker envía datos, todos los controladores Event en ejecución los reciban.
Por lo tanto, el controlador se ejecuta indefinidamente, en lectura bloqueante en su socket. Cuando recibe datos, simplemente los envía al navegador vía SSE.
Aquí está el contenido del archivo controller/Event.php:
<?php
/** Controlador Event. */
class Event extends \Temma\Web\EventController {
/** Acción que envía las notificaciones SSE. */
public function fetch() {
// bucle infinito
while (true) {
// lee un mensaje enviado por el broker
$message = $this->zmq_client_sub[''];
// envía el mensaje al cliente en el canal "msg"
$this['msg'] = $message;
}
}
}
- Línea 4: creación del controlador Event, que es un controlador de eventos (hereda de \Temma\Web\EventController).
- Línea 6: creación de la acción fetch().
- Líneas 8 a 13: bucle infinito, para que el procesamiento continúe mientras el navegador mantenga la conexión abierta.
- Línea 10: lectura (bloqueante) en el socket ZeroMQ SUB.
- Línea 12: el mensaje recibido en el socket SUB se envía al navegador por SSE en el canal "msg" (que es el canal al que está suscrito el navegador; ver el código Javascript).