class FileStorage in Zircon Profile 8
Same name in this branch
- 8 core/modules/file/src/FileStorage.php \Drupal\file\FileStorage
- 8 core/lib/Drupal/Core/Config/FileStorage.php \Drupal\Core\Config\FileStorage
- 8 core/lib/Drupal/Component/PhpStorage/FileStorage.php \Drupal\Component\PhpStorage\FileStorage
Same name and namespace in other branches
- 8.0 core/lib/Drupal/Core/Config/FileStorage.php \Drupal\Core\Config\FileStorage
Defines the file storage.
Hierarchy
- class \Drupal\Core\Config\FileStorage implements StorageInterface
Expanded class hierarchy of FileStorage
9 files declare their use of FileStorage
- CachedStorageTest.php in core/
modules/ config/ src/ Tests/ Storage/ CachedStorageTest.php - Contains \Drupal\config\Tests\Storage\CachedStorageTest.
- ConfigAfterInstallerTestBase.php in core/
modules/ system/ src/ Tests/ Installer/ ConfigAfterInstallerTestBase.php - Contains \Drupal\system\Tests\Installer\ConfigAfterInstallerTestBase.
- ConfigFileContentTest.php in core/
modules/ config/ src/ Tests/ ConfigFileContentTest.php - Contains \Drupal\config\Tests\ConfigFileContentTest.
- ConfigInstallProfileOverrideTest.php in core/
modules/ config/ src/ Tests/ ConfigInstallProfileOverrideTest.php - Contains \Drupal\config\Tests\ConfigInstallProfileOverrideTest.
- ConfigSchemaTest.php in core/
modules/ config/ src/ Tests/ ConfigSchemaTest.php - Contains \Drupal\config\Tests\ConfigSchemaTest.
1 string reference to 'FileStorage'
- core.services.yml in core/
core.services.yml - core/core.services.yml
1 service uses FileStorage
File
- core/
lib/ Drupal/ Core/ Config/ FileStorage.php, line 16 - Contains \Drupal\Core\Config\FileStorage.
Namespace
Drupal\Core\ConfigView source
class FileStorage implements StorageInterface {
/**
* The storage collection.
*
* @var string
*/
protected $collection;
/**
* The filesystem path for configuration objects.
*
* @var string
*/
protected $directory = '';
/**
* Constructs a new FileStorage.
*
* @param string $directory
* A directory path to use for reading and writing of configuration files.
* @param string $collection
* (optional) The collection to store configuration in. Defaults to the
* default collection.
*/
public function __construct($directory, $collection = StorageInterface::DEFAULT_COLLECTION) {
$this->directory = $directory;
$this->collection = $collection;
}
/**
* Returns the path to the configuration file.
*
* @return string
* The path to the configuration file.
*/
public function getFilePath($name) {
return $this
->getCollectionDirectory() . '/' . $name . '.' . static::getFileExtension();
}
/**
* Returns the file extension used by the file storage for all configuration files.
*
* @return string
* The file extension.
*/
public static function getFileExtension() {
return 'yml';
}
/**
* Check if the directory exists and create it if not.
*/
protected function ensureStorage() {
$dir = $this
->getCollectionDirectory();
$success = file_prepare_directory($dir, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS);
// Only create .htaccess file in root directory.
if ($dir == $this->directory) {
$success = $success && file_save_htaccess($this->directory, TRUE, TRUE);
}
if (!$success) {
throw new StorageException('Failed to create config directory ' . $dir);
}
return $this;
}
/**
* {@inheritdoc}
*/
public function exists($name) {
return file_exists($this
->getFilePath($name));
}
/**
* Implements Drupal\Core\Config\StorageInterface::read().
*
* @throws \Drupal\Core\Config\UnsupportedDataTypeConfigException
*/
public function read($name) {
if (!$this
->exists($name)) {
return FALSE;
}
$data = file_get_contents($this
->getFilePath($name));
try {
$data = $this
->decode($data);
} catch (InvalidDataTypeException $e) {
throw new UnsupportedDataTypeConfigException("Invalid data type in config {$name}: {$e->getMessage()}");
}
return $data;
}
/**
* {@inheritdoc}
*/
public function readMultiple(array $names) {
$list = array();
foreach ($names as $name) {
if ($data = $this
->read($name)) {
$list[$name] = $data;
}
}
return $list;
}
/**
* {@inheritdoc}
*/
public function write($name, array $data) {
try {
$data = $this
->encode($data);
} catch (InvalidDataTypeException $e) {
throw new StorageException("Invalid data type in config {$name}: {$e->getMessage()}");
}
$target = $this
->getFilePath($name);
$status = @file_put_contents($target, $data);
if ($status === FALSE) {
// Try to make sure the directory exists and try writing again.
$this
->ensureStorage();
$status = @file_put_contents($target, $data);
}
if ($status === FALSE) {
throw new StorageException('Failed to write configuration file: ' . $this
->getFilePath($name));
}
else {
drupal_chmod($target);
}
return TRUE;
}
/**
* {@inheritdoc}
*/
public function delete($name) {
if (!$this
->exists($name)) {
$dir = $this
->getCollectionDirectory();
if (!file_exists($dir)) {
throw new StorageException($dir . '/ not found.');
}
return FALSE;
}
return drupal_unlink($this
->getFilePath($name));
}
/**
* {@inheritdoc}
*/
public function rename($name, $new_name) {
$status = @rename($this
->getFilePath($name), $this
->getFilePath($new_name));
if ($status === FALSE) {
throw new StorageException('Failed to rename configuration file from: ' . $this
->getFilePath($name) . ' to: ' . $this
->getFilePath($new_name));
}
return TRUE;
}
/**
* {@inheritdoc}
*/
public function encode($data) {
return Yaml::encode($data);
}
/**
* {@inheritdoc}
*/
public function decode($raw) {
$data = Yaml::decode($raw);
// A simple string is valid YAML for any reason.
if (!is_array($data)) {
return FALSE;
}
return $data;
}
/**
* {@inheritdoc}
*/
public function listAll($prefix = '') {
$dir = $this
->getCollectionDirectory();
if (!is_dir($dir)) {
return array();
}
$extension = '.' . static::getFileExtension();
// glob() directly calls into libc glob(), which is not aware of PHP stream
// wrappers. Same for \GlobIterator (which additionally requires an absolute
// realpath() on Windows).
// @see https://github.com/mikey179/vfsStream/issues/2
$files = scandir($dir);
$names = array();
foreach ($files as $file) {
if ($file[0] !== '.' && fnmatch($prefix . '*' . $extension, $file)) {
$names[] = basename($file, $extension);
}
}
return $names;
}
/**
* {@inheritdoc}
*/
public function deleteAll($prefix = '') {
$success = TRUE;
$files = $this
->listAll($prefix);
foreach ($files as $name) {
if (!$this
->delete($name) && $success) {
$success = FALSE;
}
}
if ($success && $this->collection != StorageInterface::DEFAULT_COLLECTION) {
// Remove empty directories.
if (!(new \FilesystemIterator($this
->getCollectionDirectory()))
->valid()) {
drupal_rmdir($this
->getCollectionDirectory());
}
}
return $success;
}
/**
* {@inheritdoc}
*/
public function createCollection($collection) {
return new static($this->directory, $collection);
}
/**
* {@inheritdoc}
*/
public function getCollectionName() {
return $this->collection;
}
/**
* {@inheritdoc}
*/
public function getAllCollectionNames() {
$collections = $this
->getAllCollectionNamesHelper($this->directory);
sort($collections);
return $collections;
}
/**
* Helper function for getAllCollectionNames().
*
* If the file storage has the following subdirectory structure:
* ./another_collection/one
* ./another_collection/two
* ./collection/sub/one
* ./collection/sub/two
* this function will return:
* @code
* array(
* 'another_collection.one',
* 'another_collection.two',
* 'collection.sub.one',
* 'collection.sub.two',
* );
* @endcode
*
* @param string $directory
* The directory to check for sub directories. This allows this
* function to be used recursively to discover all the collections in the
* storage.
*
* @return array
* A list of collection names contained within the provided directory.
*/
protected function getAllCollectionNamesHelper($directory) {
$collections = array();
foreach (new \DirectoryIterator($directory) as $fileinfo) {
if ($fileinfo
->isDir() && !$fileinfo
->isDot()) {
$collection = $fileinfo
->getFilename();
// Recursively call getAllCollectionNamesHelper() to discover if there
// are subdirectories. Subdirectories represent a dotted collection
// name.
$sub_collections = $this
->getAllCollectionNamesHelper($directory . '/' . $collection);
if (!empty($sub_collections)) {
// Build up the collection name by concatenating the subdirectory
// names with the current directory name.
foreach ($sub_collections as $sub_collection) {
$collections[] = $collection . '.' . $sub_collection;
}
}
// Check that the collection is valid by searching it for configuration
// objects. A directory without any configuration objects is not a valid
// collection.
// @see \Drupal\Core\Config\FileStorage::listAll()
foreach (scandir($directory . '/' . $collection) as $file) {
if ($file[0] !== '.' && fnmatch('*.' . $this
->getFileExtension(), $file)) {
$collections[] = $collection;
break;
}
}
}
}
return $collections;
}
/**
* Gets the directory for the collection.
*
* @return string
* The directory for the collection.
*/
protected function getCollectionDirectory() {
if ($this->collection == StorageInterface::DEFAULT_COLLECTION) {
$dir = $this->directory;
}
else {
$dir = $this->directory . '/' . str_replace('.', '/', $this->collection);
}
return $dir;
}
}
Members
Name | Modifiers | Type | Description | Overrides |
---|---|---|---|---|
FileStorage:: |
protected | property | The storage collection. | |
FileStorage:: |
protected | property | The filesystem path for configuration objects. | 1 |
FileStorage:: |
public | function |
Creates a collection on the storage. Overrides StorageInterface:: |
1 |
FileStorage:: |
public | function |
Decodes configuration data from the storage-specific format. Overrides StorageInterface:: |
|
FileStorage:: |
public | function |
Deletes a configuration object from the storage. Overrides StorageInterface:: |
2 |
FileStorage:: |
public | function |
Deletes configuration objects whose names start with a given prefix. Overrides StorageInterface:: |
1 |
FileStorage:: |
public | function |
Encodes configuration data into the storage-specific format. Overrides StorageInterface:: |
|
FileStorage:: |
protected | function | Check if the directory exists and create it if not. | |
FileStorage:: |
public | function |
Returns whether a configuration object exists. Overrides StorageInterface:: |
2 |
FileStorage:: |
public | function |
Gets the existing collections. Overrides StorageInterface:: |
|
FileStorage:: |
protected | function | Helper function for getAllCollectionNames(). | |
FileStorage:: |
protected | function | Gets the directory for the collection. | |
FileStorage:: |
public | function |
Gets the name of the current collection the storage is using. Overrides StorageInterface:: |
|
FileStorage:: |
public static | function | Returns the file extension used by the file storage for all configuration files. | |
FileStorage:: |
public | function | Returns the path to the configuration file. | 1 |
FileStorage:: |
public | function |
Gets configuration object names starting with a given prefix. Overrides StorageInterface:: |
1 |
FileStorage:: |
public | function |
Implements Drupal\Core\Config\StorageInterface::read(). Overrides StorageInterface:: |
|
FileStorage:: |
public | function |
Reads configuration data from the storage. Overrides StorageInterface:: |
|
FileStorage:: |
public | function |
Renames a configuration object in the storage. Overrides StorageInterface:: |
1 |
FileStorage:: |
public | function |
Writes configuration data to the storage. Overrides StorageInterface:: |
1 |
FileStorage:: |
public | function | Constructs a new FileStorage. | 2 |
StorageInterface:: |
constant | The default collection name. |