yii\console\controllers\AssetController provides dependency trace in case bundle circular dependency detected

This commit is contained in:
Paul Klimov
2015-04-03 19:22:42 +03:00
parent d8455835ee
commit 378937f8d5
3 changed files with 81 additions and 3 deletions

View File

@ -248,7 +248,7 @@ class AssetController extends Controller
$this->loadDependency($dependencyBundle, $result);
$result[$name] = $dependencyBundle;
} elseif ($result[$name] === false) {
throw new Exception("A circular dependency is detected for bundle '$name'.");
throw new Exception("A circular dependency is detected for bundle '{$name}': " . $this->composeCircularDependencyTrace($name, $result) . ".");
}
}
}
@ -423,9 +423,9 @@ class AssetController extends Controller
$this->registerBundle($bundles, $depend, $registered);
}
unset($registered[$name]);
$registered[$name] = true;
$registered[$name] = $bundle;
} elseif ($registered[$name] === false) {
throw new Exception("A circular dependency is detected for target '$name'.");
throw new Exception("A circular dependency is detected for target '{$name}': " . $this->composeCircularDependencyTrace($name, $registered) . ".");
}
}
@ -756,4 +756,26 @@ EOD;
$config['class'] = get_class($bundle);
return $config;
}
/**
* Composes trace info for bundle circular dependency.
* @param string $circularDependencyName name of the bundle, which have circular dependency
* @param array $registered list of bundles registered while detecting circular dependency.
* @return string bundle circular dependency trace string.
*/
private function composeCircularDependencyTrace($circularDependencyName, array $registered)
{
$dependencyTrace = [];
$startFound = false;
foreach ($registered as $name => $value) {
if ($name === $circularDependencyName) {
$startFound = true;
}
if ($startFound && $value === false) {
$dependencyTrace[] = $name;
}
}
$dependencyTrace[] = $circularDependencyName;
return implode(' -> ', $dependencyTrace);
}
}