Простейшее использование
Класс PHPEvent
содержит простую реализацию концепции «Наблюдатель», что позволяет вам подписываться на уведомления о событиях в вашем приложении.
Event::listen('auth.login', function ($user) {
$user->last_login = new DateTime;
$user->save();
});
$event = Event::fire('auth.login', array($user));
Подписка на событие с приоритетом
При подписывании на событие вы можете указать приоритет. Обработчики с более высоким приоритетом будут вызваны перед теми, чей приоритет ниже, а обработчики с одинаковым приоритетом будут вызываться в порядке их регистрации.
Event::listen('auth.login', 'LoginHandler', 10);
Event::listen('auth.login', 'OtherHandler', 5);
Иногда вам может быть нужно пропустить вызовы других обработчиков события. Вы можете сделать это, вернув значение PHPfalse
:
Event::listen('auth.login', function ($event) {
// Обработка события...
return false;
});
Где регистрировать события
Итак, вы знаете, как регистрировать события, но вы можете задуматься — где их регистрировать. Не волнуйтесь, это обычный вопрос. К сожалению, на этот вопрос сложно ответить, потому что вы можете регистрировать события практически в любом месте! Но вот несколько советов. Опять же, как и большую часть другого кода начальной загрузки, вы можете зарегистрировать события в одном из ваших старт-файлов, таких как app/start/global.php.
Если ваши старт-файлы слишком разрастаются, вы можете создать отдельный файл app/events.php, который подключается из старт-файла. Это простое решение, которое четко отделяет вашу регистрацию событий от остальной части вашей начальной загрузки. Если вы предпочитаете подход, основанный на классах, вы можете зарегистрировать ваши события в поставщике услуг. Поскольку ни один из этих подходов не является однозначно «правильным», выбирайте удобный для вас подход в зависимости от размера вашего приложения.
Обработчики по шаблону
Регистрация обработчиков по шаблону
При регистрации обработчика вы можете использовать звёздочки (*) для привязки его ко всем подходящим событиям:
Event::listen('foo.*', function ($param)
{
// Обработка событий...
});
Этот обработчик будет вызываться при любом событии, начинающемся с foo..
В версии 4.0 и ранее первым (или последним — неточность в документации?) параметром функция получала PHP$event
— полное имя обрабатываемого события — прим. пер.
добавлено в 4.1 ()
Классы-обработчики
В некоторых случаях вы можете захотеть обрабатывать события внутри класса, а не функции-замыкания. Классы-обработчики получаются из IoC-контейнера, поэтому вы можете использовать все его возможности по автоматическому внедрению зависимостей.
Регистрация обработчика в классе
Event::listen('auth.login', 'LoginHandler');
Создание обработчика внутри класса
По умолчанию будет вызываться метод PHPhandle()
класса PHPLoginHandler
:
class LoginHandler {
public function handle($data)
{
//
}
}
Регистрация обработчика в другом методе
Если вы не хотите использовать метод PHPhandle()
, вы можете указать другое имя при регистрации:
Event::listen('auth.login', 'LoginHandler@onLogin');
Запланированные события
С помощью методов PHPqueue()
и PHPflush()
вы можете запланировать события к возникновению, но не возбуждать их сразу:
Event::queue('foo', array($user));
Регистрация «пускателя» (не доступна с версии 4.2 — прим. пер.)
Event::flusher('foo', function ($user) {
//
});
Наконец, вы можете «запустить» все запланированные события методом PHPflush()
:
Event::flush('foo');
Классы-подписчики
Классы-подписчики содержат обработчики множества событий. Подписчики должны содержать метод PHPsubscribe()
, которому будет передан экземпляр обработчика событий для регистрации:
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('auth.logout', 'UserEventHandler@onUserLogout');
}
}
Как только класс-подписчик определён, он может быть зарегистрирован внутри PHPEvent
.
$subscriber = new UserEventHandler;
Event::subscribe($subscriber);
Вы также можете использовать контейнер IoC для обработки вашего подписчика. Чтобы сделать это, просто передайте имя вашего подписчика в метод PHPsubscribe()
:
Event::subscribe('UserEventHandler');