22
33namespace Barth \SimpleConfigBundle \DependencyInjection ;
44
5+ use Barth \SimpleConfigBundle \Controller \DefaultController ;
6+ use Barth \SimpleConfigBundle \NameConverter \SnakeCaseToCamelCaseNameConverter ;
57use Barth \SimpleConfigBundle \Service \ConfigService ;
68use Barth \SimpleConfigBundle \Service \ExtensionLocatorService ;
79use Symfony \Component \Config \FileLocator ;
10+ use Symfony \Component \Config \Loader \DelegatingLoader ;
11+ use Symfony \Component \Config \Loader \LoaderResolver ;
812use Symfony \Component \DependencyInjection \ContainerBuilder ;
13+ use Symfony \Component \DependencyInjection \ContainerInterface ;
14+ use Symfony \Component \DependencyInjection \Extension \PrependExtensionInterface ;
15+ use Symfony \Component \DependencyInjection \Loader \ClosureLoader ;
16+ use Symfony \Component \DependencyInjection \Loader \DirectoryLoader ;
17+ use Symfony \Component \DependencyInjection \Loader \GlobFileLoader ;
918use Symfony \Component \DependencyInjection \Loader \YamlFileLoader ;
1019use Symfony \Component \HttpKernel \DependencyInjection \Extension ;
1120
12- class BarthSimpleConfigExtension extends Extension
21+ class BarthSimpleConfigExtension extends Extension implements PrependExtensionInterface
1322{
1423 /**
1524 * {@inheritdoc}
@@ -22,33 +31,94 @@ public function load(array $configs, ContainerBuilder $container)
2231 $ loader = new YamlFileLoader ($ container , new FileLocator (__DIR__ . '/../Resources/config ' ));
2332 $ loader ->load ('services.yml ' );
2433
25- $ container ->getDefinition (ConfigService::class)->setArgument (1 , $ config ['override_package_directory ' ]);
34+ $ container ->getDefinition (ConfigService::class)->setArgument ('$overrideDir ' , $ config ['override_package_directory ' ]);
35+ $ bundles = $ container ->getParameter ('kernel.bundles ' );
36+ if (isset ($ bundles ['EasyAdminBundle ' ]) && $ config ['enable_easyadmin_integration ' ] === true ) {
37+ $ container ->getDefinition (DefaultController::class)->setArgument ('$defaultAdminBundle ' , 'easy_admin ' );
38+ }
39+
2640 if (true === $ config ['enable_blacklist ' ]) {
41+ $ this ->blacklistedBundles = $ config ['blacklisted_bundles ' ];
2742 $ container
2843 ->getDefinition (ExtensionLocatorService::class)
2944 ->setArgument (1 , $ config ['blacklisted_bundles ' ]);
3045 }
3146 }
3247
3348 /**
49+ * @param ContainerBuilder $container
50+ */
51+ public function prepend (ContainerBuilder $ container )
52+ {
53+ $ bundles = $ container ->getParameter ('kernel.bundles ' );
54+
55+ $ this ->loadOverrideConfig ($ container );
56+ $ config = $ this ->getExtensionConfig ($ container );
57+
58+ if (isset ($ bundles ['EasyAdminBundle ' ]) && $ config ['enable_easyadmin_integration ' ] === true ) {
59+ $ easyConfig = [
60+ 'design ' => [
61+ 'menu ' => [[
62+ 'label ' => 'Bundles Configuration ' ,
63+ 'icon ' => 'wrench ' ,
64+ 'children ' => $ this ->getEasyAdminChildren ($ container , $ config )
65+ ]]
66+ ],
67+ ];
68+
69+ $ container ->prependExtensionConfig ('easy_admin ' , $ easyConfig );
70+ }
71+ }
72+
73+
74+ private function loadOverrideConfig (ContainerBuilder $ container )
75+ {
76+ $ config = $ this ->getExtensionConfig ($ container );
77+ $ overrideLoader = $ this ->getContainerLoader ($ container );
78+ $ confDir = $ container ->getParameter ('kernel.project_dir ' ) . '/config ' ;
79+ $ overrideLoader ->load ($ confDir . '/packages/ ' . $ config ['override_package_directory ' ] . '/*.yaml ' , 'glob ' );
80+ }
81+
82+ /**
83+ * @param ContainerBuilder $container
84+ * @param array $config
3485 * @return array
3586 */
36- private function getDefaultBlacklistBundle ()
87+ private function getEasyAdminChildren (ContainerBuilder $ container , array $ config )
88+ {
89+ $ extensions = $ container ->getExtensions ();
90+ $ nameConverter = new SnakeCaseToCamelCaseNameConverter ();
91+ $ childrenConfig = [];
92+
93+ foreach ($ extensions as $ extension ) {
94+ if (!in_array ($ extension ->getAlias (), $ config ['blacklisted_bundles ' ]) || $ config ['enable_blacklist ' ] === false ) {
95+ $ childrenConfig [] = [
96+ 'label ' => $ nameConverter ->handle ($ extension ->getAlias ()),
97+ 'route ' => 'barth_simpleconfig_edit ' ,
98+ 'params ' => ['package ' => $ extension ->getAlias ()]
99+ ];
100+ }
101+ }
102+
103+ return $ childrenConfig ;
104+ }
105+
106+ private function getExtensionConfig ($ container )
107+ {
108+ $ configs = $ container ->getExtensionConfig ($ this ->getAlias ());
109+ return $ this ->processConfiguration (new Configuration (), $ configs );
110+ }
111+
112+ private function getContainerLoader (ContainerInterface $ container )
37113 {
38- return [
39- 'debug ' ,
40- 'doctrine ' ,
41- 'doctrine_cache ' ,
42- 'doctrine_migrations ' ,
43- 'framework ' ,
44- 'maker ' ,
45- 'monolog ' ,
46- 'security ' ,
47- 'sensio_framework_extra ' ,
48- 'swiftmailer ' ,
49- 'twig ' ,
50- 'web_profiler ' ,
51- 'web_server ' ,
52- ];
114+ $ locator = new FileLocator ([]);
115+ $ resolver = new LoaderResolver (array (
116+ new YamlFileLoader ($ container , $ locator ),
117+ new GlobFileLoader ($ container , $ locator ),
118+ new DirectoryLoader ($ container , $ locator ),
119+ new ClosureLoader ($ container )
120+ ));
121+
122+ return new DelegatingLoader ($ resolver );
53123 }
54124}
0 commit comments