События (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
- 9516 reads