Проблемы с уведомлением SplObserver - PullRequest
0 голосов
/ 30 декабря 2011

Я рассматриваю шаблон SplObserver как способ решения проблемы ведения журнала (а именно, как вы ведете ведение журнала активности, не реализуя его непосредственно в интересующих вас классах и, следовательно, помещая в них код, который не является прямымсвязанные с их зоной ответственности).

Проблема заключается в том, что при реализации SplObserver, похоже, не предоставляет какого-либо стандартизированного механизма для уведомляющего класса для отправки каких-либо подробностей в класс наблюдения, кроме «Я запускаю уведомление».

Мне было любопытно узнать, как другие люди решают эту проблему: расширяют ли они интерфейсы SplObserver и SplSubject или вместо этого используют свой собственный?

Я также думал, что в более общих терминах (как и в других функциональных возможностях, которые могут быть реализованы с помощью Observers, без необходимости регистрации), если можно было реализовать шаблон Observer, где наблюдатель может указать, что он хочет толькоуведомляется об определенных событиях, а не о каждом событии, которое может генерировать субъект.Например, мне может понадобиться наблюдатель регистрации, который записывает всю активность в файл журнала, а также наблюдатель отчетов об ошибках, который отправляет электронное письмо администратору при возникновении ошибки, но только при возникновении ошибки.Вы можете написать регистратор ошибок, чтобы игнорировать уведомления, которые не вызваны ошибкой (при условии, что можно изменить этот шаблон так, чтобы можно было отправлять определенные виды уведомлений), но я подозреваю, что это будет менее эффективно, чем идеально.Я подозреваю, что было бы лучше разрешить наблюдателям подписываться только на определенные тематические события, но можно ли реализовать этот подход с помощью SplObserver?

1 Ответ

3 голосов
/ 30 января 2012

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

function update(SplSubject $subject) {
   $changed = $subject->getChanges();
   ....
}

вам, вероятно, придется создать новый интерфейс для принудительного существования getChanges () в теме.

По различным видам уведомлений вы можете взглянуть на системы очереди сообщений. Они позволяют вам подписаться на разные окна сообщений («logging.error», «logging.warning» или даже «logging»), где они будут получать уведомления, если другая система (субъект) отправит сообщение в соответствующую очередь. Их не намного сложнее реализовать как splObserver / splSubject.

...