-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathBarthSimpleConfigExtension.php
More file actions
126 lines (108 loc) · 4.95 KB
/
BarthSimpleConfigExtension.php
File metadata and controls
126 lines (108 loc) · 4.95 KB
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
<?php
namespace Barth\SimpleConfigBundle\DependencyInjection;
use Barth\SimpleConfigBundle\Controller\DefaultController;
use Barth\SimpleConfigBundle\NameConverter\SnakeCaseToCamelCaseNameConverter;
use Barth\SimpleConfigBundle\Service\ConfigService;
use Barth\SimpleConfigBundle\Service\ExtensionLocatorService;
use Symfony\Component\Config\FileLocator;
use Symfony\Component\Config\Loader\DelegatingLoader;
use Symfony\Component\Config\Loader\LoaderResolver;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface;
use Symfony\Component\DependencyInjection\Loader\ClosureLoader;
use Symfony\Component\DependencyInjection\Loader\DirectoryLoader;
use Symfony\Component\DependencyInjection\Loader\GlobFileLoader;
use Symfony\Component\DependencyInjection\Loader\YamlFileLoader;
use Symfony\Component\HttpKernel\DependencyInjection\Extension;
class BarthSimpleConfigExtension extends Extension implements PrependExtensionInterface
{
/**
* {@inheritdoc}
*/
public function load(array $configs, ContainerBuilder $container)
{
$configuration = $this->getConfiguration($configs, $container);
$config = $this->processConfiguration($configuration, $configs);
$loader = new YamlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config'));
$loader->load('services.yml');
$container->getDefinition(ConfigService::class)->setArgument('$overrideDir', $config['override_package_directory']);
$bundles = $container->getParameter('kernel.bundles');
if (isset($bundles['EasyAdminBundle']) && $config['enable_easyadmin_integration'] === true) {
$container->getDefinition(DefaultController::class)->setArgument('$defaultAdminBundle', 'easy_admin');
}
if (isset($bundles['SonataAdminBundle']) && $config['enable_sonata_integration'] === true) {
$container->getDefinition(DefaultController::class)->setArgument('$defaultAdminBundle', 'sonata_admin');
}
if (true === $config['enable_blacklist']) {
$container
->getDefinition(ExtensionLocatorService::class)
->setArgument(1, $config['blacklisted_bundles']);
}
}
/**
* @param ContainerBuilder $container
*/
public function prepend(ContainerBuilder $container)
{
$bundles = $container->getParameter('kernel.bundles');
$this->loadOverrideConfig($container);
$config = $this->getExtensionConfig($container);
if (isset($bundles['EasyAdminBundle']) && $config['enable_easyadmin_integration'] === true) {
$easyConfig = [
'design' => [
'menu' => [[
'label' => 'Bundles Configuration',
'icon' => 'wrench',
'children' => $this->getEasyAdminChildren($container, $config)
]]
],
];
$container->prependExtensionConfig('easy_admin', $easyConfig);
}
}
private function loadOverrideConfig(ContainerBuilder $container)
{
$config = $this->getExtensionConfig($container);
$overrideLoader = $this->getContainerLoader($container);
$confDir = $container->getParameter('kernel.project_dir') . '/config';
$overrideLoader->load($confDir . '/packages/' . $config['override_package_directory'] . '/*.yaml', 'glob');
}
/**
* @param ContainerBuilder $container
* @param array $config
* @return array
*/
private function getEasyAdminChildren(ContainerBuilder $container, array $config)
{
$extensions = $container->getExtensions();
$nameConverter = new SnakeCaseToCamelCaseNameConverter();
$childrenConfig = [];
foreach ($extensions as $extension) {
if (!in_array($extension->getAlias(), $config['blacklisted_bundles']) || $config['enable_blacklist'] === false) {
$childrenConfig[] = [
'label' => $nameConverter->handle($extension->getAlias()),
'route' => 'barth_simpleconfig_edit',
'params' => ['package' => $extension->getAlias()]
];
}
}
return $childrenConfig;
}
private function getExtensionConfig($container)
{
$configs = $container->getExtensionConfig($this->getAlias());
return $this->processConfiguration(new Configuration(), $configs);
}
private function getContainerLoader(ContainerInterface $container)
{
$locator = new FileLocator([]);
$resolver = new LoaderResolver(array(
new YamlFileLoader($container, $locator),
new GlobFileLoader($container, $locator),
new DirectoryLoader($container, $locator),
new ClosureLoader($container)
));
return new DelegatingLoader($resolver);
}
}