Метод subscribe
Метод subscribe применяется к экземпляру класса Event и позволяет зарегистрировать подписчика событий. Подписчик - это класс, который содержит методы для обработки различных событий. Первым параметром передаётся класс подписчика, вторым (необязательным) - метод, который возвращает массив событий и их обработчиков.
Синтаксис
<?php
Event::subscribe($subscriber);
?>
Пример
Создадим подписчик для обработки событий модели User:
<?php
namespace App\Listeners;
use App\Events\UserCreated;
use App\Events\UserUpdated;
use App\Events\UserDeleted;
class UserEventSubscriber
{
public function handleUserCreated($event)
{
echo "User created: " . $event->user->name;
}
public function handleUserUpdated($event)
{
echo "User updated: " . $event->user->name;
}
public function handleUserDeleted($event)
{
echo "User deleted: " . $event->user->name;
}
public function subscribe($events)
{
return [
UserCreated::class => 'handleUserCreated',
UserUpdated::class => 'handleUserUpdated',
UserDeleted::class => 'handleUserDeleted',
];
}
}
?>
Пример
Зарегистрируем подписчика в методе boot класса EventServiceProvider:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\ServiceProvider;
use App\Listeners\UserEventSubscriber;
class EventServiceProvider extends ServiceProvider
{
public function boot()
{
Event::subscribe(UserEventSubscriber::class);
}
}
?>
Пример
Теперь при создании пользователя будет вызван метод handleUserCreated подписчика:
<?php
namespace App\Http\Controllers;
use App\Models\User;
use App\Events\UserCreated;
class UserController extends Controller
{
public function store()
{
$user = new User();
$user->name = 'John Doe';
$user->email = 'john@example.com';
$user->save();
event(new UserCreated($user));
return response()->json(['message' => 'User created']);
}
}
?>
Результат выполнения кода при создании пользователя:
"User created: John Doe"
Пример
Вместо метода subscribe в подписчике можно использовать свойство subscribe, которое будет содержать массив соответствий событий и методов:
<?php
namespace App\Listeners;
use App\Events\OrderPlaced;
use App\Events\OrderShipped;
use App\Events\OrderDelivered;
class OrderEventSubscriber
{
public $subscribe = [
OrderPlaced::class => 'onOrderPlaced',
OrderShipped::class => 'onOrderShipped',
OrderDelivered::class => 'onOrderDelivered',
];
public function onOrderPlaced($event)
{
echo "Order placed: #" . $event->order->id;
}
public function onOrderShipped($event)
{
echo "Order shipped: #" . $event->order->id;
}
public function onOrderDelivered($event)
{
echo "Order delivered: #" . $event->order->id;
}
}
?>
Регистрация такого подписчика выполняется аналогично:
<?php
namespace App\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Support\ServiceProvider;
use App\Listeners\OrderEventSubscriber;
class EventServiceProvider extends ServiceProvider
{
public function boot()
{
Event::subscribe(OrderEventSubscriber::class);
}
}
?>