События
11.x
.
Почему это важно?
Использование
Класс Event
содержит простую реализацию концепции Observer (“Наблюдатель”), что позволяет вам подписываться на уведомления о событиях (listen for events) в вашем приложении.
Подписка на событие
Event::listen('auth.login', function($user)
{
$user->last_login = new DateTime;
$user->save();
});
Запуск события
$response = Event::fire('auth.login', array($user));
Метод fire
возвращает массив ответов, полученных по цепочке событий.
Подписка на событие с приоритетом
При подписке на событие вы можете указать приоритет. Обработчики с более высоким приоритетом будут вызваны перед теми, чей приоритет ниже, а обработчики с одинаковым приоритетом будут вызываться в порядке их регистрации.
Event::listen('auth.login', 'LoginHandler', 10);
Event::listen('auth.login', 'OtherHandler', 5);
Прерывание обработки события
Иногда вам может быть нужно пропустить вызовы других обработчиков события. Вы можете сделать это, вернув значение false
:
Event::listen('auth.login', function($event)
{
// Обработка события
return false;
});
Где писать код ?
Регистрировать обработчики событий можно практически везде – например, в старт-файле app/start/global.php
. Или, если же этот файл у вас уже слишком сильно разросся, вы можете, например, сделать файл app/events.php
и подключить (include) его в app/start/global.php
. Если же вы предпочитаете ООП-подход, вы можете зарегистрировать ваши обработчики событий в одном из ваших сервис-провайдеров.
Обработчики по шаблону (wildcard)
Регистрация обработчика по шаблону
При регистрации обработчика вы можете использовать звёздочки (*) для привязки его ко всем подходящим событиям.
Event::listen('foo.*', function($param)
{
// Обработка событий
});
Этот обработчик будет вызываться при любом событии, начинающемся foo.
.
Для определения того, какое именно событие из подходящих под foo.*
поймано, используйте Event::firing()
Event::listen('foo.*', function($param)
{
if (Event::firing() == 'foo.bar')
{
//
}
});
Классы-обработчики
В некоторых случаях вы можете захотеть обрабатывать события внутри класса, а не функции-замыкания. Классы-обработчики берутся из IoC-контейнера, поэтому вы можете использовать все его возможности по автоматическому внедрению зависимостей.
Регистрация обработчика в классе
Event::listen('auth.login', 'LoginHandler');
Создание обработчика внутри класса
По умолчанию будет вызываться метод handle
класса LoginHandler
.
class LoginHandler {
public function handle($data)
{
//
}
}
Регистрация обработчика в другом методе
Если вы не хотите использовать метод handle
, вы можете указать другое имя при регистрации.
Event::listen('auth.login', 'LoginHandler@onLogin');
Запланированные события
Регистрация цепочки событий
С помощью методов queue
и flush
вы можете запланировать события к запуску, но не запускать их сразу.
Event::queue('foo', array($user));
Вы можете запустить все запланированные события методом flush
:
Event::flush('foo');
Классы-подписчики
Определение класса-подписчика
Классы-подписчики содержат обработчики множества событий. Подписчики должны содержать метод subscribe
, которому будет передан экземпляр обработчика событий для регистрации.
class UserEventHandler {
/**
* Обработка событий входа пользователя в систему.
*/
public function onUserLogin($event)
{
//
}
/**
* Обработка событий выхода из системы.
*/
public function onUserLogout($event)
{
//
}
/**
* Регистрация всех обработчиков данного подписчика.
*
* @param Illuminate\Events\Dispatcher $events
* @return array
*/
public function subscribe($events)
{
$events->listen('auth.login', 'UserEventHandler@onUserLogin');
$events->listen('user.logout', 'UserEventHandler@onUserLogout');
}
}
Регистрация класса-подписчика
Как только класс-подписчик определён, он может быть зарегистрирован внутри класса Event
.
$subscriber = new UserEventHandler;
Event::subscribe($subscriber);
Ds также можете регистрировать классы-подписчики в IoC container и использовать их ключ (который обычно совпадает с названием класса) в качестве аргумента:
Event::subscribe('UserEventHandler');