Tecnologias usadas: Laravel 11, Laravel Echo Server, Redis, Socket.IO, Laravel Echo (frontend)
📦 1. Requisitos
Antes de começar, certifique-se de que você tem:
Laravel instalado (ex: laravel new websockets-demo)
Node.js e npm instalados
Redis instalado e em execução (local ou Docker)
PHP + Extensão phpredis ou predis configurado no Laravel
⚙️ 2. Instalando dependências
Laravel (backend)
1.Instale o Laravel Echo Server globalmente:
npm install -g laravel-echo-server
2.Instale Redis e os pacotes para broadcasting:
composer require predis/predis
3.Configure o .env
do Laravel para usar Redis:
BROADCAST_DRIVER=redis
CACHE_DRIVER=redis
QUEUE_CONNECTION=sync
SESSION_DRIVER=redis
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
REDIS_PREFIX=''
🐳 3. Instalando o Redis com Docker
Se você não quiser instalar o Redis diretamente na sua máquina, pode rodá-lo com Docker facilmente:
1. Suba o Redis com um comando:
docker run -d --name redis \
-p 6379:6379 \
redis:alpine
- Baixar a imagem
redis:alpine
(mais leve) - Rodar o Redis em background (
-d
) - Disponibilizar na porta padrão
6379
2. Teste se o Redis está rodando:
docker exec -it redis redis-cli ping
> PONG
🛠 4. Configurando Laravel Echo Server
No terminal, rode:
laravel-echo-server init
Preencha conforme abaixo:
appId: yourAppId
key: yourAppKey
host: localhost
port: 6001
redis: yes
auth endpoint: /broadcasting/auth
Você verá o arquivo laravel-echo-server.json
com algo assim:
{
"authHost": "http://127.0.0.1",
"authEndpoint": "/broadcasting/auth",
"clients": [
{
"appId": "f69ac286d57300e7",
"key": "530b4d1ae1b137acd2ffaff8b3171bc7"
}
],
"database": "redis",
"databaseConfig": {
"redis": {
"port": "6379",
"host": "127.0.0.1",
"keyPrefix": ""
},
"sqlite": {
"databasePath": "/database/laravel-echo-server.sqlite"
}
},
"devMode": true,
"host": null,
"port": "6001",
"protocol": "http",
"socketio": {},
"secureOptions": 67108864,
"sslCertPath": "",
"sslKeyPath": "",
"sslCertChainPath": "",
"sslPassphrase": "",
"subscribers": {
"http": true,
"redis": true
},
"apiOriginAllow": {
"allowCors": false,
"allowOrigin": "",
"allowMethods": "",
"allowHeaders": ""
}
}
🔐 5. Habilitando autenticação de canais privados
Em routes/channels.php
, adicione a rota para o channel
:
//estamos criando um canal 'notification'
Broadcast::channel('notification.{id}', function ($user, $id) {
return true;//(int) $user->id=== (int) $id;
});
🧠 6. Criando um evento para transmissão
Para transmitir as mensagens para o serviço de websocket, criamos um novo contrato Illuminate\Contracts\Broadcasting\ShouldBroadcast
.
- Criando o Event
php artisan make:event PrivateDispatchMessage
- Abra o arquivo
app/Events/PrivateDispatchMessage.php
e altere para:
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Queue\SerializesModels;
use App\Models\User;
class PrivateDispatchMessage implements ShouldBroadcast
{
use InteractsWithSockets, SerializesModels;
public $message;
public $user;
public function __construct(User $user, string $message)
{
$this->message = $message;
$this->user = $use;
}
public function broadcastOn(): PrivateChannel
{
//rota criada anteriormente
return new PrivateChannel('notification.' . $this->user->id);
}
public function broadcastAs():string
{
return 'notification.private';
}
public function broadcastWith():string
{
return $this->data;
}
}
🖥 6. Configurando o Frontend
- Instale os pacotes necessários:
npm install --save laravel-echo socket.io-client
- Configurar o
Echo
para ouvir o websocket
- No arquivo
resources/js/bootstrap.js
, adicione o seguinte conteúdo
import Echo from 'laravel-echo';
window.io = require('socket.io-client');
window.Echo = new Echo({
broadcaster: 'socket.io',
host: window.location.hostname + ':6001',
});
Esse script deve ser global e estar disponível em toda aplicação
mix('/js/app.js')
.
▶️ 7. Rodando tudo
- Inicie o servidor php
php artisan serve
- Inicie o echo-server em um prompt novo
laravel-echo-server start
Crie um arquivo notification.blade.php
e adicione o script no conteúdo
Notificações em Tempo Real
Notificações em tempo real
Aguardando notificações via WebSocket...
const USER_ID = {{ auth()->id() ?? 1 }};
if (USER_ID) {
window.Echo.private(`notification.${USER_ID}`)
.listen('.notification.private', (data) => {
const message = data?.message || "Tarefa processada com sucesso!";
}
});
}
Enter fullscreen mode
Exit fullscreen mode
Testando
Crie uma rota que chame o arquivo notification.blade.php, acesse pelo http://localhost:8000/listern-notificationDispare um evento manualmente com Tinker:
php artisan tinker
event(new \App\Events\PrivateDispatchMessage (App\Models\User::find(1), 'Olá mundo via WebSocket!'));
Enter fullscreen mode
Exit fullscreen mode
Note que precisamos de um usuário App\Models\User::find(1) para o evento.
✅ Conclusão
E pronto! Agora você tem WebSocket em tempo real funcionando com Laravel, Echo Server e Socket.IO. Esse setup é poderoso para:ChatsNotificações em tempo realDashboards interativosSistemas colaborativosSe curtiu o conteúdo, deixe um ❤️ ou salve este post. Comentários e dúvidas são super bem-vindos!