MenuBuilder::__construct()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 1
Metric Value
eloc 2
c 1
b 0
f 1
dl 0
loc 4
rs 10
cc 1
nc 1
nop 2
1
<?php
2
3
/**
4
 * (c) FSi sp. z o.o. <[email protected]>
5
 *
6
 * For the full copyright and license information, please view the LICENSE
7
 * file that was distributed with this source code.
8
 */
9
10
declare(strict_types=1);
11
12
namespace FSi\Bundle\AdminBundle\Menu\KnpMenu;
13
14
use FSi\Bundle\AdminBundle\Menu\Builder\Builder;
15
use FSi\Bundle\AdminBundle\Menu\Item\Item;
16
use Knp\Menu\FactoryInterface;
17
use Knp\Menu\ItemInterface as KnpItemInterface;
18
19
class MenuBuilder
20
{
21
    /**
22
     * @var FactoryInterface
23
     */
24
    protected $factory;
25
26
    /**
27
     * @var ItemDecorator
28
     */
29
    protected $itemDecorator;
30
31
    public function __construct(FactoryInterface $factory, ItemDecorator $itemDecorator)
32
    {
33
        $this->factory = $factory;
34
        $this->itemDecorator = $itemDecorator;
35
    }
36
37
    public function createMenu(Builder $builder): KnpItemInterface
38
    {
39
        $rootMenuItem = $builder->buildMenu();
40
        $knpMenuItem = $this->createMenuRoot($rootMenuItem);
41
42
        $this->populateMenu($knpMenuItem, $rootMenuItem->getChildren());
43
44
        return $knpMenuItem;
45
    }
46
47
    private function createMenuRoot(Item $rootMenuItem): KnpItemInterface
48
    {
49
        $menu = $this->factory->createItem('root');
50
        $menu->setChildrenAttribute('class', $rootMenuItem->getOption('attr')['class']);
51
        $menu->setChildrenAttribute('id', $rootMenuItem->getOption('attr')['id']);
52
53
        return $menu;
54
    }
55
56
    /**
57
     * @param KnpItemInterface $menu
58
     * @param Item[] $children
59
     */
60
    private function populateMenu(KnpItemInterface $menu, array $children): void
61
    {
62
        foreach ($children as $item) {
63
            $knpItem = $menu->addChild($item->getName(), []);
64
65
            if ($item->hasChildren()) {
66
                $this->populateMenu($knpItem, $item->getChildren());
67
            }
68
69
            $this->itemDecorator->decorate($knpItem, $item);
70
        }
71
    }
72
}
73