class Finder

Same name and namespace in other branches
  1. 11.x core/lib/Drupal/Core/DefaultContent/Finder.php \Drupal\Core\DefaultContent\Finder

Finds all default content in a directory, in dependency order.

@internal This API is experimental.

Hierarchy

  • class \Drupal\Core\DefaultContent\Finder

Expanded class hierarchy of Finder

4 files declare their use of Finder
ContentImportTest.php in core/tests/Drupal/FunctionalTests/DefaultContent/ContentImportTest.php
FinderTest.php in core/tests/Drupal/Tests/Core/DefaultContent/FinderTest.php
Recipe.php in core/lib/Drupal/Core/Recipe/Recipe.php
RecipeRunner.php in core/lib/Drupal/Core/Recipe/RecipeRunner.php

File

core/lib/Drupal/Core/DefaultContent/Finder.php, line 19

Namespace

Drupal\Core\DefaultContent
View source
final class Finder {
  
  /**
   * The content entity data to import, in dependency order, keyed by entity UUID.
   *
   * @var array<string, array<mixed>>
   */
  public readonly array $data;
  public function __construct(string $path) {
    try {
      // Scan for all YAML files in the content directory.
      $finder = SymfonyFinder::create()->in($path)
        ->files()
        ->name('*.yml');
    } catch (DirectoryNotFoundException) {
      $this->data = [];
      return;
    }
    $graph = $files = [];
    /** @var \Symfony\Component\Finder\SplFileInfo $file */
    foreach ($finder as $file) {
      /** @var array{_meta: array{uuid: string|null, depends: array<string, string>|null}} $decoded */
      $decoded = Yaml::decode($file->getContents());
      $decoded['_meta']['path'] = $file->getPathname();
      $uuid = $decoded['_meta']['uuid'] ?? throw new ImportException($decoded['_meta']['path'] . ' does not have a UUID.');
      $files[$uuid] = $decoded;
      // For the graph to work correctly, every entity must be mentioned in it.
      // This is inspired by
      // \Drupal\Core\Config\Entity\ConfigDependencyManager::getGraph().
      $graph += [
        $uuid => [
          'edges' => [],
          'uuid' => $uuid,
        ],
      ];
      foreach ($decoded['_meta']['depends'] ?? [] as $dependency_uuid => $entity_type) {
        $graph[$dependency_uuid]['edges'][$uuid] = TRUE;
        $graph[$dependency_uuid]['uuid'] = $dependency_uuid;
      }
    }
    ksort($graph);
    // Sort the dependency graph. The entities that are dependencies of other
    // entities should come first.
    $graph_object = new Graph($graph);
    $sorted = $graph_object->searchAndSort();
    uasort($sorted, SortArray::sortByWeightElement(...));
    $entities = [];
    foreach ($sorted as [
      'uuid' => $uuid,
    ]) {
      if (array_key_exists($uuid, $files)) {
        $entities[$uuid] = $files[$uuid];
      }
    }
    $this->data = $entities;
  }

}

Members

Title Sort descending Modifiers Object type Summary
Finder::$data public property The content entity data to import, in dependency order, keyed by entity UUID.
Finder::__construct public function

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.