Events

Объясните плиз как работать с эвентами.

Могут ли они мне помочь в таком use-case’е.

Пользователь добавляет коммент к статье, тут я хочу создать событие "коммент добавлен".

На это событие подписаны разные подписчики, каждый из которых делает свою работу.

Первый, например, отправит E-Mail автору статьи, второй сохранит что-то в лог, третий сделает еще что-то.

Собственно, где объявлять это событие и как подписывать подписчиков на него?

да, не то что помогут ,а будет хорошим архитектурным решением.

вот пример, практически описывающий вашу задачу: http://www.yiiframework.ru/doc/cookbook/ru/core.events

М-да, объяснили замечательно просто… Пример я посмотрел, со всех сторон, да вот толку мало, как для новичка, 3-й день пытаюсь понять что такое events и behavior в этом фреймворке и с чем его едят… Подробное объяснение в стиле "для чайника", или развернутый workflow процесса обработки событий и поведений, были бы лучшим вариантом. Если есть ссылки на что-либо подобное, поделитесь плз…

Поведение, оно же, например, в RubyOnRails называется mixin — способ расширения классов вроде множественного наследования. Например, к модели Post можно «подмешать» CTaggableBehaviour (для работы с тегами) и CTimestampBehaviour (для автоматического проставления дат создания и редактирования).

Смысл событий — компонент может зарегистрировать несколько событий и выполнить их в каких-то местах своего кода. Другие компоненты могут на эти события подписаться и соответственно выполнить по событиям какой-то код.

Помимо того, что дал выше почитать pirrat есть ещё (правда на английском):

http://www.yiiframework.com/doc/cookbook/30/

http://www.yiiframework.com/doc/cookbook/44/

Ещё очень полезно посмотреть на реализацию, например, CActiveRecord и CTaggableBehaviour (http://yiiframework.ru/forum/viewtopic.php?f=9&t=389).

Спасибо.

А можно эту тему подробнее разжевать? Просто до этого никак не сталкивался ни с поведением, ни с событиями. Очень хочется разобраться. А по примерам в ссылках не очень то понятно.

Поведение - это механизм который позволяет менять методы объекта динамически.

Т.е. например есть объект и есть 2 поведения у которых метод create() делает разные вещи: у первого пишет в базу, у второго в файл.

Подключая различные поведения, можно собственно добиться различных поведений (тавтология) объекта.

Также подключая поведения можно добиться того же что добиваются от приложения, подключая плагины: разные функции. Подключаем несколько поведений и получаем аналог множественного наследования классов, которого нет в PHP5.

События:

У событий есть две стороны: слушатели и отправители, ну и сами события разумеется.

Слушатели сначала подписываются на определенные события, например добавление коммента.

Отправитель потом создает событие и его обрабатывают подписанные слушатели и исполняют свои функции, например первый слушатель отправляет емаил, а второй пишет в логи.