Вставьте файл в определенный каталог / узел, используя vfsStream

Вариант использования 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 каталог?

2

Решение

Да, видимо можно добавить ребенка в 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());
1

Другие решения

Ответ был дан на GitHub; таким образом, вместо

->at($root)

надо использовать

->at($root->getChild('path/to/some/dir')).
0

По вопросам рекламы [email protected]