События

Использование

Класс 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');