Помощник Tree

Помощник Tree

Помощник Tree позволяет вам строить и отображать древоподобные структуры в консоли. Он часто используется для отображения иерархий каталогов, но вы также можете использовать его для отображения любого древоподобного содержания, такого как организационные схемы, деревья категорий продуктов, таксономмй и т.д.

7.3

Класс TreeHelper был представлен в Symfony 7.3.

Отображение дерева

Метод createTree() создает древовидную структуру из массива и возвращает объект Tree, который можно отобразить в консоли.

Отображение дерева из массива

Вы можете построить дерево из массива, передав массив методв createTree() внутри вашей команды консоли:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
namespace App\Command;

use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Helper\TreeHelper;
use Symfony\Component\Console\Helper\TreeNode;
use Symfony\Component\Console\Style\SymfonyStyle;

#[AsCommand(name: 'app:my-command', description: '...')]
class MyCommand
{
    // ...

    public function __invoke(SymfonyStyle $io): int
    {
        $node = TreeNode::fromValues([
            'config/',
            'public/',
            'src/',
            'templates/',
            'tests/',
        ]);

        $tree = TreeHelper::createTree($io, $node);
        $tree->render();

        // ...
    }
}

Этот пример выведет следующее:

1
2
3
4
5
├── config/
├── public/
├── src/
├── templates/
└── tests/

Предоставленное содержание может быть определено многомерным массивом:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$tree = TreeHelper::createTree($io, null, [
    'src' =>  [
        'Command',
        'Controller' => [
            'DefaultController.php',
        ],
        'Kernel.php',
    ],
    'templates' => [
        'base.html.twig',
    ],
]);

$tree->render();

Код выше выведет следующее дерево:

1
2
3
4
5
6
7
├── src
│   ├── Command
│   ├── Controller
│   │   └── DefaultController.php
│   └── Kernel.php
└── templates
    └── base.html.twig

Программное построение дерева

Если вы не знаете элементы дерева заранее, вы можете построить дерево программно, создав новый экземпляр калсса Tree и добавляя к нему узлы:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
use Symfony\Component\Console\Helper\TreeHelper;
use Symfony\Component\Console\Helper\TreeNode;

$root = new TreeNode('my-project/');
// вы можете передать строку напрямую или создать новый объект TreeNode
$root->addChild('src/');
$root->addChild(new TreeNode('templates/'));

// создать вложенные структуры, добавив дочерние узлы к другим узлам
$testsNode = new TreeNode('tests/');
$functionalTestsNode = new TreeNode('Functional/');
$testsNode->addChild($functionalTestsNode);
$root->addChild($testsNode);

$tree = TreeHelper::createTree($io, $root);
$tree->render();

Этот пример выводит:

1
2
3
4
5
my-project/
├── src/
├── templates/
└── tests/
    └── Functional/

Если вы хотите, вы можете построить массив элементов программно, а потом создать и отобразить дерево таким образом:

1
2
$tree = TreeHelper::createTree($io, null, $array);
$tree->render();

Вы также можете построить часть дерева из массива, а потом добавить другие узлы:

1
2
3
4
5
$node = TreeNode::fromValues($array);
$node->addChild('templates');
// ...
$tree = TreeHelper::createTree($io, $node);
$tree->render();

Настройка стиля дерева

Встроенные стили дерева

Помощник дерева предоставляет несколько встроенных стилей, которые вы можете использовать для настройки вывода дерева.

По умолчанию:

1
TreeHelper::createTree($io, $node, [], TreeStyle::default());

Это выводит:

1
2
3
4
5
6
7
8
9
10
11
12
├── config
│   ├── packages
│   └── routes
│      ├── framework.yaml
│      └── web_profiler.yaml
├── src
│   ├── Command
│   ├── Controller
│   │   └── DefaultController.php
│   └── Kernel.php
└── templates
   └── base.html.twig

Коробка:

1
TreeHelper::createTree($io, $node, [], TreeStyle::box());

