diff options
Diffstat (limited to 'app/frontend/events/EventModule.php')
-rw-r--r-- | app/frontend/events/EventModule.php | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/app/frontend/events/EventModule.php b/app/frontend/events/EventModule.php new file mode 100644 index 0000000..6474523 --- /dev/null +++ b/app/frontend/events/EventModule.php @@ -0,0 +1,53 @@ +<?php + +class EventModule extends TModule { + + public function init($config) { + $reflection = new ReflectionClass($this); + foreach ($reflection->getMethods() as $method) { + if (is_a($method->class, get_class(), TRUE)) { + $eventPattern = []; + if (preg_match('/^on(.*)/', $method->name, $eventPattern)) { + $this->_registerEventHandler( + $eventPattern[1], + $method->getClosure($this) + ); + } + } + } + if (get_class() === get_called_class()) { + $directory = dirname(__FILE__); + foreach (scandir($directory) as $dirEntry) { + $classNameMatch = []; + if (preg_match('/(.*)\.php$/', $dirEntry, $classNameMatch)) { + $className = $classNameMatch[1]; + include_once($directory . DIRECTORY_SEPARATOR . $dirEntry); + if ($className != get_class() + && is_a($className, get_class(), TRUE)) { + $class = new $className(); + $class->init(NULL); + } + } + } + } + } + + protected static $_handlers = []; + private function _registerEventHandler($event, $handler) { + if (!isset(self::$_handlers[$event])) { + self::$_handlers[$event] = []; + } + self::$_handlers[$event][] = $handler; + } + + public function raiseApplicationEvent($event, ...$params) { + if (isset(self::$_handlers[$event])) { + foreach (self::$_handlers[$event] as $handler) { + call_user_func_array($handler, $params); + } + } + } + +} + +?> |