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).