События (events) в Yii - пример создания и использования
Primary tabs
Статья по данной теме здесь, также полезно прочитать вот эту статью на английском
События добавляют в Yii приложение значительную гибкость.
Кстати куда более вменяемое объяснение находится на английском здесь, именно на основе этой статьи мы и запишем наше пояснение к механизму работы событий ниже:
что можно сказать о событии:
- оно может быть определено (описано)
- его можно вызвать
- его можно связать с обработчиками(чтобы была реакция других классов и компонентов на наступление события)
статья на которую была последняя ссылка неплохо об этом рассказывает.
я же проиллюстрирую реализацию конкретным кодом:
итак, класс - компонент, который будет описывать событие (это некоторое событие его жизнедеятельности) и вызывать его
:
<?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');
}
- Log in to post comments
- 10076 reads