Novedades en Laravel 5: Eventos

  • #laravel
  • #php

Lanza eventos desde cualquier parte de tu aplicación y capturalos mediante listeners o handlers para realizar acciones asincrónicas.

Los eventos reciben un lavado de cara en esta nueva versión de Laravel e incorporan múltiples características que serán de nuestro agrado.

Como ya hemos visto en el artículo sobre comandos, éstos son una acción imperativa. Es decir, un controlador llama a un comando y éste debe procesarse obligatoriamente.

Los eventos funcionan de forma similar salvo que de manera informativa. Es decir, un evento se dispara mediante un comando o una acción, y de nosotros depende capturar ese evento para procesarlo o no.

Generar eventos

Ahora disponemos de un nuevo comando de artisan para generar eventos. Utilizaremos php artisan make:event EventName para generar el siguiente fichero:

app/Events/EventName.php
PHP
namespace App\Events;

use App\Events\Event;
use Illuminate\Queue\SerializesModels;

class EventName extends Event
{

  use SerializesModels;

  /**
   * Create a new event instance.
   *
   * @return void
   */
  public function __construct()
  {
    //
  }
}

Generar handlers para eventos

A diferencia de los comandos, nuestro evento no posee un método handle() puesto que los eventos se crearon con la idea de ser capturados de forma independiente en cualquier parte de nuestra aplicación.

Aún así, si queremos generar un handler para capturar el evento, podemos utilizar el comando php artisan handler:event EventHandlerName. A este comando de artisan también podemos pasarle el flag --event "EventName" para indicar cual es la clase del evento que manipula el handler, y de igual manera que con los comandos, podemos agregar --queued si queremos añadir el handler a la cola de procesamiento.

A modo de referencia, el handler para eventos contiene lo siguiente:

app/Handlers/Events/EventHandlerName.php
PHP
namespace App\Handlers\Events;

use App\Events\;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldBeQueued;

class EventName
{

  /**
   * Create the event handler.
   *
   * @return void
   */
  public function __construct()
  {
    //
  }

  /**
   * Handle the event.
   *
   * @param  Events  $event
   * @return void
   */
  public function handle(Events $event)
  {
    //
  }
}

Si utilizamos --event entonces el método handle contendrá lo siguiente: public function handle(EventName $event).

Como disparar y capturar eventos

Para disparar un evento utilizaremos cualquiera de las dos formas:

PHP
Event::fire(new EventName($params));

event(new EventName($params));

Para capturar un evento hay dos maneras, bien utilizando un listener o haciendo uso de un handler de eventos.

En el primer caso, basta con utilizar lo siguiente:

PHP
Event::listen('App\Events\EventName', function($event)
{
  //
});

En el caso del handler, debemos informar a Laravel de la asociación entre el evento y su(s) handler(s). Esto se hace editando el fichero app/Providers/EventServiceProvider.php y modificando el array $listen:

app/Providers/EventServiceProvider.php
PHP
protected $listen = [
  'App\Events\EventName' => [
    'App\Handlers\Events\EventHandlerName',
    'App\Handlers\Events\EventHandlerName2',
    // ...
  ],
];

Si queremos ahorrar tiempo generando los eventos y los handlers uno a uno, basta con escribir nuestro array $listen y utilizar el comando php artisan event:generate. Todos nuestros eventos y handlers se crearán automáticamente en sus respectivos directorios.

Recuerda que hay más documentación sobre eventos y queues en el sitio oficial.

Compartir en