Это выводит:

1
2
3
4
5
6
7
8
9
10
11
12
┃╸ config
┃  ┃╸ packages
┃  ┗╸ routes
┃     ┃╸ framework.yaml
┃     ┗╸ web_profiler.yaml
┃╸ src
┃  ┃╸ Command
┃  ┃╸ Controller
┃  ┃  ┗╸ DefaultController.php
┃  ┗╸ Kernel.php
┗╸ templates
   ┗╸ base.html.twig

Двойная коробка:

1
TreeHelper::createTree($io, $node, [], TreeStyle::doubleBox());

Это выводит:

1
2
3
4
5
6
7
8
9
10
11
12
╠═ config
║  ╠═ packages
║  ╚═ routes
║    ╠═ framework.yaml
║    ╚═ web_profiler.yaml
╠═ src
║  ╠═ Command
║  ╠═ Controller
║  ║  ╚═ DefaultController.php
║  ╚═ Kernel.php
╚═ templates
  ╚═ base.html.twig

Компактный:

1
TreeHelper::createTree($io, $node, [], TreeStyle::compact());

Это выводит:

1
2
3
4
5
6
7
8
9
10
11
12
├ config
│ ├ packages
│ └ routes
│   ├ framework.yaml
│   └ web_profiler.yaml
├ src
│ ├ Command
│ ├ Controller
│ │ └ DefaultController.php
│ └ Kernel.php
└ templates
  └ base.html.twig

Легкий:

1
TreeHelper::createTree($io, $node, [], TreeStyle::light());

Это выводит:

1
2
3
4
5
6
7
8
9
10
11
12
|-- config
|   |-- packages
|   `-- routes
|       |-- framework.yaml
|       `-- web_profiler.yaml
|-- src
|   |-- Command
|   |-- Controller
|   |   `-- DefaultController.php
|   `-- Kernel.php
`-- templates
    `-- base.html.twig

Минимальный:

1
TreeHelper::createTree($io, $node, [], TreeStyle::minimal());

Это выводит:

1
2
3
4
5
6
7
8
9
10
11
12
. config
. . packages
. . routes
.   . framework.yaml
.   . web_profiler.yaml
. src
. . Command
. . Controller
. . . DefaultController.php
. . Kernel.php
. templates
  . base.html.twig

Округленный:

1
TreeHelper::createTree($io, $node, [], TreeStyle::rounded());

Это выводит:

1
2
3
4
5
6
7
8
9
10
11
12
├─ config
│  ├─ packages
│  ╰─ routes
│     ├─ framework.yaml
│     ╰─ web_profiler.yaml
├─ src
│  ├─ Command
│  ├─ Controller
│  │  ╰─ DefaultController.php
│  ╰─ Kernel.php
╰─ templates
   ╰─ base.html.twig

Создание пользовательского стиля дерева

Вы можете создать ваш собственный стиль дерева, передав символы конструктора класса TreeStyle:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
use Symfony\Component\Console\Helper\TreeHelper;
use Symfony\Component\Console\Helper\TreeStyle;

$customStyle = new TreeStyle('🟣 ', '🟠 ', '🔵 ', '🟢 ', '🔴 ', '🟡 ');

// Передати користувацький стиль методу createTree

$tree = TreeHelper::createTree($io, null, [
    'src' =>  [
        'Command',
        'Controller' => [
            'DefaultController.php',
        ],
        'Kernel.php',
    ],
    'templates' => [
        'base.html.twig',
    ],
], $customStyle);

$tree->render();

Код выше выведет следующее дерево:

1
2
3
4
5
6
7
🔵 🟣 🟡 src
🔵 🟢 🟣 🟡 Command
🔵 🟢 🟣 🟡 Controller
🔵 🟢 🟢 🟠 🟡 DefaultController.php
🔵 🟢 🟠 🟡 Kernel.php
🔵 🟠 🟡 templates
🔵 🔴 🟠 🟡 base.html.twig