кодесурса
«Laravel

Laravel (5.7) События

script1adsense2code
script1adsense3code

Основы событий и слушателей

В этом разделе мы рассмотрим способ реализации событий и прослушивателей в базовой среде 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 программирования


script1adsense4code
script1adsense5code
disqus2code
script1adsense6code
script1adsense7code
script1adsense8code
buysellads2code