default_content-2.0.x-dev/src/ContentFileStorage.php
src/ContentFileStorage.php
<?php
namespace Drupal\default_content;
use Drupal\Core\Entity\ContentEntityInterface;
use Drupal\Core\File\FileSystemInterface;
use Drupal\file\FileInterface;
/**
* Finds, reads and writes default content files.
*/
class ContentFileStorage implements ContentFileStorageInterface {
/**
* The filesystem service.
*
* @var \Drupal\Core\File\FileSystemInterface
*/
protected $fileSystem;
/**
* Constructs the content file storage.
*
* @param \Drupal\Core\File\FileSystemInterface $file_system
* The filesystem service.
*/
public function __construct(FileSystemInterface $file_system) {
$this->fileSystem = $file_system;
}
/**
* {@inheritdoc}
*/
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(),
// since SplFileInfo does not support relative paths.
$flags = \FilesystemIterator::UNIX_PATHS;
$flags |= \FilesystemIterator::SKIP_DOTS;
$flags |= \FilesystemIterator::CURRENT_AS_SELF;
$directory_iterator = new \RecursiveDirectoryIterator($directory, $flags);
$iterator = new \RecursiveIteratorIterator($directory_iterator);
$files = [];
foreach ($iterator as $fileinfo) {
/* @var \SplFileInfo $fileinfo */
// Skip directories and non-json/yaml files.
if ($fileinfo->isDir() || ($fileinfo->getExtension() != 'json' && $fileinfo->getExtension() != 'yml')) {
continue;
}
// @todo Use a typed class?
$file = new \stdClass();
$file->name = $fileinfo->getFilename();
$file->uri = $fileinfo->getPathname();
$files[$file->uri] = $file;
}
return $files;
}
/**
* {@inheritdoc}
*/
public function writeEntity(string $folder, string $encoded, ContentEntityInterface $entity, ?string $filename = NULL) {
// Ensure that the folder per entity type exists.
$entity_type_folder = "$folder/" . $entity->getEntityTypeId();
$this->fileSystem->prepareDirectory($entity_type_folder, FileSystemInterface::CREATE_DIRECTORY);
$filename = $filename ?: ($entity->uuid() . '.yml');
file_put_contents($entity_type_folder . '/' . $filename, $encoded);
// For files, copy the file into the same folder.
if ($entity instanceof FileInterface) {
$this->fileSystem->copy($entity->getFileUri(), $entity_type_folder . '/' . $entity->getFilename(), FileSystemInterface::EXISTS_REPLACE);
}
}
}
