Как стать автором
Обновить

Комментарии 17

В фреймворке Kohana для этого используется статический класс Event и хуки (в качестве обработчиков). Например:
// где-то в инициализации приложения
Event::add('user.login', array('auth', 'logged_in'));

// в контроллере, после входа пользователя
Event::run('user.login');

На одно и то же событие можно навешивать много различных обработчиков.
В моем примере тоже можно навесить несколько разных обработчиков. Это видно в коде установки хука, но, к сожалению, не видно при самом навешивании хука. В C# используется перегруженный +=, в PHP пока такое реализовать не получается…

А в Kohana аргументы к событиям как-то используются?
При срабатывании события (Event::run()) можно по ссылке передать объект. Далее в хуке он будет доступен как Event::$data.

Вообще в ядре фреймворка есть несколько срабатываний системных событий (типа 'system.ready'), к которым можно привязывать свои библиотеки — очень удобно.
Я в курсе что есть реализации события в различный фреймворках.
В данном примере демонстрируется не создание очередного обработчкиа событий а в большей степени пример использования Reflection для более строго постановки хэндлеров события и в целом более строгой реализации.

В тех сорцах Symfony, что вы показали, я проверки не нашел.
по-моему, это то же самое, что и Signal/Slot из ezComponents, о котором здесь уже я писал
Можно ссылочку?
Там есть проверка на корректность передаваемого колбэка?
не знаю о проверке (и не придумаю, зачем), а остальное находится поиском сразу — habrahabr.ru/blogs/webdev/46741/
Проверка — чтобы не навешивать кривых хэндлеров, чтобы еще на этапе попытки навесить хэндлер увидеть ошибку в один символ в имени метода, чтобы просто более строго система была прострена, приемники строго типизированы чтобы были.
1) «has no event», мне кажется
2) а как удалить подписку на ивент?
1) спасибо
2) никак =) в текущей реализации не требовалось, задумаюсь над красивым решением, спасибо.
Красивая реализация. Побольше бы таких статей на хабре, может перестали бы php называть быдлокодингом…
А как же SplObserver / SplSubject?
Именование объектов кода какое-то странное. Почему класс называется EventClass (ведь в ключевом слове class уже недвусмысленно дается понять, что именно перед нами). Что за имя класса — CanGenerateEvents? Класс — практически в 100% случаев должен называться именем существительным. attachEvent() — вообще непонятно что, совсем не отвечает назначению метода.

Далее…
function __call($name, $args)
{ ... $this->fireEvent($name, current($args)); ... }

Почему current($args)? Этот момент не объяснен нигде, в результате код становится тяжел для понимания.

function recieveHere(EventArgument $arg) — а где описан интерфейс EventArgument?

Насчет использования исключений — ну почему, почему везде выбрасывается только Exception?! Для кого разработчики языка, в частности, SPL — сделали великолепный набор исключений? Не хотите писать свои — используйте готовые!

И еще я бы добавил, что реализация такого класса, (скорее всего: пока сам не попробуешь, не узнаешь, есть ли подводные камни) — так вот, это должен быть отличный повод заюзать вкусности SPL: ну, например, SplQueue или SplObjectStorage.
И вот, кстати, отличное замечание выше от SamDark — насчет SplObserver / SplSubject. Я писал свой коммент, и не покидало ощущение того, что упускаю что-то главное и простое.
CanGenerateEvents — исключительно для примера. «Класс, умеющий генерить события». Про существительное согласен на 100%.

current($args) — безусловно ошибка, там не должно быть current, исправил.

EventArgument — случайно упустил, добавил.

По исключениям — спасибо, да, это действительно правильнее.
Тогда EventsGenerator.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории