Skip to content

Commit

Permalink
Event namespaces respect class inheritance [Closes #55]
Browse files Browse the repository at this point in the history
  • Loading branch information
JanTvrdik authored and fprochazka committed Dec 13, 2014
1 parent fb1c18f commit aac2f87
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 2 deletions.
21 changes: 20 additions & 1 deletion src/Kdyby/Events/DI/EventsExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ protected function bindEventProperties(Nette\DI\ServiceDefinition $def, Nette\Re

$def->addSetup('$' . $name, array(
new Nette\DI\Statement($this->prefix('@manager') . '::createEvent', array(
array($property->getDeclaringClass()->getName(), $name),
array($class->getName(), $name),
new Code\PhpLiteral('$service->' . $name)
))
));
Expand All @@ -341,10 +341,29 @@ private function optimizeListeners(Nette\DI\ContainerBuilder $builder)
$listeners[$eventName][] = $serviceName;
if ($namespace !== NULL) {
$listeners[$event][] = $serviceName;

if (!class_exists($namespace)) {
continue; // it might not even be a "classname" event namespace
}

// find all subclasses and register the listener to all the classes dispatching them
foreach ($builder->getDefinitions() as $def) {
if (!$class = $def->getClass()) {
continue; // ignore unresolved classes
}

if (is_subclass_of($class, $namespace)) {
$listeners["$class::$event"][] = $serviceName;
}
}
}
}
}

foreach ($listeners as $id => $subscribers) {
$listeners[$id] = array_unique($subscribers);
}

$builder->getDefinition($this->prefix('manager'))
->setClass('Kdyby\Events\LazyEventManager', array($listeners))
->setup = $this->allowedManagerSetup;
Expand Down
9 changes: 8 additions & 1 deletion src/Kdyby/Events/EventManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,14 @@ private function sortListeners($eventName)
}

} else {
$available = !empty($this->listeners[$event][$namespace]) ? $this->listeners[$event][$namespace] : array();
$available = array();
do {
if (!empty($this->listeners[$event][$namespace])) {
foreach ($this->listeners[$event][$namespace] as $callback) {
$available[] = $callback;
}
}
} while ($namespace = get_parent_class($namespace));
}

if (empty($available)) {
Expand Down

0 comments on commit aac2f87

Please sign in to comment.