Qué son los eventos
El sistema de eventos de Laravel es una implementación sencilla del patrón observer. Al despachar los sucesos (eventos) que ocurren en la aplicación y definir listeners que reaccionan a ellos, se reduce al mínimo la dependencia entre componentes. Por ejemplo, al despachar el evento «pedido confirmado» pueden ejecutarse de forma independiente varios listeners: «enviar correo de confirmación», «descontar stock», «notificar a Slack», etc. El código de procesamiento del pedido no necesita saber absolutamente nada de la implementación del envío del correo ni de la notificación a Slack.Las clases de evento se ubican en
app/Events y las de listener en app/Listeners.
Si esos directorios no existen, los comandos Artisan los crean automáticamente.Generar eventos y listeners
Utiliza los comandos Artisanmake:event y make:listener para generar el esqueleto.
Registro de eventos
Descubrimiento automático de eventos
Por defecto, Laravel escanea el directorioapp/Listeners y registra los listeners automáticamente.
Deduce la asociación con el evento inspeccionando el tipo del argumento del método handle o __invoke.
bootstrap/app.php.
Registro manual
También puedes registrar los listeners manualmente en el métodoboot de AppServiceProvider con el facade Event.
Definir el evento
Las clases de evento son contenedores de datos. No contienen lógica y guardan como propiedades la información asociada al evento.SerializesModels garantiza que los modelos Eloquent se manejen correctamente cuando los listeners encolados serialicen el evento.
Despachar eventos
Despacha eventos con el método estáticodispatch o con el helper event().
Despachar tras una transacción de base de datos
Cuando quieras despachar el evento solo después de que la transacción se haya confirmado, implementa la interfazShouldDispatchAfterCommit en la clase del evento.
Si la transacción falla, el evento se descarta.
Implementar el listener
El listener recibe el evento en su métodohandle.
En el constructor, el contenedor de servicios inyecta automáticamente las dependencias.
handle devuelve false, se detiene la propagación del evento a los siguientes listeners.
Listeners encolados
Los procesos lentos, como el envío de correos o las peticiones HTTP, pueden ejecutarse de forma asíncrona con listeners encolados. Con solo implementar la interfazShouldQueue, el listener se encolará automáticamente al despachar el evento.
Antes de usar listeners encolados necesitas configurar la cola y arrancar el worker.
Consulta la página de colas y jobs para más detalles.
Personalizar conexión, nombre de cola y retraso
Con atributos PHP puedes definir la conexión, la cola y el retraso.Reintentos y timeout máximos
Con los atributos#[Tries] y #[Timeout] puedes controlar el comportamiento ante fallos.
Gestión de fallos
Si defines el métodofailed, puedes ejecutar código adicional cuando el listener agote los reintentos.
Suscriptores de eventos
Los suscriptores permiten agrupar varios handlers relacionados en una única clase.Crear un suscriptor
En el métodosubscribe devuelves un array con la asignación entre eventos y handlers.
Registrar el suscriptor
Con el descubrimiento automático activado, los suscriptores cuyosubscribe devuelve un array se registran automáticamente.
Para registrarlos manualmente utiliza Event::subscribe en el método boot de AppServiceProvider.
Ejemplo práctico: enviar un correo de bienvenida al registrarse un usuario
1
Crear la clase de evento
app/Events/UserRegistered.php para añadir una propiedad con el usuario registrado.2
Crear la clase de listener
ShouldQueue.3
Despachar el evento desde el controlador
Llama a El
UserRegistered::dispatch() después de crear el usuario.RegisterController se limita a despachar el evento UserRegistered sin saber nada del envío del correo.
Si en el futuro quisiéramos «enviar además una notificación a Slack al registrarse», no habría que tocar el controlador.4
Arrancar el worker
Arranca el worker para procesar los listeners encolados.