public static forModules ( |
||
$modules | The modules to load. | |
Результат | static | The created override graph. |
public static function forModules(ModuleList $modules)
{
$graph = new static($modules->getModuleNames());
foreach ($modules as $module) {
if (null === $module->getModuleFile()) {
continue;
}
foreach ($module->getModuleFile()->getDependencies() as $dependency) {
if ($graph->hasModuleName($dependency)) {
$graph->addDependency($module->getName(), $dependency);
}
}
}
// Do we have a root module?
if (null === $modules->getRootModule()) {
return $graph;
}
// Make sure we have numeric, ascending keys here
$moduleOrder = array_values($modules->getRootModule()->getModuleFile()->getModuleOrder());
// Each module overrides the previous one in the list
for ($i = 1, $l = count($moduleOrder); $i < $l; ++$i) {
$dependency = $moduleOrder[$i - 1];
$moduleName = $moduleOrder[$i];
if ($graph->hasModuleName($dependency)) {
$graph->addDependency($moduleName, $dependency);
}
}
return $graph;
}
/** * Adds the getModuleOrder() method. * * @param Clazz $class The factory class model. */ public function addGetModuleOrderMethod(Clazz $class) { $class->addImport(new Import('Puli\\Discovery\\Api\\Discovery')); $class->addImport(new Import('Puli\\Manager\\Api\\Server\\ServerCollection')); $class->addImport(new Import('Puli\\UrlGenerator\\Api\\UrlGenerator')); $class->addImport(new Import('Puli\\UrlGenerator\\DiscoveryUrlGenerator')); $class->addImport(new Import('RuntimeException')); $method = new Method('getModuleOrder'); $method->setDescription("Returns the order in which the installed modules should be loaded\naccording to the override statements."); $method->setReturnValue(new ReturnValue('$order', 'string[]', 'The sorted module names.')); $moduleOrderString = ''; if (count($this->modules) > 0) { $overrideGraph = DependencyGraph::forModules($this->modules); foreach ($overrideGraph->getSortedModuleNames() as $moduleName) { $moduleOrderString .= sprintf("\n %s,", var_export($moduleName, true)); } $moduleOrderString .= "\n"; } $method->addBody("\$order = array({$moduleOrderString});"); $class->addMethod($method); }