Chat: Controladores


1Controlador Message

Esse controlador é chamado via AJAX. Ele recebe dois parâmetros POST:

  • from: o nome de quem envia a mensagem.
  • text: o texto da mensagem.

Os dados recebidos são enviados ao socket ZeroMQ PUSH (que está conectado ao broker). O valor que ele retorna ao navegador é sempre true, serializado em JSON.

Aqui está o conteúdo do arquivo controller/Message.php:

<?php

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

/** Controlador Message. */
#[TµView('~Json')]
class Message extends \Temma\Web\Controller {
    /** Ação que recebe as novas mensagens. */
    public function broadcast() {
        // definição do valor de retorno
        $this['json'] = true;
        // recuperação dos parâmetros POST
        $from = $_POST['from'] ?? null;
        $text = $_POST['text'] ?? null;
        // verificação dos dados
        if (!trim($from) || !trim($text))
            return;
        // envio dos dados para o broker
        $this->zmq_client_push[''] = [
            'from' => $from,
            'text' => $text,
        ];
    }
}
  • Linha 3: é definido um alias para o atributo usado para definir a visão a ser usada por um controlador ou uma ação.
  • Linha 6: uso do atributo para definir que o controlador Message sempre usa a visão Json.
  • Linha 7: criação do controlador Message, que é um controlador clássico (herda de \Temma\Web\Controller).
  • Linha 9: definição da ação broadcast().
  • Linha 11: define que a ação sempre retornará o valor booleano true.
  • Linhas 13 e 14: recuperação dos dados POST.
  • Linhas 16 e 17: verificação de que os dados recebidos não estão vazios (depois de remover os espaços do início e do fim).
  • Linhas 19 a 22: os dados são enviados ao socket ZeroMQ PUSH.

2Controlador Event

O navegador estabelece uma conexão com esse controlador, que abre uma conexão SSE. Essas conexões são um pouco particulares, pois permanecem abertas para que o servidor possa enviar eventos ao navegador sempre que quiser. Se a conexão for interrompida, o navegador a reabrirá automaticamente.

O controlador Event abre um socket ZeroMQ SUB, que está conectado ao socket PUB do broker. Uma conexão PUB-SUB faz com que, toda vez que o broker enviar dados, todos os controladores Event em execução os recebam.

O controlador, portanto, é executado indefinidamente, em leitura bloqueante no seu socket. Quando recebe dados, ele simplesmente os envia ao navegador via SSE.

Aqui está o conteúdo do arquivo controller/Event.php:

<?php

/** Controlador Event. */
class Event extends \Temma\Web\EventController {
    /** Ação que envia as notificações SSE. */
    public function fetch() {
        // laço infinito
        while (true) {
            // leitura de uma mensagem enviada pelo broker
            $message = $this->zmq_client_sub[''];
            // envio da mensagem ao cliente no canal "msg"
            $this['msg'] = $message;
        }
    }
}
  • Linha 4: criação do controlador Event, que é um controlador de eventos (herda de \Temma\Web\EventController).
  • Linha 6: criação da ação fetch().
  • Linhas 8 a 13: laço infinito, para que o processamento continue enquanto o navegador mantiver a conexão aberta.
  • Linha 10: leitura (bloqueante) no socket ZeroMQ SUB.
  • Linha 12: a mensagem recebida no socket SUB é enviada ao navegador por SSE no canal "msg" (que é o canal ao qual o navegador está inscrito; veja o código Javascript).