() translation by (you can also view the original English article)
En este artículo, vamos a explorar los conceptos básicos de la gestión de eventos en Laravel. Es una de las características importantes que usted, como desarrollador, debe tener en su arsenal en el marco deseado. A medida que avanzamos, también aprovecharemos esta oportunidad para crear un ejemplo del mundo real de un evento personalizado y un oyente, y ese es también el objetivo final de este artículo.
El concepto de eventos en Laravel se basa en un patrón de diseño de software muy popular: el patrón del observador. En este patrón, se supone que el sistema genera eventos cuando sucede algo, y usted puede definir oyentes que escuchen estos eventos y reaccionen en consecuencia. Es una característica realmente útil de una manera que le permite desacoplar componentes en un sistema que de otro modo hubiera resultado en un código estrechamente acoplado.
Por ejemplo, supongamos que desea notificar a todos los módulos en un sistema cuando alguien inicia sesión en su sitio. Por lo tanto, les permite reaccionar ante este evento de inicio de sesión, ya sea para enviar un correo electrónico o una notificación dentro de la aplicación, o para cualquier cosa que quiera reaccionar a este evento de inicio de sesión.
Conceptos básicos de eventos y oyentes
En esta sección, exploraremos la forma en que Laravel implementa eventos y oyentes en el marco central. Si está familiarizado con la arquitectura de Laravel, probablemente sepa que Laravel implementa el concepto de un proveedor de servicios que le permite inyectar diferentes servicios en una aplicación.
Del
mismo modo, Laravel proporciona una clase EventServiceProvider.php
integrada que nos permite definir asignaciones de escucha de eventos
para una aplicación.
Continúa y selecciona el archivo app/Providers/EventServiceProvider.php
1 |
<?php
|
2 |
namespace App\Providers; |
3 |
use Illuminate\Support\Facades\Event; |
4 |
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; |
5 |
class EventServiceProvider extends ServiceProvider |
6 |
{
|
7 |
/**
|
8 |
* The event listener mappings for the application.
|
9 |
*
|
10 |
* @var array
|
11 |
*/
|
12 |
protected $listen = [ |
13 |
'App\Events\SomeEvent' => [ |
14 |
'App\Listeners\EventListener', |
15 |
],
|
16 |
];
|
17 |
/**
|
18 |
* Register any events for your application.
|
19 |
*
|
20 |
* @return void
|
21 |
*/
|
22 |
public function boot() |
23 |
{
|
24 |
parent::boot(); |
25 |
//
|
26 |
}
|
27 |
}
|
Echemos un vistazo de cerca a la propiedad $ listen
, que le permite definir una matriz de eventos y oyentes asociados. Las
teclas de matriz corresponden a eventos en un sistema, y sus valores
corresponden a oyentes que se activarán cuando se genere el evento
correspondiente en un sistema.
Prefiero ir a través de un ejemplo del mundo real para demostrarlo más. Como probablemente sepa, Laravel proporciona un sistema de autenticación integrado que facilita funciones como inicio de sesión, registro y similares.
Supongamos que desea enviar la notificación por correo electrónico, como medida de seguridad, cuando alguien inicia sesión en la aplicación. Si Laravel no admitió la función de escucha de eventos, es posible que haya terminado editando la clase principal o de alguna otra manera para conectar su código que envía un correo electrónico.
De hecho, estás en el lado más afortunado ya que Laravel te ayuda a resolver este problema usando el detector de eventos. Revisemos el archivo app/Providers/EventServiceProvider.php
para que se vea como el siguiente.
1 |
<?php
|
2 |
namespace App\Providers; |
3 |
use Illuminate\Support\Facades\Event; |
4 |
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; |
5 |
class EventServiceProvider extends ServiceProvider |
6 |
{
|
7 |
/**
|
8 |
* The event listener mappings for the application.
|
9 |
*
|
10 |
* @var array
|
11 |
*/
|
12 |
protected $listen = [ |
13 |
'Illuminate\Auth\Events\Login' => [ |
14 |
'App\Listeners\SendEmailNotification', |
15 |
],
|
16 |
];
|
17 |
/**
|
18 |
* Register any events for your application.
|
19 |
*
|
20 |
* @return void
|
21 |
*/
|
22 |
public function boot() |
23 |
{
|
24 |
parent::boot(); |
25 |
//
|
26 |
}
|
27 |
}
|
Illuminate
\ Auth \ Events \ Login
es un evento que será generado por el
complemento Auth
cuando alguien inicie sesión en una aplicación. Hemos
vinculado ese evento al oyente App \ Listeners \ SendEmailNotification
,
por lo que se activará en el evento de inicio de sesión.
Por supuesto, debe definir la clase de escucha App \ Listeners \ SendEmailNotification
en primer lugar. Como siempre, Laravel le permite crear un código de plantilla de un oyente utilizando el comando artesanal.
1 |
php artisan event:generate |
Este comando genera clases de eventos y escucha listadas bajo la propiedad $ listen
.
En
nuestro caso, el evento Illuminate \ Auth \ Events \ Login
ya existe,
por lo que solo crea la clase de escucha App \ Listeners \
SendEmailNotification
. De hecho, también habría creado la clase de evento Illuminate \ Auth \ Events \ Login
si no existía en primer lugar.
Echemos un vistazo a la clase de oyente creada en la app/ Listeners / SendEmailNotification.php
.
1 |
<?php
|
2 |
namespace App\Listeners; |
3 |
use Illuminate\Auth\Events\Login; |
4 |
use Illuminate\Queue\InteractsWithQueue; |
5 |
use Illuminate\Contracts\Queue\ShouldQueue; |
6 |
class SendEmailNotification |
7 |
{
|
8 |
/**
|
9 |
* Create the event listener.
|
10 |
*
|
11 |
* @return void
|
12 |
*/
|
13 |
public function __construct() |
14 |
{
|
15 |
//
|
16 |
}
|
17 |
/**
|
18 |
* Handle the event.
|
19 |
*
|
20 |
* @param Login $event
|
21 |
* @return void
|
22 |
*/
|
23 |
public function handle(Login $event) |
24 |
{
|
25 |
|
26 |
}
|
27 |
}
|
Es el método de handle
que se invocará con las dependencias apropiadas siempre que se active el oyente. En nuestro caso, el argumento $ event
debe contener información contextual sobre el inicio de sesión de sesión de sesión en la información del usuario.
Y podemos usar el objeto $ event
para llevar a cabo un procesamiento posterior en el método de handle
. En nuestro caso, queremos enviar la notificación por correo electrónico al usuario que inició sesión.
El método handle
revisado puede ser algo así como:
1 |
public function handle(Login $event) |
2 |
{
|
3 |
// get logged in user's email and username
|
4 |
$email = $event->user->email; |
5 |
$username = $event->user->name; |
6 |
|
7 |
// send email notification about login
|
8 |
}
|
Así es como se supone que debes usar la función de eventos en Laravel. A partir de la siguiente sección, avanzaremos y crearemos un evento personalizado y una clase de oyente asociada.
Crear un evento personalizado
El escenario de ejemplo que vamos a usar para nuestro ejemplo es algo como esto:
- Una aplicación necesita borrar cachés en un sistema en ciertos puntos. Lanzaremos el evento
CacheClear
junto con la información contextual cuando una aplicación haga lo anterior. Pasaremos las claves del grupo de caché junto con un evento que se borró. - Otros
módulos en un sistema pueden escuchar el evento
CacheClear
y desearían implementar un código que calienta cachés relacionados.
Revisemos
el archivo de la app / Providers / EventServiceProvider.php
y
registremos nuestro evento personalizado y las asignaciones de oyentes.
1 |
<?php
|
2 |
namespace App\Providers; |
3 |
use Illuminate\Support\Facades\Event; |
4 |
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; |
5 |
class EventServiceProvider extends ServiceProvider |
6 |
{
|
7 |
/**
|
8 |
* The event listener mappings for the application.
|
9 |
*
|
10 |
* @var array
|
11 |
*/
|
12 |
protected $listen = [ |
13 |
'App\Events\ClearCache' => [ |
14 |
'App\Listeners\WarmUpCache', |
15 |
],
|
16 |
];
|
17 |
/**
|
18 |
* Register any events for your application.
|
19 |
*
|
20 |
* @return void
|
21 |
*/
|
22 |
public function boot() |
23 |
{
|
24 |
parent::boot(); |
25 |
//
|
26 |
}
|
27 |
}
|
Como
puede ver, hemos definido el evento App \ Events \ ClearCache
y la
clase de escucha asociada App \ Listeners \ WarmUpCache
debajo de la
propiedad $ listen
.
Luego, necesitamos crear archivos de clase asociados. Recuerde que siempre puede usar el comando artesanal para generar un código de plantilla base.
1 |
php artisan event:generate |
Eso
debería haber creado la clase de evento en la app / Events /
ClearCache.php
y la clase de escucha en la app / Listeners /
WarmUpCache.php
.
Con algunos cambios, la clase de la app / Eventos / ClearCache.php
debería verse así:
1 |
<?php
|
2 |
namespace App\Events; |
3 |
use Illuminate\Broadcasting\Channel; |
4 |
use Illuminate\Queue\SerializesModels; |
5 |
use Illuminate\Broadcasting\PrivateChannel; |
6 |
use Illuminate\Broadcasting\PresenceChannel; |
7 |
use Illuminate\Foundation\Events\Dispatchable; |
8 |
use Illuminate\Broadcasting\InteractsWithSockets; |
9 |
use Illuminate\Contracts\Broadcasting\ShouldBroadcast; |
10 |
class ClearCache |
11 |
{
|
12 |
use Dispatchable, InteractsWithSockets, SerializesModels; |
13 |
|
14 |
public $cache_keys = []; |
15 |
/**
|
16 |
* Create a new event instance.
|
17 |
*
|
18 |
* @return void
|
19 |
*/
|
20 |
public function __construct(Array $cache_keys) |
21 |
{
|
22 |
$this->cache_keys = $cache_keys; |
23 |
}
|
24 |
/**
|
25 |
* Get the channels the event should broadcast on.
|
26 |
*
|
27 |
* @return Channel|array
|
28 |
*/
|
29 |
public function broadcastOn() |
30 |
{
|
31 |
return new PrivateChannel('channel-name'); |
32 |
}
|
33 |
}
|
Como
probablemente hayas notado, hemos agregado una nueva propiedad $
cache_keys
que se usará para guardar información que se transmitirá
junto con un evento. En nuestro caso, pasaremos los grupos de caché que fueron enrojecidos.
A
continuación, echemos un vistazo a la clase de oyente con un método de handle
actualizado en la app / Listeners / WarmUpCache.php
.
1 |
<?php
|
2 |
namespace App\Listeners; |
3 |
use App\Events\ClearCache; |
4 |
use Illuminate\Queue\InteractsWithQueue; |
5 |
use Illuminate\Contracts\Queue\ShouldQueue; |
6 |
class WarmUpCache |
7 |
{
|
8 |
/**
|
9 |
* Create the event listener.
|
10 |
*
|
11 |
* @return void
|
12 |
*/
|
13 |
public function __construct() |
14 |
{
|
15 |
//
|
16 |
}
|
17 |
/**
|
18 |
* Handle the event.
|
19 |
*
|
20 |
* @param ClearCache $event
|
21 |
* @return void
|
22 |
*/
|
23 |
public function handle(ClearCache $event) |
24 |
{
|
25 |
if (isset($event->cache_keys) && count($event->cache_keys)) { |
26 |
foreach ($event->cache_keys as $cache_key) { |
27 |
// generate cache for this key
|
28 |
// warm_up_cache($cache_key)
|
29 |
}
|
30 |
}
|
31 |
}
|
32 |
}
|
Cuando se invoca al oyente, el método de handle
se pasa con la instancia del evento asociado. En nuestro caso, debería ser la instancia del evento ClearCache
que se pasará como primer argumento para el método handle
.
A continuación, solo se trata de iterar a través de cada tecla de caché y calentar los cachés asociados.
Ahora, tenemos todo en su lugar para probar cosas en contra. Creemos
rápidamente un archivo de controlador en la app / Http /
Controllers / EventController.php
para demostrar cómo se puede generar
un evento.
1 |
<?php
|
2 |
namespace App\Http\Controllers; |
3 |
use App\Http\Controllers\Controller; |
4 |
use App\Library\Services\Contracts\CustomServiceInterface; |
5 |
use App\Post; |
6 |
use Illuminate\Support\Facades\Gate; |
7 |
use App\Events\ClearCache; |
8 |
class EventController extends Controller |
9 |
{
|
10 |
public function index() |
11 |
{
|
12 |
// ...
|
13 |
|
14 |
// you clear specific caches at this stage
|
15 |
$arr_caches = ['categories', 'products']; |
16 |
|
17 |
// want to raise ClearCache event
|
18 |
event(new ClearCache($arr_caches)); |
19 |
|
20 |
// ...
|
21 |
}
|
22 |
}
|
En primer lugar, hemos pasado una matriz de claves de caché como primer argumento al crear una instancia del evento ClearCache
.
La función de asistente de eventos se usa para generar un evento desde cualquier lugar dentro de una aplicación. Cuando se levanta el evento, Laravel llama a todos los oyentes que escuchan ese evento en particular.
En nuestro caso, el oyente App \ Listeners \ WarmUpCache
está configurado para escuchar el evento App \ Events \ ClearCache
. Por lo tanto, el método handle
del escucha de App \ Listeners \ WarmUpCache
se invoca cuando el evento se genera desde un controlador. ¡El resto es calentar los cachés que fueron eliminados!
Así es como puede crear eventos personalizados en su aplicación y trabajar con ellos.
¿Qué es un suscriptor de evento?
El suscriptor del evento le permite suscribirse a múltiples oyentes de eventos en un solo lugar. Si desea agrupar lógicamente oyentes de eventos o si desea incluir eventos en crecimiento en un solo lugar, es el suscriptor del evento que está buscando.
Si hubiéramos implementado los ejemplos discutidos hasta ahora en este artículo usando el suscriptor del evento, podría verse así.
1 |
<?php
|
2 |
// app/Listeners/ExampleEventSubscriber.php
|
3 |
namespace App\Listeners; |
4 |
class ExampleEventSubscriber |
5 |
{
|
6 |
/**
|
7 |
* Handle user login events.
|
8 |
*/
|
9 |
public function sendEmailNotification($event) { |
10 |
// get logged in username
|
11 |
$email = $event->user->email; |
12 |
$username = $event->user->name; |
13 |
|
14 |
// send email notification about login...
|
15 |
}
|
16 |
/**
|
17 |
* Handle user logout events.
|
18 |
*/
|
19 |
public function warmUpCache($event) { |
20 |
if (isset($event->cache_keys) && count($event->cache_keys)) { |
21 |
foreach ($event->cache_keys as $cache_key) { |
22 |
// generate cache for this key
|
23 |
// warm_up_cache($cache_key)
|
24 |
}
|
25 |
}
|
26 |
}
|
27 |
/**
|
28 |
* Register the listeners for the subscriber.
|
29 |
*
|
30 |
* @param Illuminate\Events\Dispatcher $events
|
31 |
*/
|
32 |
public function subscribe($events) |
33 |
{
|
34 |
$events->listen( |
35 |
'Illuminate\Auth\Events\Login', |
36 |
'App\Listeners\ExampleEventSubscriber@sendEmailNotification'
|
37 |
);
|
38 |
|
39 |
$events->listen( |
40 |
'App\Events\ClearCache', |
41 |
'App\Listeners\ExampleEventSubscriber@warmUpCache'
|
42 |
);
|
43 |
}
|
44 |
}
|
Es el método de suscribe
el responsable de registrar oyentes. El primer argumento del método subscribe
es la instancia de la clase Illuminate \ Events \ Dispatche
r que puede usar para vincular eventos con oyentes utilizando el método listen
.
El
primer argumento del método listen
es un evento que desea escuchar,
y el segundo argumento es un oyente al que se llamará cuando se
produzca el evento.
De esta forma, puede definir múltiples eventos y oyentes en la clase del suscriptor.
La clase de suscriptor del evento no se recogerá automáticamente. Debe
registrarlo en la clase EventServiceProvider.php
debajo de la propiedad
$ subscriber
, como se muestra en el siguiente fragmento.
1 |
<?php
|
2 |
namespace App\Providers; |
3 |
use Illuminate\Support\Facades\Event; |
4 |
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; |
5 |
class EventServiceProvider extends ServiceProvider |
6 |
{
|
7 |
/**
|
8 |
* The subscriber classes to register.
|
9 |
*
|
10 |
* @var array
|
11 |
*/
|
12 |
protected $subscribe = [ |
13 |
'App\Listeners\ExampleEventSubscriber', |
14 |
];
|
15 |
/**
|
16 |
* Register any events for your application.
|
17 |
*
|
18 |
* @return void
|
19 |
*/
|
20 |
public function boot() |
21 |
{
|
22 |
parent::boot(); |
23 |
//
|
24 |
}
|
25 |
}
|
Así que esa fue la clase de suscriptor del evento a su disposición, y con eso hemos llegado al final de este artículo también.
Conclusión
Hoy hemos discutido algunas de las características más interesantes de Laravel: eventos y oyentes. Se basan en el patrón de diseño del observador que le permite generar eventos en toda la aplicación y permitir que otros módulos escuchen esos eventos y reaccionen en consecuencia.
¿Acaba de ponerse al día con Laravel o desea expandir su conocimiento, sitio o aplicación con extensiones? Tenemos una variedad de cosas que puedes estudiar en Envato Market.
¡Siéntete libre de expresar tus pensamientos usando el feed a continuación!