FeaturesAssignmentForwardDependency.php in Features 8.3        
                          
                  
                        
  
  
  
  
File
  src/Plugin/FeaturesAssignment/FeaturesAssignmentForwardDependency.php
  
    View source  
  <?php
namespace Drupal\features\Plugin\FeaturesAssignment;
use Drupal\Component\Graph\Graph;
use Drupal\features\FeaturesAssignmentMethodBase;
class FeaturesAssignmentForwardDependency extends FeaturesAssignmentMethodBase {
  
  public function assignPackages($force = FALSE) {
    $config_collection = $this->featuresManager
      ->getConfigCollection();
    $ordered = $this
      ->dependencyOrder($config_collection);
    foreach ($ordered as $name) {
      $item = $config_collection[$name];
      if ($item
        ->getPackage()) {
        
        continue;
      }
      
      $dependent_packages = [];
      foreach ($item
        ->getDependents() as $dependent) {
        if (isset($config_collection[$dependent])) {
          if ($package = $config_collection[$dependent]
            ->getPackage()) {
            $dependent_packages[$package] = $package;
          }
        }
      }
      
      if (count($dependent_packages) == 1) {
        $package = key($dependent_packages);
        $this->featuresManager
          ->assignConfigPackage($package, [
          $name,
        ]);
      }
    }
  }
  
  protected function dependencyOrder(array $config_collection) {
    
    $graph = [];
    foreach ($config_collection as $config) {
      $graph[$config
        ->getName()] = [];
      foreach ($config
        ->getDependents() as $dependent) {
        $graph[$config
          ->getName()]['edges'][$dependent] = 1;
      }
    }
    $graph_object = new Graph($graph);
    $graph = $graph_object
      ->searchAndSort();
    
    $weights = array_column($graph, 'weight');
    array_multisort($weights, SORT_DESC, $graph);
    return array_keys($graph);
  }
}