Completed
Pull Request — master (#154)
by Arnaud
04:40
created

MenuSubscriber::buildMenus()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 20
Code Lines 12

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 12
CRAP Score 3

Importance

Changes 0
Metric Value
cc 3
eloc 12
nc 3
nop 1
dl 0
loc 20
ccs 12
cts 12
cp 1
crap 3
rs 9.8666
c 0
b 0
f 0
1
<?php
2
3
namespace LAG\AdminBundle\Event\Subscriber;
4
5
use LAG\AdminBundle\Configuration\ApplicationConfiguration;
6
use LAG\AdminBundle\Configuration\ApplicationConfigurationStorage;
7
use LAG\AdminBundle\Event\Events;
8
use LAG\AdminBundle\Event\Events\OldBuildMenuEvent;
9
use LAG\AdminBundle\Event\Menu\MenuConfigurationEvent;
10
use LAG\AdminBundle\Factory\MenuFactory;
11
use LAG\AdminBundle\Resource\Registry\ResourceRegistryInterface;
12
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
13
use Symfony\Component\OptionsResolver\OptionsResolver;
14
use Symfony\Contracts\EventDispatcher\EventDispatcherInterface;
15
16
class MenuSubscriber implements EventSubscriberInterface
17
{
18
    /**
19
     * @var bool
20
     */
21
    private $menuEnabled;
22
23
    /**
24
     * @var ResourceRegistryInterface
25
     */
26
    private $registry;
27
28
    /**
29
     * @var array
30
     */
31
    private $menuConfigurations;
32
33
    /**
34
     * @return array
35
     */
36 4
    public static function getSubscribedEvents()
37
    {
38
        return [
39 4
            Events::MENU_CONFIGURATION => 'createMenuConfiguration',
40
        ];
41
    }
42
43
    public function __construct(bool $menuEnabled, ResourceRegistryInterface $registry, array $menuConfigurations = [])
44
    {
45
        $this->menuEnabled = $menuEnabled;
46
        $this->registry = $registry;
47
        $this->menuConfigurations = $menuConfigurations;
48
    }
49
50
    public function createMenuConfiguration(MenuConfigurationEvent $event)
51
    {
52
        if (!$this->menuEnabled || !key_exists($event->getMenuName(), $this->menuConfigurations)) {
53
            return;
54
        }
55
        $menuConfiguration = $this->menuConfigurations[$event->getMenuName()];
56
57
        if (!is_array($menuConfiguration)) {
58
            $menuConfiguration = [];
59
        }
60
        $menuConfiguration = array_merge_recursive($menuConfiguration, $event->getMenuConfiguration());
61
        $resourceNames = $this->registry->keys();
62
63
        if (!key_exists('children', $menuConfiguration) || !is_array($menuConfiguration['children'])) {
64
            $menuConfiguration['children'] = [];
65
66
            if ('left' === $event->getMenuName()) {
67
                foreach ($resourceNames as $resourceName) {
68
                    $menuConfiguration['children'][$resourceName] = [];
69
                }
70
            }
71
        }
72
73
        foreach ($menuConfiguration['children'] as $itemName => $itemConfiguration) {
74
            if (null === $itemConfiguration) {
75
                $itemConfiguration = [];
76
            }
77
78
            // When an url is set, nothing to add, the item menu can be build
79
            if (key_exists('url', $itemConfiguration)) {
80
                $menuConfiguration[$itemName] = $itemConfiguration;
81
82
                continue;
83
            }
84
85
            // If the key "admin' is missing, we try to find an admin resource with the same name
86
            if (!key_exists('admin', $itemConfiguration) && in_array($itemName, $resourceNames)) {
87
                $itemConfiguration['admin'] = $itemName;
88
            }
89
90
            // The default admins action is list
91
            if (key_exists('admin', $itemConfiguration) && !key_exists('action', $itemConfiguration)) {
92
                $itemConfiguration['action'] = 'list';
93
            }
94
95
            $menuConfiguration['children'][$itemName] = $itemConfiguration;
96
        }
97
98
        // Set defaults menu configuration to be build
99
        $event->setMenuConfiguration($menuConfiguration);
100
    }
101
}
102