Laravel - Обработка событий
Здравствуйте, будущие маги Laravel! Сегодня мы окунемся в волшебный мир обработки событий в Laravel. Не волнуйтесь, если вы новички в программировании - я проведу вас через это путешествие шаг за шагом, как я делал это для countless студентов на протяжении многих лет моей преподавательской деятельности. Так что возьмите кружку вашего любимого напитка и отправляйтесь в это увлекательное приключение вместе со мной!
Что такое события в Laravel?
Представьте, что вы на вечеринке (конечно, кодовой вечеринке!). Когда происходит что-то важное - например, когда arrives торт - все радуются. В Laravel, события такие же волнующие моменты в вашем приложении. Это особые события, которые ваша программа заботит.
Например, когда пользователь регистрируется на вашем сайте, это событие. Когда делается заказ, это другое событие. События помогают нам поддерживать наш код организованным и позволяют разным частям нашего приложения реагировать на эти важные моменты.
Why Использовать события?
-
Decoupling: События помогают отделить разные части вашего приложения. Это как иметь разные команды на работе - каждой команде не нужно знать все о том, что делают другие.
-
Flexibility: Вы можете легко добавить новые реакции на события, не изменяя существующий код.
-
Clarity: События делают ваш код легче понять. очевидено, что происходит и когда.
Создание вашего первого события
Давайте создадим наше первое событие вместе. Мы создадим событие, которое происходит, когда новый пользователь регистрируется. Вот как мы это делаем:
php artisan make:event NewUserRegistered
Эта команда создает новый файл в app/Events
под названием NewUserRegistered.php
. Давайте посмотрим внутрь:
<?php
namespace App\Events;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class NewUserRegistered
{
use Dispatchable, InteractsWithSockets, SerializesModels;
public $user;
public function __construct($user)
{
$this->user = $user;
}
public function broadcastOn()
{
return new PrivateChannel('channel-name');
}
}
Не позволяйте всему этому коду вас напугать! Это как рецепт - мы рассмотрим каждый ингредиент:
-
Заявления
use
вверху, как импортируемые инструменты, которые мы можем cần. -
Наш класс события
NewUserRegistered
, где происходит магия. -
Свойство
$user
будет содержать информацию о новом пользователе. -
Метод
__construct
вызывается, когда мы создаем это событие, и он хранит информацию о пользователе.
Инициация (Развертывание) события
Теперь у нас есть наше событие, давайте его использовать! Мы инициируем это событие, когда новый пользователь регистрируется. Вот как мы можем это сделать в контроллере:
use App\Events\NewUserRegistered;
public function register(Request $request)
{
// ... логика регистрации пользователя ...
$user = User::create($request->all());
event(new NewUserRegistered($user));
return redirect('/welcome');
}
Здесь, после того как мы создаем нового пользователя, мы инициируем наше событие с помощью функции event()
. Это как запускать фейерверки, чтобы庆祝 нового пользователя!
Listening для событий
Теперь давайте создадим слушателя, который будет реагировать на наше событие. Представьте этого человека на вечеринке, который отвечает за раздачуparty hats, когда arrives торт.
Сначала создадим слушателя:
php artisan make:listener SendWelcomeEmail --event=NewUserRegistered
Эта команда создает новый файл в app/Listeners
под названием SendWelcomeEmail.php
. Давайте посмотрим внутрь:
<?php
namespace App\Listeners;
use App\Events\NewUserRegistered;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\InteractsWithQueue;
class SendWelcomeEmail
{
public function handle(NewUserRegistered $event)
{
// Доступ к пользователю через $event->user
// Логика отправки приветственного письма здесь
}
}
Метод handle
- это место, где мы пишем код, который должен выполняться при возникновении события. В этом случае, мы бы добавили нашу логику для отправки приветственного письма.
Регистрация слушателей событий
Чтобы связать наше событие с нашим слушателем, нам нужно их зарегистрировать. Откройте app/Providers/EventServiceProvider.php
и добавьте это в массив $listen
:
protected $listen = [
NewUserRegistered::class => [
SendWelcomeEmail::class,
],
];
Это говорит Laravel: "Эй, когда NewUserRegistered
происходит, запусти SendWelcomeEmail
!"
Подписчики событий
Иногда вы можете захотеть, чтобы один класс обрабатывал несколько событий. Вот где появляются подписчики событий. Они как организатор вечеринки, который отвечает за несколько аспектов вечеринки.
Вот как создать подписчика события:
php artisan make:listener UserEventSubscriber
Затем, в классе UserEventSubscriber
:
<?php
namespace App\Listeners;
class UserEventSubscriber
{
public function handleUserRegistered($event) {}
public function handleUserLoggedIn($event) {}
public function subscribe($events)
{
$events->listen(
'App\Events\NewUserRegistered',
'App\Listeners\UserEventSubscriber@handleUserRegistered'
);
$events->listen(
'App\Events\UserLoggedIn',
'App\Listeners\UserEventSubscriber@handleUserLoggedIn'
);
}
}
Чтобы зарегистрировать этого подписчика, добавьте его в свойство $subscribe
в EventServiceProvider
:
protected $subscribe = [
'App\Listeners\UserEventSubscriber',
];
Очередевые слушатели событий
Если ваш слушатель событий выполняет что-то занимающее много времени (например, отправку письма), вы можете хотите поставить его в очередь, чтобы он не замедлял ваше приложение. Это как сказать кому-то: "Эй, можешь заняться этой задачей позже, когда ты не так занят?"
Чтобы сделать слушателя очередным, реализуйте интерфейс ShouldQueue
:
use Illuminate\Contracts\Queue\ShouldQueue;
class SendWelcomeEmail implements ShouldQueue
{
// ...
}
Теперь Laravel автоматически поставит этого слушателя в очередь!
Таблица методов событий
Вот удобная таблица основных методов, которые мы используем с событиями:
Метод | Описание |
---|---|
event() |
Инициация события |
listen() |
Регистрация слушателя события |
subscribe() |
Регистрация подписчика событий |
dispatch() |
Другой способ иницииации события |
broadcast() |
Трансляция события (для реальных приложений в реальном времени) |
И вот мы и arrived, мои дорогие студенты! Мы вместе прошли через страну обработки событий Laravel. Помните, что практика делает perfect, так что не бойтесь экспериментировать с этими концепциями в своих собственных проектах. Кто знает? Вы можете просто устроить лучшую кодовую вечеринку когда-либо с вашими новыми навыками обработки событий!
Счастливого кодирования, и пусть ваши события всегда обрабатываются с грацией и стилем!
Credits: Image by storyset