Chat : Contrôleurs


1Contrôleur Message

Ce contrôleur est appelé en AJAX. Il reçoit deux paramètres POST :

  • from : le nom de l’expéditeur du message.
  • text : le texte du message.

Les données reçues sont envoyées sur la socket ZeroMQ PUSH (qui est connectée au broker). La valeur qu'il retourne au navigateur est toujours le booléen true sérialisé en JSON.

Voici le contenu du fichier controller/Message.php :

<?php

use \Temma\Attributes\View as TµView;

/** Contrôleur Message. */
#[TµView('~Json')]
class Message extends \Temma\Web\Controller {
    /** Action qui reçoit les nouveaux messages. */
    public function broadcast() {
        // définition de la valeur de retour
        $this['json'] = true;
        // récupération des paramètres POST
        $from = $_POST['from'] ?? null;
        $text = $_POST['text'] ?? null;
        // vérification des données
        if (!trim($from) || !trim($text))
            return;
        // envoi des données vers le broker
        $this->zmq_client_push[''] = [
            'from' => $from,
            'text' => $text,
        ];
    }
}
  • Ligne 3 : On définit un alias pour l'attribut qui sert à définir la vue à utiliser pour un contrôleur ou une action.
  • Ligne 6 : Utilisation de l'attribut, pour définir que le contrôleur Message utilise toujours la vue Json.
  • Ligne 7 : Création du contrôleur Homepage, qui est un contrôleur classique (il hérite de \Temma\Web\Controller).
  • Ligne 9 : Définition de l'action broadcast().
  • Ligne 11 : On définit que l'action retournera toujours la valeur booléenne true.
  • Lignes 13 et 14 : Récupération des données envoyées en POST.
  • Lignes 16 et 17 : On vérifie que les données reçues ne sont pas vides (après avoir retiré leurs espaces au début et à la fin).
  • Lignes 19 à 22 : Les données sont envoyées sur la socket ZeroMQ PUSH.

2Contrôleur Event

Le navigateur établit une connexion avec ce contrôleur, qui ouvre une connexion SSE. Ces connexions sont un peu particulières, elles restent ouvertes pour que le serveur puisse envoyer des événements au navigateur quand il le souhaite. Si la connexion est coupée, le navigateur la rouvrira automatiquement.

Le contrôleur Event ouvre une socket ZeroMQ SUB, qui est connectée à la socket PUB du broker. Une connexion PUB-SUB fait qu'à chaque fois que le broker va envoyer des données, tous les contrôleur Event en cours d'exécution les recevront.

Le contrôleur tourne donc indéfiniment, en lecture bloquante sur sa socket. Quand il reçoit des données, il se contente de les envoyer par SSE au navigateur.

Voici le contenu du fichier controller/Event.php :

<?php

/** Contrôleur Event. */
class Event extends \Temma\Web\EventController {
    /** Action qui envoie les notifications SSE. */
    public function fetch() {
        // boucle infinie
        while (true) {
            // lecture d'un message envoyé par le broker
            $message = $this->zmq_client_sub[''];
            // envoi du message au client sur le canal "msg"
            $this['msg'] = $message;
        }
    }
}
  • Ligne 4 : Création du contrôleur Event, qui est un contrôleur d'événements (il hérite de \Temma\Web\EventController).
  • Ligne 6 : Création de l'action fetch().
  • Lignes 8 à 13 : Boucle infinie, pour que les traitements continuent tant que le navigateur garde la connexion ouverte.
  • Ligne 10 : Lecture (bloquante) sur la socket ZeroMQ SUB.
  • Ligne 12 : Le message reçu sur la socket SUB est envoyé au navigateur par SSE sur le canal "msg" (qui est le canal auquel le navigateur est abonné, voir le code Javascript).