Вариант использования vfsStream как следует:
$directories = explode('/', 'path/to/some/dir');
$structure = [];
$reference =& $structure;
foreach ($directories as $directory) {
$reference[$directory] = [];
$reference =& $reference[$directory];
}
vfsStream::setup();
$root = vfsStream::create($structure);
$file = vfsStream::newFile('file')
->at($root) //should changes be introduced here?
->setContent($content = 'Some content here');
Выход из vfsStream::inspect(new vfsStreamStructureVisitor())->getStructure()
является
Array
(
[root] => Array
(
[path] => Array
(
[to] => Array
(
[some] => Array
(
[dir] => Array
(
)
)
)
)
[file] => Some content here
)
)
Можно ли вставить файл в конкретный каталог, например, под dir
каталог?
Да, видимо можно добавить ребенка в vfsStreamFirectory
с addChild()
метод:
Однако я не нашел простого метода в API Документы которые позволяют легко обходить структуру для добавления контента. Вот это ужасное занятие для этого конкретного случая, он потерпит неудачу, если, например, в каждом элементе пути будет более одной папки.
По сути, мы должны рекурсивно проходить через каждый уровень, проверять, является ли имя тем, к которому мы хотим добавить файл, а затем добавлять его, когда он найден.
use org\bovigo\vfs\vfsStream;
use org\bovigo\vfs\vfsStreamDirectory;
use org\bovigo\vfs\visitor\vfsStreamStructureVisitor;
$directories = explode('/', 'path/to/some/dir');
$structure = [];
$reference =& $structure;
foreach ($directories as $directory) {
$reference[$directory] = [];
$reference =& $reference[$directory];
}
vfsStream::setup();
$root = vfsStream::create($structure);
$file = vfsStream::newFile('file')
->setContent($content = 'Some content here');
$elem = $root;
while ($elem instanceof vfsStreamDirectory)
{
if ($elem->getName() === 'dir')
{
$elem->addChild($file);
}
$children = $elem = $elem->getChildren();
if (!isset($children[0]))
{
break;
}
$elem = $children[0];
}
print_r(vfsStream::inspect(new vfsStreamStructureVisitor())->getStructure());
Ответ был дан на GitHub; таким образом, вместо
->at($root)
надо использовать
->at($root->getChild('path/to/some/dir')).