Laravel (5.7) События
Основы событий и слушателей
В этом разделе мы рассмотрим способ реализации событий и прослушивателей в базовой среде Laravel. Если вы знакомы с архитектурой Laravel, вы, вероятно, знаете, что Laravel реализует концепцию поставщика услуг, который позволяет вам внедрять различные приложения в приложение.
Аналогичным образом, Laravel предоставляет встроенный класс EventServiceProvider.php, который позволяет нам определять сопоставления прослушивателей событий для приложения.
Идите вперед и извлеките файл app / Providers / EventServiceProvider.php.
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'App\Events\SomeEvent' => [
'App\Listeners\EventListener',
],
];
/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
parent::boot();
//
}
}
Давайте подробно рассмотрим свойство $ listen, которое позволяет вам определять массив событий и связанных слушателей. Ключи массива соответствуют событиям в системе, а их значения соответствуют слушателям, которые будут срабатывать при возникновении соответствующего события в системе.
Я предпочитаю пройти пример из реальной жизни, чтобы продемонстрировать это дальше. Как вы, наверное, знаете, Laravel предоставляет встроенную систему аутентификации, которая облегчает такие функции, как вход в систему, регистрация и тому подобное.
Предположим, что вы хотите отправить уведомление по электронной почте в качестве меры безопасности, когда кто-то входит в приложение. Если Laravel не поддерживает функцию прослушивания событий, возможно, вы в конечном итоге отредактировали основной класс или каким-то другим способом подключили свой код, который отправляет электронное письмо.
На самом деле, вам повезло, так как Laravel помогает вам решить эту проблему с помощью прослушивателя событий. Давайте изменим файл app / Providers / EventServiceProvider.php, чтобы он выглядел следующим образом.
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'Illuminate\Auth\Events\Login' => [
'App\Listeners\SendEmailNotification',
],
];
/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
parent::boot();
//
}
}
Это метод handle, который будет вызываться с соответствующими зависимостями при каждом запуске слушателя. В нашем случае аргумент $ event должен содержать контекстную информацию о событии входа в систему - зарегистрированную информацию о пользователе.
И мы можем использовать объект $ event для выполнения дальнейшей обработки в методе handle. В нашем случае мы хотим отправить уведомление по электронной почте зарегистрированному пользователю.
Пересмотренный метод handle может выглядеть примерно так:
public function handle(Login $event)
{
// get logged in user's email and username
$email = $event->user->email;
$username = $event->user->name;
// send email notification about login
}
Вот как вы должны использовать функцию событий в Laravel. В следующем разделе мы продолжим и создадим пользовательское событие и связанный с ним класс слушателя.
Создать пользовательское событие
Пример сценария, который мы собираемся использовать для нашего примера, выглядит примерно так:
- Приложение должно очищать кеши в системе в определенные моменты. Мы будем вызывать событие CacheClear вместе с контекстной информацией, когда приложение сделает вышеупомянутое. Мы передадим ключи группы кеша вместе с событием, которое было очищено.
- Другие модули в системе могут прослушивать событие CacheClear и хотели бы реализовать код, который нагревает связанные кэши.
Давайте вернемся к файлу app / Providers / EventServiceProvider.php и зарегистрируем наши пользовательские отображения событий и прослушивателей.
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
/**
* The event listener mappings for the application.
*
* @var array
*/
protected $listen = [
'App\Events\ClearCache' => [
'App\Listeners\WarmUpCache',
],
];
/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
parent::boot();
//
}
}
Как видите, мы определили событие AppEventsClearCache и связанный с ним класс слушателя AppListenersWarmUpCache в свойстве $ listen.
Далее нам нужно создать связанные файлы классов. Напомним, что вы всегда можете использовать команду artisan для генерации кода базового шаблона.
php artisan event:generate
Это должно было создать класс события в app / Events / ClearCache.php и класс слушателя в
приложение / Слушатели / WarmUpCache.php.
С некоторыми изменениями класс app / Events / ClearCache.php должен выглядеть следующим образом:
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
class ClearCache
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $cache_keys = [];
/**
* Create a new event instance.
*
* @return void
*/
public function __construct(Array $cache_keys)
{
$this->cache_keys = $cache_keys;
}
/**
* Get the channels the event should broadcast on.
*
* @return Channel|array
*/
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
Как вы, наверное, заметили, мы добавили новое свойство $ cache_keys, которое будет использоваться для хранения информации, которая будет передаваться вместе с событием. В нашем случае мы передадим очищенные группы кэша.
Далее, давайте посмотрим на класс слушателя с обновленным методом handle в app / Listeners / WarmUpCache.php.
<?php
namespace App\Listeners;
use App\Events\ClearCache;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
class WarmUpCache
{
/**
* Create the event listener.
*
* @return void
*/
public function __construct()
{
//
}
/**
* Handle the event.
*
* @param ClearCache $event
* @return void
*/
public function handle(ClearCache $event)
{
if (isset($event->cache_keys) && count($event->cache_keys)) {
foreach ($event->cache_keys as $cache_key) {
// generate cache for this key
// warm_up_cache($cache_key)
}
}
}
}
Когда вызывается прослушиватель, метод handle передается с экземпляром связанного события. В нашем случае это должен быть экземпляр события ClearCache, который будет передан в качестве первого аргумента методу handle.
Далее, это просто вопрос перебора каждого ключа кеша и прогрева связанных кешей.
Теперь у нас есть все для проверки. Давайте быстро создадим файл контроллера в app / Http / Controllers / EventController.php, чтобы продемонстрировать, как вы можете вызвать событие.
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Library\Services\Contracts\CustomServiceInterface;
use App\Post;
use Illuminate\Support\Facades\Gate;
use App\Events\ClearCache;
class EventController extends Controller
{
public function index()
{
// ...
// you clear specific caches at this stage
$arr_caches = ['categories', 'products'];
// want to raise ClearCache event
event(new ClearCache($arr_caches));
// ...
}
}
Во-первых, мы передали массив ключей кеша в качестве первого аргумента при создании экземпляра события ClearCache. Функция помощника по событиям используется для вызова события из любого места в приложении. Когда событие поднято, Laravel вызывает всех слушателей, слушающих это конкретное событие.
В нашем случае прослушиватель AppListenersWarmUpCache настроен на прослушивание события AppEventsClearCache. Таким образом, метод handle прослушивателя AppListenersWarmUpCache вызывается, когда событие вызывается из контроллера. Остальное - разогреть кеши, которые были очищены!
Вот как вы можете создавать собственные события в вашем приложении и работать с ними.
Что такое подписчик на событие?
Подписчик на событие позволяет вам подписать несколько слушателей событий в одном месте. Независимо от того, хотите ли вы логически сгруппировать прослушиватели событий или хранить растущие события в одном месте, вы ищете именно подписчика событий.
Если бы мы реализовали примеры, обсуждаемые до сих пор в этой статье, с использованием подписчика на событие, это может выглядеть следующим образом.
<?php
// app/Listeners/ExampleEventSubscriber.php
namespace App\Listeners;
class ExampleEventSubscriber
{
/**
* Handle user login events.
*/
public function sendEmailNotification($event) {
// get logged in username
$email = $event->user->email;
$username = $event->user->name;
// send email notification about login...
}
/**
* Handle user logout events.
*/
public function warmUpCache($event) {
if (isset($event->cache_keys) && count($event->cache_keys)) {
foreach ($event->cache_keys as $cache_key) {
// generate cache for this key
// warm_up_cache($cache_key)
}
}
}
/**
* Register the listeners for the subscriber.
*
* @param Illuminate\Events\Dispatcher $events
*/
public function subscribe($events)
{
$events->listen(
'Illuminate\Auth\Events\Login',
'App\Listeners\[email protected]'
);
$events->listen(
'App\Events\ClearCache',
'App\Listeners\[email protected]'
);
}
}
Это метод подписки, который отвечает за регистрацию слушателей. Первым аргументом метода подписки является экземпляр класса IlluminateEventsDispatcher, который можно использовать для привязки событий к слушателям с помощью метода listen.
Первый аргумент метода listen - это событие, которое вы хотите прослушать, а второй аргумент - это слушатель, который будет вызываться при возникновении события.
Таким образом, вы можете определить несколько событий и слушателей в самом классе подписчика.
Класс подписчика на событие не будет выбран автоматически. Вам необходимо зарегистрировать его в классе EventServiceProvider.php в свойстве $ subscriber, как показано в следующем фрагменте.
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
class EventServiceProvider extends ServiceProvider
{
/**
* The subscriber classes to register.
*
* @var array
*/
protected $subscribe = [
'App\Listeners\ExampleEventSubscriber',
];
/**
* Register any events for your application.
*
* @return void
*/
public function boot()
{
parent::boot();
//
}
}
Предыдущая: Laravel (5.7) Коллекции
Далее: Laravel (5.7) Файловое хранилище
Новый контент: Composer: менеджер зависимостей для PHP , R программирования