diff --git a/default_content.services.yml b/default_content.services.yml index 33327a8..1b12a27 100644 --- a/default_content.services.yml +++ b/default_content.services.yml @@ -1,7 +1,11 @@ +parameters: + default_content.link_domain: 'http://drupal.org' services: + default_content.scanner: + class: Drupal\default_content\Scanner default_content.importer: - class: Drupal\default_content\DefaultContentImporter - arguments: ['@serializer', '@plugin.manager.rest', '@entity_type.manager', '@rest.link_manager', '@event_dispatcher'] + class: Drupal\default_content\Importer + arguments: ['@serializer', '@plugin.manager.rest', '@entity_type.manager', '@rest.link_manager', '@event_dispatcher', '@default_content.scanner', '%default_content.link_domain%'] default_content.exporter: - class: Drupal\default_content\DefaultContentExporter - arguments: ['@serializer', '@entity_type.manager', '@entity.repository', '@rest.link_manager', '@event_dispatcher', '@module_handler', '@info_parser'] + class: Drupal\default_content\Exporter + arguments: ['@serializer', '@entity_type.manager', '@entity.repository', '@rest.link_manager', '@event_dispatcher', '@module_handler', '@info_parser', '%default_content.link_domain%'] diff --git a/src/DefaultContentExporter.php b/src/DefaultContentExporter.php index a96490d..1afd30b 100644 --- a/src/DefaultContentExporter.php +++ b/src/DefaultContentExporter.php @@ -19,12 +19,14 @@ use Symfony\Component\Serializer\Serializer; * * @todo throw useful exceptions */ -class DefaultContentExporter implements DefaultContentExporterInterface { +class Exporter implements ExporterInterface { /** * Defines relation domain URI for entity links. + * + * @var string */ - const LINK_DOMAIN = 'http://drupal.org'; + protected $linkDomain; /** * The serializer service. @@ -92,8 +94,10 @@ class DefaultContentExporter implements DefaultContentExporterInterface { * The module handler. * @param \Drupal\Core\Extension\InfoParserInterface $info_parser * The info file parser. + * @param string $link_domain + * Defines relation domain URI for entity links. */ - public function __construct(Serializer $serializer, EntityTypeManagerInterface $entity_type_manager, EntityRepositoryInterface $entity_repository, LinkManagerInterface $link_manager, EventDispatcherInterface $event_dispatcher, ModuleHandlerInterface $module_handler, InfoParserInterface $info_parser) { + public function __construct(Serializer $serializer, EntityTypeManagerInterface $entity_type_manager, EntityRepositoryInterface $entity_repository, LinkManagerInterface $link_manager, EventDispatcherInterface $event_dispatcher, ModuleHandlerInterface $module_handler, InfoParserInterface $info_parser, $link_domain) { $this->serializer = $serializer; $this->entityTypeManager = $entity_type_manager; $this->entityRepository = $entity_repository; @@ -101,6 +105,7 @@ class DefaultContentExporter implements DefaultContentExporterInterface { $this->eventDispatcher = $event_dispatcher; $this->moduleHandler = $module_handler; $this->infoParser = $info_parser; + $this->linkDomain = $link_domain; } /** @@ -110,7 +115,7 @@ class DefaultContentExporter implements DefaultContentExporterInterface { $storage = $this->entityTypeManager->getStorage($entity_type_id); $entity = $storage->load($entity_id); - $this->linkManager->setLinkDomain(static::LINK_DOMAIN); + $this->linkManager->setLinkDomain($this->linkDomain); $return = $this->serializer->serialize($entity, 'hal_json', ['json_encode_options' => JSON_PRETTY_PRINT]); // Reset link domain. $this->linkManager->setLinkDomain(FALSE); @@ -137,7 +142,7 @@ class DefaultContentExporter implements DefaultContentExporterInterface { $entities = $this->getEntityReferencesRecursive($entity, 0, $entities); $serialized_entities_per_type = []; - $this->linkManager->setLinkDomain(static::LINK_DOMAIN); + $this->linkManager->setLinkDomain($this->linkDomain); // Serialize all entities and key them by entity TYPE and uuid. foreach ($entities as $entity) { $serialized_entities_per_type[$entity->getEntityTypeId()][$entity->uuid()] = $this->serializer->serialize($entity, 'hal_json', ['json_encode_options' => JSON_PRETTY_PRINT]); @@ -173,14 +178,38 @@ class DefaultContentExporter implements DefaultContentExporterInterface { foreach ($serialized_by_type as $entity_type => $serialized_entities) { // Ensure that the folder per entity type exists. $entity_type_folder = "$folder/$entity_type"; - file_prepare_directory($entity_type_folder, FILE_CREATE_DIRECTORY); + $this->prepareDirectory($entity_type_folder); foreach ($serialized_entities as $uuid => $serialized_entity) { - file_put_contents($entity_type_folder . '/' . $uuid . '.json', $serialized_entity); + $this->putFile($entity_type_folder, $uuid, $serialized_entity); } } } /** + * Helper for ::writeDefaultContent to wrap file_prepare_directory(); + * + * @param string $path + * Content directory + entity directory to prepare. + */ + protected function prepareDirectory($path) { + file_prepare_directory($path, FILE_CREATE_DIRECTORY); + } + + /** + * Helper for ::writeDefaultContent to wrap file_put_contents + * + * @param string $path + * Content directory + entity directory to which to write the file. + * @param string $uuid + * Entity UUID, to be used as filename. + * @param string $serialized_entity + * The serialized entity to write. + */ + protected function putFile($path, $uuid, $serialized_entity) { + file_put_contents($entity_type_folder . '/' . $uuid . '.json', $serialized_entity); + } + + /** * Returns all referenced entities of an entity. * * This method is also recursive to support use-cases like a node -> media diff --git a/src/DefaultContentExporterInterface.php b/src/DefaultContentExporterInterface.php index 8237df3..7f2d94d 100644 --- a/src/DefaultContentExporterInterface.php +++ b/src/DefaultContentExporterInterface.php @@ -5,7 +5,7 @@ namespace Drupal\default_content; /** * An interface defining a default content exporter. */ -interface DefaultContentExporterInterface { +interface ExporterInterface { /** * Exports a single entity as importContent expects it. diff --git a/src/DefaultContentImporter.php b/src/DefaultContentImporter.php index 886d920..2acaa3e 100644 --- a/src/DefaultContentImporter.php +++ b/src/DefaultContentImporter.php @@ -18,12 +18,14 @@ use Symfony\Component\Serializer\Serializer; * * @todo throw useful exceptions */ -class DefaultContentImporter implements DefaultContentImporterInterface { +class Importer implements ImporterInterface { /** * Defines relation domain URI for entity links. + * + * @var string */ - const LINK_DOMAIN = 'http://drupal.org'; + protected $linkDomain; /** * The serializer service. @@ -75,6 +77,13 @@ class DefaultContentImporter implements DefaultContentImporterInterface { protected $eventDispatcher; /** + * The file system scanner. + * + * @var \Drupal\default_content\DefaultContentScannerInterface + */ + protected $scanner; + + /** * Constructs the default content manager. * * @param \Symfony\Component\Serializer\Serializer $serializer @@ -87,13 +96,19 @@ class DefaultContentImporter implements DefaultContentImporterInterface { * The link manager service. * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher * The event dispatcher. + * @param \Drupal\default_content\DefaultContentScannerInterface $scanner + * The file scanner. + * @param string $link_domain + * Defines relation domain URI for entity links. */ - public function __construct(Serializer $serializer, ResourcePluginManager $resource_plugin_manager, EntityTypeManagerInterface $entity_type_manager, LinkManagerInterface $link_manager, EventDispatcherInterface $event_dispatcher) { + public function __construct(Serializer $serializer, ResourcePluginManager $resource_plugin_manager, EntityTypeManagerInterface $entity_type_manager, LinkManagerInterface $link_manager, EventDispatcherInterface $event_dispatcher, DefaultContentScannerInterface $scanner, $link_domain) { $this->serializer = $serializer; $this->resourcePluginManager = $resource_plugin_manager; $this->entityTypeManager = $entity_type_manager; $this->linkManager = $link_manager; $this->eventDispatcher = $event_dispatcher; + $this->scanner = $scanner; + $this->linkDomain = $link_domain; } /** @@ -114,10 +129,10 @@ class DefaultContentImporter implements DefaultContentImporterInterface { if (!file_exists($folder . '/' . $entity_type_id)) { continue; } - $files = DefaultContentScanner::scan($folder . '/' . $entity_type_id); + $files = $this->scanner->scan($folder . '/' . $entity_type_id); // Default content uses drupal.org as domain. // @todo Make this use a uri like default-content:. - $this->linkManager->setLinkDomain(static::LINK_DOMAIN); + $this->linkManager->setLinkDomain($this->linkDomain); // Parse all of the files and sort them in order of dependency. foreach ($files as $file) { $contents = $this->parseFile($file); diff --git a/src/DefaultContentImporterInterface.php b/src/DefaultContentImporterInterface.php index bedf245..0d300a3 100644 --- a/src/DefaultContentImporterInterface.php +++ b/src/DefaultContentImporterInterface.php @@ -5,7 +5,7 @@ namespace Drupal\default_content; /** * An interface defining a default content importer. */ -interface DefaultContentImporterInterface { +interface ImporterInterface { /** * Imports default content from a given module. diff --git a/src/DefaultContentScanner.php b/src/DefaultContentScanner.php index b1bd000..f1092eb 100644 --- a/src/DefaultContentScanner.php +++ b/src/DefaultContentScanner.php @@ -5,18 +5,12 @@ namespace Drupal\default_content; /** * A scanner to find YAML files in a given folder. */ -class DefaultContentScanner { +class Scanner implements ScannerInterface { /** - * Returns a list of file objects. - * - * @param string $directory - * Absolute path to the directory to search. - * - * @return object[] - * List of stdClass objects with name and uri properties. + * {@inheritdoc} */ - public static function scan($directory) { + public function scan($directory) { // Use Unix paths regardless of platform, skip dot directories, follow // symlinks (to allow extensions to be linked from elsewhere), and return // the RecursiveDirectoryIterator instance to have access to getSubPath(), diff --git a/src/DefaultContentScannerInterface.php b/src/DefaultContentScannerInterface.php new file mode 100644 index 0000000..7e88d62 --- /dev/null +++ b/src/DefaultContentScannerInterface.php @@ -0,0 +1,21 @@ +setLinkDomain(DefaultContentExporter::LINK_DOMAIN); + ->setLinkDomain($this->container->getParameter('default_content.link_domain')); $expected = $serializer->serialize($term, 'hal_json', ['json_encode_options' => JSON_PRETTY_PRINT]); $exported = $this->exporter->exportContent('taxonomy_term', $term->id()); @@ -115,7 +115,7 @@ class DefaultContentExporterIntegrationTest extends KernelTestBase { /** @var \Symfony\Component\Serializer\Serializer $serializer */ $serializer = \Drupal::service('serializer'); \Drupal::service('rest.link_manager') - ->setLinkDomain(DefaultContentExporter::LINK_DOMAIN); + ->setLinkDomain($this->container->getParameter('default_content.link_domain')); $expected_node = $serializer->serialize($node, 'hal_json', ['json_encode_options' => JSON_PRETTY_PRINT]); $expected_user = $serializer->serialize($user, 'hal_json', ['json_encode_options' => JSON_PRETTY_PRINT]); @@ -179,7 +179,7 @@ class DefaultContentExporterIntegrationTest extends KernelTestBase { $node = Node::load($node->id()); $serializer = \Drupal::service('serializer'); \Drupal::service('rest.link_manager') - ->setLinkDomain(DefaultContentExporter::LINK_DOMAIN); + ->setLinkDomain($this->container->getParameter('default_content.link_domain')); $expected_node = $serializer->serialize($node, 'hal_json', ['json_encode_options' => JSON_PRETTY_PRINT]); $content = $this->exporter->exportModuleContent('default_content_export_test');