Вставьте файл в определенный каталог / узел, используя 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 ответа

Решение

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

->at($root)

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

->at($root->getChild('path/to/some/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());
Другие вопросы по тегам