Комментарии 17
В фреймворке Kohana для этого используется статический класс Event и хуки (в качестве обработчиков). Например:
На одно и то же событие можно навешивать много различных обработчиков.
// где-то в инициализации приложения
Event::add('user.login', array('auth', 'logged_in'));
// в контроллере, после входа пользователя
Event::run('user.login');
На одно и то же событие можно навешивать много различных обработчиков.
+1
В моем примере тоже можно навесить несколько разных обработчиков. Это видно в коде установки хука, но, к сожалению, не видно при самом навешивании хука. В C# используется перегруженный +=, в PHP пока такое реализовать не получается…
А в Kohana аргументы к событиям как-то используются?
А в Kohana аргументы к событиям как-то используются?
0
Вот раздел документации фреймворка Symfony касательно Events's. Классы, реализующие работу с Event's, могут спокойно использоваться без фреймворка. Вот ссылка на реализацию: http://svn.symfony-project.org/branches/1.2/lib/event/
0
Я в курсе что есть реализации события в различный фреймворках.
В данном примере демонстрируется не создание очередного обработчкиа событий а в большей степени пример использования Reflection для более строго постановки хэндлеров события и в целом более строгой реализации.
В тех сорцах Symfony, что вы показали, я проверки не нашел.
В данном примере демонстрируется не создание очередного обработчкиа событий а в большей степени пример использования Reflection для более строго постановки хэндлеров события и в целом более строгой реализации.
В тех сорцах Symfony, что вы показали, я проверки не нашел.
0
по-моему, это то же самое, что и Signal/Slot из ezComponents, о котором здесь уже я писал
0
Можно ссылочку?
Там есть проверка на корректность передаваемого колбэка?
Там есть проверка на корректность передаваемого колбэка?
0
не знаю о проверке (и не придумаю, зачем), а остальное находится поиском сразу — habrahabr.ru/blogs/webdev/46741/
0
1) «has no event», мне кажется
2) а как удалить подписку на ивент?
2) а как удалить подписку на ивент?
0
Красивая реализация. Побольше бы таких статей на хабре, может перестали бы php называть быдлокодингом…
+2
А как же SplObserver / SplSubject?
+4
Именование объектов кода какое-то странное. Почему класс называется EventClass (ведь в ключевом слове class уже недвусмысленно дается понять, что именно перед нами). Что за имя класса — CanGenerateEvents? Класс — практически в 100% случаев должен называться именем существительным. attachEvent() — вообще непонятно что, совсем не отвечает назначению метода.
Далее…
Почему current($args)? Этот момент не объяснен нигде, в результате код становится тяжел для понимания.
function recieveHere(EventArgument $arg) — а где описан интерфейс EventArgument?
Насчет использования исключений — ну почему, почему везде выбрасывается только Exception?! Для кого разработчики языка, в частности, SPL — сделали великолепный набор исключений? Не хотите писать свои — используйте готовые!
И еще я бы добавил, что реализация такого класса, (скорее всего: пока сам не попробуешь, не узнаешь, есть ли подводные камни) — так вот, это должен быть отличный повод заюзать вкусности SPL: ну, например, SplQueue или SplObjectStorage.
Далее…
function __call($name, $args) { ... $this->fireEvent($name, current($args)); ... }
Почему current($args)? Этот момент не объяснен нигде, в результате код становится тяжел для понимания.
function recieveHere(EventArgument $arg) — а где описан интерфейс EventArgument?
Насчет использования исключений — ну почему, почему везде выбрасывается только Exception?! Для кого разработчики языка, в частности, SPL — сделали великолепный набор исключений? Не хотите писать свои — используйте готовые!
И еще я бы добавил, что реализация такого класса, (скорее всего: пока сам не попробуешь, не узнаешь, есть ли подводные камни) — так вот, это должен быть отличный повод заюзать вкусности SPL: ну, например, SplQueue или SplObjectStorage.
+2
И вот, кстати, отличное замечание выше от SamDark — насчет SplObserver / SplSubject. Я писал свой коммент, и не покидало ощущение того, что упускаю что-то главное и простое.
0
CanGenerateEvents — исключительно для примера. «Класс, умеющий генерить события». Про существительное согласен на 100%.
current($args) — безусловно ошибка, там не должно быть current, исправил.
EventArgument — случайно упустил, добавил.
По исключениям — спасибо, да, это действительно правильнее.
current($args) — безусловно ошибка, там не должно быть current, исправил.
EventArgument — случайно упустил, добавил.
По исключениям — спасибо, да, это действительно правильнее.
-1
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
C#-like cобытия для PHP. Reflection, closures…