Подписывайтесь на наш Telegram канал и будьте в курсе всех событий.

События

Вы просматриваете документ для прошлой версии.
Рассмотрите возможность обновления вашего проекта до актуальной версии 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');