События (events) в Yii - пример создания и использования

Статья по данной теме здесь, также полезно прочитать вот эту статью на английском
События добавляют в Yii приложение значительную гибкость.

Кстати куда более вменяемое объяснение находится на английском здесь, именно на основе этой статьи мы и запишем наше пояснение к механизму работы событий ниже:

что можно сказать о событии:

  1. оно может быть определено (описано)
  2. его можно вызвать
  3. его можно связать с обработчиками(чтобы была реакция других классов и компонентов на наступление события)

статья на которую была последняя ссылка неплохо об этом рассказывает.
я же проиллюстрирую реализацию конкретным кодом:
итак, класс - компонент, который будет описывать событие (это некоторое событие его жизнедеятельности) и вызывать его
:

<?php
/* опишем свой класс-наследник от CApplicationComponent
(не беру от CComponent так как в нём непосредственно
нет прекрасного метода init)
и опредлим какое-нибудь событие*/
class MyComponent extends CApplicationComponent
{
	/*здесь мы свяжем собтие и обработчик
	(связывание надо выполнить до того как "событие наступит")*/
	public function init()
	{

		/*указываем какую функцию запусить в случае наступления собтие -
		т.е. как бы "связываем" событие и функцию*/
		$this->onSomething = array(new MyComponentTest, 'somethingEventHendler'); //  SomeOtherClass - некий существующий класс
		Yii::log("события связаны",'info'); // пишем в журнал
	}


	public function onSomething($event) // определим непонятно какое событие
	{
		/* объявляем о том что собие произошло
		(это вызовет запуск обработчиков)*/
		$this->raiseEvent('onSomething', $event);
		Yii::log("оповещение о событии произведено!",'info'); //
	}

	/*некий метод в котором происходит что-то важное -
	информацией о наступлении чего стоит поделиться с другими классами*/
	public function doSomething() // во врямя выполнения этой функции происходит некоторое событие
	{
		$this->onSomething(new CEvent($this)); //  вызывем метод оповещения который и называется "событием"
		Yii::log("действие произошло  - событие должно быть вызвано",'info'); // пишем в журнал
	}
}

класс который мы подпишем на событие - он сделает запись в журнале:

<?php


/* опишем свой класс-наследник CComponent
и опредлим какое-нибудь событие*/
class MyComponentTest
{
    /*простой способ убедится, что система событий в yii работает
    - записать что-нибудь в стандартный файл журнала application.log */
	public function somethingEventHendler() // обработчик для события Something
	{
		Yii::log("Событие Something is go on ! =)",'info'); // пишем в журнал
	}
}

Действие контроллера (вообще говоря любого - то есть такое которое доступно через url - чтобы вы могли загрузить страницу):

	public function actionEventTest() // для тестирования события
	{
		$component = new MyComponent();// пусть в этом действии нам потребовался некотроый фукционал MyComponent
		$component->init(); // вызовём init() явно, так как не явно он что-то не спешит
		/*то есть - если например init вообще не определён в классе
		 от которого вы наследуете компонент вызывающий событие
		(напр. MyComponent был бы унаследован от иного yii-класса) - то связывание
		функции с обработчиком
		можно производить и "снаружи", напр. в методе контроллера
		*/
		$component->doSomething(); // вызывем этот функционал
		/*(что повлечёт генерацию события  - а до этого связывание события onSomething
		и метода  somethingEventHendler() класса MyComponentTest )
		*/
		Yii::log("по-идее ниже должна быть запись о событии",'info'); // пишем в журнал
		$this->render('eventtest');
	}