contentserialize-8.x-1.x-dev/src/Utility.php
src/Utility.php
<?php namespace Drupal\contentserialize; use Drupal\Core\Entity\ContentEntityInterface; /** * A general helper class for Content Serialization. * * @todo Make this class specific to dependency resolution. */ class Utility { /** * Returns all referenced entities of an entity. * * This method is also recursive to support use-cases like a node -> media * -> file. * * Copied from \Drupal\default_content\Exporter::getEntityReferencesRecursive(). * * @param \Drupal\Core\Entity\ContentEntityInterface $entity * The entity. * @param int $depth * Guard against infinite recursion. * @param \Drupal\Core\Entity\ContentEntityInterface[] $indexed_dependencies * Previously discovered dependencies. * * @return \Drupal\Core\Entity\ContentEntityInterface[] * Keyed array of entities indexed by entity type and ID. */ public static function referencedEntitiesRecursive(ContentEntityInterface $entity, $depth = 0, array &$indexed_dependencies = []) { $entity_dependencies = $entity->referencedEntities(); foreach ($entity_dependencies as $dependent_entity) { // Config entities should not be exported but rather provided by default // config. if (!($dependent_entity instanceof ContentEntityInterface)) { continue; } // Using UUID to keep dependencies unique to prevent recursion. $key = $dependent_entity->uuid(); if (isset($indexed_dependencies[$key])) { // Do not add already indexed dependencies. continue; } $indexed_dependencies[$key] = $dependent_entity; // Build in some support against infinite recursion. if ($depth < 6) { // @todo Make $depth configurable. $indexed_dependencies += static::referencedEntitiesRecursive($dependent_entity, $depth + 1, $indexed_dependencies); } } return $indexed_dependencies; } /** * Yield a flat list of entities and their dependencies. * * @param \Drupal\Core\Entity\ContentEntityInterface[] $entities * The entities to export along with their dependencies. * * @return \Generator|ContentEntityInterface[] */ public static function enumerateEntitiesAndDependencies($entities) { foreach ($entities as $entity) { yield $entity; foreach (static::referencedEntitiesRecursive($entity) as $dependency) { yield $dependency; } } } }