public function MigrationPluginManager::buildDependencyMigration in Drupal 8
Same name and namespace in other branches
- 9 core/modules/migrate/src/Plugin/MigrationPluginManager.php \Drupal\migrate\Plugin\MigrationPluginManager::buildDependencyMigration()
Builds a dependency tree for the migrations and set their order.
Parameters
\Drupal\migrate\Plugin\MigrationInterface[] $migrations: Array of loaded migrations with their declared dependencies.
array $dynamic_ids: Keys are dynamic ids (for example node:*) values are a list of loaded migration ids (for example node:page, node:article).
Return value
array An array of migrations.
Overrides MigrateBuildDependencyInterface::buildDependencyMigration
1 call to MigrationPluginManager::buildDependencyMigration()
- MigrationPluginManager::createInstances in core/
modules/ migrate/ src/ Plugin/ MigrationPluginManager.php - Create pre-configured instance of plugin derivatives.
File
- core/
modules/ migrate/ src/ Plugin/ MigrationPluginManager.php, line 166
Class
- MigrationPluginManager
- Plugin manager for migration plugins.
Namespace
Drupal\migrate\PluginCode
public function buildDependencyMigration(array $migrations, array $dynamic_ids) {
// Migration dependencies can be optional or required. If an optional
// dependency does not run, the current migration is still OK to go. Both
// optional and required dependencies (if run at all) must run before the
// current migration.
$dependency_graph = [];
$required_dependency_graph = [];
$have_optional = FALSE;
foreach ($migrations as $migration) {
/** @var \Drupal\migrate\Plugin\MigrationInterface $migration */
$id = $migration
->id();
$requirements[$id] = [];
$dependency_graph[$id]['edges'] = [];
$migration_dependencies = $migration
->getMigrationDependencies();
if (isset($migration_dependencies['required'])) {
foreach ($migration_dependencies['required'] as $dependency) {
if (!isset($dynamic_ids[$dependency])) {
$this
->addDependency($required_dependency_graph, $id, $dependency, $dynamic_ids);
}
$this
->addDependency($dependency_graph, $id, $dependency, $dynamic_ids);
}
}
if (!empty($migration_dependencies['optional'])) {
foreach ($migration_dependencies['optional'] as $dependency) {
$this
->addDependency($dependency_graph, $id, $dependency, $dynamic_ids);
}
$have_optional = TRUE;
}
}
$dependency_graph = (new Graph($dependency_graph))
->searchAndSort();
if ($have_optional) {
$required_dependency_graph = (new Graph($required_dependency_graph))
->searchAndSort();
}
else {
$required_dependency_graph = $dependency_graph;
}
$weights = [];
foreach ($migrations as $migration_id => $migration) {
// Populate a weights array to use with array_multisort() later.
$weights[] = $dependency_graph[$migration_id]['weight'];
if (!empty($required_dependency_graph[$migration_id]['paths'])) {
$migration
->set('requirements', $required_dependency_graph[$migration_id]['paths']);
}
}
// Sort weights, labels, and keys in the same order as each other.
array_multisort($weights, SORT_DESC, SORT_NUMERIC, array_keys($migrations), SORT_ASC, SORT_NATURAL, $migrations);
return $migrations;
}