Класс Event
Класс Event является фасадом для работы с системой событий Laravel.
Он предоставляет статические методы для диспатчинга событий, регистрации
слушателей и управления подписками. Основное назначение класса -
упростить взаимодействие с событиями и слушателями в приложении.
Синтаксис
Фасад Event предоставляет следующие основные методы:
<?php
Event::dispatch($event, $payload = []);
Event::listen($events, $listener);
Event::subscribe($subscriber);
Event::push($event, $payload = []);
Event::flush($event);
?>
Пример
Давайте создадим простое событие и зарегистрируем для него слушатель
в файле EventServiceProvider:
<?php
namespace AppProviders;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Event;
class EventServiceProvider extends ServiceProvider
{
protected $listen = [
'App\Events\UserRegistered' => [
'App\Listeners\SendWelcomeEmail',
'App\Listeners\LogUserRegistration',
],
];
public function register()
{
Event::listen(
'App\Events\UserRegistered',
'App\Listeners\SendWelcomeEmail'
);
}
}
?>
Пример
Создадим класс события для регистрации пользователя:
<?php
namespace AppEvents;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class UserRegistered
{
use Dispatchable, SerializesModels;
public $user;
public function __construct($user)
{
$this->user = $user;
}
}
?>
Пример
Зарегистрируем слушатель для события с использованием фасада Event
в контроллере:
<?php
namespace AppHttpControllers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Event;
use AppEventsUserRegistered;
use AppModelsUser;
class UserController extends Controller
{
public function register(Request $request)
{
$user = User::create([
'name' => $request->name,
'email' => $request->email,
]);
Event::dispatch(new UserRegistered($user));
return response()->json(['message' => 'User registered']);
}
}
?>
Результат выполнения кода:
"User registered"
Пример
Используем метод push для отложенной отправки событий в очередь:
<?php
namespace AppHttpControllers;
use Illuminate\Support\Facades\Event;
use AppEventsOrderCreated;
class OrderController extends Controller
{
public function store()
{
$order = [...];
Event::push('App\Events\OrderCreated', $order);
return response()->json(['message' => 'Order created']);
}
}
?>
Результат выполнения кода:
"Order created"
Пример
Зарегистрируем подписчик для обработки нескольких событий:
<?php
namespace AppListeners;
use Illuminate\Support\Facades\Event;
class UserEventSubscriber
{
public function handleUserLogin($event)
{
// логика обработки входа
}
public function handleUserLogout($event)
{
// логика обработки выхода
}
public function subscribe($events)
{
$events->listen(
'App\Events\UserLoggedIn',
'App\Listeners\UserEventSubscriber@handleUserLogin'
);
$events->listen(
'App\Events\UserLoggedOut',
'App\Listeners\UserEventSubscriber@handleUserLogout'
);
}
}
?>
Регистрация подписчика в EventServiceProvider:
<?php
namespace AppProviders;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Event;
class EventServiceProvider extends ServiceProvider
{
public function register()
{
Event::subscribe('App\Listeners\UserEventSubscriber');
}
}
?>