From b0ef1b1e018caad60a002fc78e478664ae370d58 Mon Sep 17 00:00:00 2001 From: Chauncey McAskill Date: Mon, 10 Feb 2020 17:11:49 -0500 Subject: [PATCH] Fix "metadata/config" in service provider Added: - Class `MockModule` to test container entry "module/classes" Changed: - Service "metadata/config" to improve logic processing "module/classes" --- .../ServiceProvider/ModelServiceProvider.php | 35 ++++++------ tests/Charcoal/Mock/MockModule.php | 11 ++++ tests/Charcoal/Mock/config.json | 7 +++ .../ModelServiceProviderTest.php | 53 +++++++++++++------ 4 files changed, 74 insertions(+), 32 deletions(-) create mode 100644 tests/Charcoal/Mock/MockModule.php create mode 100644 tests/Charcoal/Mock/config.json diff --git a/src/Charcoal/Model/ServiceProvider/ModelServiceProvider.php b/src/Charcoal/Model/ServiceProvider/ModelServiceProvider.php index 1dc7ece0..06e2e8f6 100644 --- a/src/Charcoal/Model/ServiceProvider/ModelServiceProvider.php +++ b/src/Charcoal/Model/ServiceProvider/ModelServiceProvider.php @@ -229,26 +229,31 @@ protected function registerMetadataDependencies(Container $container) $container['metadata/config'] = function (Container $container) { $appConfig = isset($container['config']) ? $container['config'] : []; $metaConfig = isset($appConfig['metadata']) ? $appConfig['metadata'] : null; + $metaConfig = new MetadataConfig($metaConfig); - $config = new MetadataConfig($metaConfig); + if (isset($container['module/classes'])) { + $extraPaths = []; + $basePath = rtrim($appConfig['base_path'], '/'); + $modules = $container['module/classes']; + foreach ($modules as $module) { + if (defined(sprintf('%s::APP_CONFIG', $module))) { + $configPath = ltrim($module::APP_CONFIG, '/'); + $configPath = $basePath.'/'.$configPath; - $extraMetadataPaths = []; - $basePath = $appConfig['base_path']; - foreach ($container['module/classes'] as $module) { - if (defined(sprintf('%s::APP_CONFIG', $module))) { - $moduleConfig = $module::APP_CONFIG; - $extraMetadataPaths = array_merge( - $extraMetadataPaths, - $config->loadFile($basePath.$moduleConfig)['metadata']['paths'] - ); - }; - } + $configData = $metaConfig->loadFile($configPath); + $extraPaths = array_merge( + $extraPaths, + $configData['metadata']['paths'] + ); + }; + } - if (!empty($extraMetadataPaths)) { - $config->addPaths($extraMetadataPaths); + if (!empty($extraPaths)) { + $metaConfig->addPaths($extraPaths); + } } - return $config; + return $metaConfig; }; } diff --git a/tests/Charcoal/Mock/MockModule.php b/tests/Charcoal/Mock/MockModule.php new file mode 100644 index 00000000..e9c7f93d --- /dev/null +++ b/tests/Charcoal/Mock/MockModule.php @@ -0,0 +1,11 @@ + [ - 'paths' => [] - ] + 'paths' => [], + ], ]); - $container['database'] = new PDO('sqlite::memory:'); - $container['logger'] = new NullLogger(); $container['view/loader'] = new PhpLoader([ 'logger' => $container['logger'], 'base_path' => dirname(__DIR__), - 'paths' => [ 'views' ] + 'paths' => [ 'views' ], ]); $container['view/engine'] = new PhpEngine([ 'logger' => $container['logger'], - 'loader' => $container['view/loader'] + 'loader' => $container['view/loader'], ]); $container['view'] = new GenericView([ 'logger' => $container['logger'], - 'engine' => $container['view/engine'] + 'engine' => $container['view/engine'], ]); - $container['language/manager'] = new LocalesManager([ + $container['locales/manager'] = new LocalesManager([ 'locales' => [ - 'en' => [ 'locale' => 'en-US' ] - ] + 'en' => [ + 'locale' => 'en-US', + ], + ], ]); $container['translator'] = new Translator([ - 'manager' => $container['language/manager'] - ]); - - $container['metadata/config'] = new MetadataConfig([ - 'paths' => [] + 'manager' => $container['locales/manager'], ]); return $container; @@ -172,4 +170,25 @@ public function testRegisterSetsMetadataLoader() $this->assertTrue(isset($container['metadata/loader'])); $this->assertInstanceOf(MetadataLoader::class, $container['metadata/loader']); } + + /** + * @return void + */ + public function testExtraMetadataPaths() + { + $container = new Container([ + 'config' => [ + 'base_path' => dirname(dirname(dirname(dirname(__DIR__)))), + ], + 'module/classes' => [ + 'Charcoal\\Tests\\Mock\\MockModule', + ], + ]); + + $provider = new ModelServiceProvider(); + $provider->register($container); + + $metadataConfig = $container['metadata/config']; + $this->assertContains('tests/Charcoal/Model/metadata', $metadataConfig->paths()); + } }