Laravel Events: O Guia Completo para Trabalhar com Eventos, Listeners e Filas

Laravel Events: O Guia Completo para Trabalhar com Eventos

Laravel Events permitem implementar uma arquitetura desacoplada, onde diferentes partes do sistema podem reagir a ações específicas, como o cadastro de um usuário ou a conclusão de um pedido. Com suporte nativo a listeners, filas assíncronas e até broadcast em tempo real, os eventos tornam o código mais organizado, escalável e fácil de manter.

O que são Events no Laravel?

Em aplicações modernas, eventos representam ações que acabaram de acontecer e podem ser observadas por outras partes do sistema. O Laravel oferece um sistema de eventos e listeners robusto, permitindo desacoplamento, escalabilidade e reatividade da aplicação.

Exemplo prático:

Quando um novo usuário se registra, você pode emitir um evento UserRegistered. Esse evento pode acionar múltiplos listeners, como:

  • Enviar e-mail de boas-vindas.
  • Criar um perfil padrão.
  • Notificar o administrador.

Benefícios de Usar Eventos no Laravel

  • Código mais limpo e desacoplado.
  • Fácil de manter e escalar.
  • Execução assíncrona com filas (queues).
  • Centralização da lógica de resposta a ações importantes.

Estrutura Padrão de Eventos

Os eventos e listeners ficam, por padrão, nestes diretórios:

app/
├── Events/
│   └── UserRegistered.php
├── Listeners/
│   └── SendWelcomeEmail.php

Como Criar um Evento no Laravel

Use o comando Artisan:

php artisan make:event UserRegistered

Isso criará a classe em app/Events/UserRegistered.php:

namespace App\Events;

use App\Models\User;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class UserRegistered
{
    use Dispatchable, SerializesModels;

    public function __construct(public User $user) {}
}

✅ A propriedade User $user será usada pelos listeners.


Criando um Listener

php artisan make:listener SendWelcomeEmail --event=UserRegistered
namespace App\Listeners;

use App\Events\UserRegistered;
use App\Mail\WelcomeMail;
use Illuminate\Support\Facades\Mail;

class SendWelcomeEmail
{
    public function handle(UserRegistered $event): void
    {
        Mail::to($event->user->email)->send(new WelcomeMail($event->user));
    }
}

Registrando o Evento no 

EventServiceProvider

Em app/Providers/EventServiceProvider.php:

protected $listen = [
    \App\Events\UserRegistered::class => [
        \App\Listeners\SendWelcomeEmail::class,
    ],
];

Disparando um Evento

Você pode disparar o evento em qualquer lugar da aplicação:

event(new UserRegistered($user));

Usando Eventos com Queues (Assíncronos)

Para listeners que devem ser processados em segundo plano (ex: envio de e-mail), basta implementar a interface ShouldQueue:

use Illuminate\Contracts\Queue\ShouldQueue;

class SendWelcomeEmail implements ShouldQueue
{
    public function handle(UserRegistered $event)
    {
        // Processamento assíncrono
    }
}

Importante: configure e rode a fila com:

php artisan queue:work

Event Broadcasting (Eventos em Tempo Real)

O Laravel também permite transmitir eventos em tempo real com WebSockets via Laravel Echo.

Exemplo:

php artisan make:event NewMessageSent

Na classe do evento:

use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;

class NewMessageSent implements ShouldBroadcast
{
    use InteractsWithSockets;

    public function __construct(public $message) {}

    public function broadcastOn()
    {
        return ['chat-channel'];
    }
}

Boas Práticas com Laravel Events

✅ Nomeie os eventos com verbos no passado: OrderShipped, InvoicePaid, UserBanned.

✅ Listeners devem ser focados em uma responsabilidade clara.

✅ Para tarefas demoradas, sempre utilize fila (ShouldQueue).

✅ Agrupe seus eventos por domínio para manter organização.

✅ Use eventos para integrações externas, como enviar dados para CRMs ou ERPs.


Exemplo Real: Evento para Envio de Cupom Pós-Cadastro

php artisan make:event NewClientCreated
php artisan make:listener SendDiscountCoupon --event=NewClientCreated

No Listener:

class SendDiscountCoupon implements ShouldQueue
{
    public function handle(NewClientCreated $event)
    {
        $event->client->coupons()->create([
            'code' => Str::random(10),
            'discount' => 15,
        ]);
    }
}

Quando Usar (e Não Usar) Eventos

Use eventos quando:

  • Você precisa notificar múltiplas partes do sistema sobre uma ação.
  • A tarefa pode ser desacoplada do fluxo principal.
  • Deseja escalar e distribuir melhor as responsabilidades.

Evite eventos quando:

  • A lógica depende fortemente da ordem de execução.
  • A ação precisa de uma resposta imediata no fluxo do usuário.

Conclusão

O sistema de eventos do Laravel é um dos maiores aliados de quem deseja criar sistemas desacoplados, performáticos e escaláveis.

Se usados corretamente, os eventos ajudam a manter o código limpo e pronto para crescer — seja você integrando com APIs externas, enviando e-mails, notificações, processando jobs ou trabalhando com filas.

Show 1 Comment

1 Comment

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *