From 959a182d162ba6965c4e5b9346a4c0c0d515e654 Mon Sep 17 00:00:00 2001 From: Dave Mc Nicoll Date: Fri, 27 Sep 2024 14:29:46 -0400 Subject: [PATCH] - Fixed the Composer.json autoload ; now config are included inside the definition --- src/Kernel.php | 21 ++++++++++++----- src/Lean.php | 63 +++++++++++++++++++++++++++++++++++--------------- 2 files changed, 60 insertions(+), 24 deletions(-) diff --git a/src/Kernel.php b/src/Kernel.php index d33da28..f2bc02d 100644 --- a/src/Kernel.php +++ b/src/Kernel.php @@ -29,7 +29,7 @@ class Kernel { public int $errorReporting = E_ALL & ~E_USER_DEPRECATED & ~E_DEPRECATED & ~E_STRICT & ~E_NOTICE; - public string $definitionFilePath; + public array $definitionFilePaths; public string $errorLogPath; @@ -122,13 +122,22 @@ class Kernel { } } - # $containerBuilder->useAnnotations(false); - - if ($this->definitionFilePath ?? false) { - $containerBuilder->addDefinitions(Lean::autoloadDefinitionsFromComposerExtra()); - $containerBuilder->addDefinitions(require($this->definitionFilePath)); + foreach(Lean::getDefinitionsPathsFromComposer() as $path) { + $containerBuilder->addDefinitions($path); } + foreach($this->definitionFilePaths ?? [] as $path) { + $containerBuilder->addDefinitions($path); + } + + $containerBuilder->addDefinitions([ + 'config' => function () { + return array_merge_recursive( + Lean::autoloadConfigFromComposerExtra(), [] + ); + } + ]); + $this->container = $containerBuilder->build(); return $this; diff --git a/src/Lean.php b/src/Lean.php index 542f792..1ef7933 100644 --- a/src/Lean.php +++ b/src/Lean.php @@ -139,11 +139,11 @@ class Lean switch($reader) { case "php": $list = array_merge(...array_map(fn($app) => $app->tellPhp ?? [], $this->applications)); - break; + break; case "json": $list = array_merge(...array_map(fn($app) => $app->tellJson ?? [], $this->applications)); - break; + break; } if ( $list ?? false ) { @@ -161,20 +161,33 @@ class Lean return []; } + public static function getDefinitionsPathsFromComposer() : array + { + $list = []; + + foreach(Composer::readComposerLock()['packages'] as $package) { + foreach($package['extra']['lean']['autoload']['definitions'] ?? [] as $autoload) { + $list[] = static::pathFromPackage($package, $autoload); + } + } + + foreach(Composer::readComposerJson()['extra']['lean']['autoload']['definitions'] ?? [] as $autoload) { + $list[] = getenv('PROJECT_PATH') . DIRECTORY_SEPARATOR . $autoload; + } + + return $list; + } + public static function autoloadDefinitionsFromComposerExtra() : array { $list = []; foreach(Composer::readComposerLock()['packages'] as $package) { foreach($package['extra']['lean']['autoload']['definitions'] ?? [] as $autoload) { - $list = array_replace($list, static::loadFromPackage($package, $autoload, getenv('VENDOR_DIR') ?: dirname(__DIR__, 3))); + $list = array_replace($list, static::loadFromPackage($package, $autoload)); } } - foreach(Composer::readComposerJson()['extra']['lean']['autoload']['definitions'] ?? [] as $autoload) { - $list = array_replace($list, static::loadFromPackage(null, $autoload, getenv('PROJECT_PATH') ?: dirname(__DIR__, 5))); - } - return $list; } @@ -184,36 +197,50 @@ class Lean foreach(Composer::readComposerLock()['packages'] as $package) { foreach($package['extra']['lean']['autoload']['config'] ?? [] as $autoload) { - $list = array_merge_recursive($list, static::loadFromPackage($package, $autoload, getenv('VENDOR_DIR') ?: dirname(__DIR__, 3))); + $list = array_merge_recursive($list, static::loadFromPackage($package, $autoload)); } } foreach(Composer::readComposerJson()['extra']['lean']['autoload']['config'] ?? [] as $autoload) { - $list = array_merge_recursive($list, static::loadFromPackage(null, $autoload, getenv('PROJECT_PATH') ?: dirname(__DIR__, 5))); + $list = array_merge_recursive($list, static::loadFromPackage(null, $autoload)); } return $list; } - protected static function loadFromPackage(?array $package, array|string $autoload, string $path) : false|array + protected static function pathFromPackage(?array $package, array|string $autoload) : string + { + if ($package === null) { + $filepath = getenv('PROJECT_PATH') . DIRECTORY_SEPARATOR . $autoload; + } + else { + $vendor = getenv('VENDOR_DIR') ? getenv('VENDOR_PATH') : dirname(__DIR__, 3); + $filepath = $vendor . DIRECTORY_SEPARATOR . $package['name'] . DIRECTORY_SEPARATOR . $autoload; + } + + if (! file_exists($filepath)) { + throw new \InvalidArgumentException("Given definition filepath do not exists '$filepath'"); + } + + return $filepath; + } + + protected static function loadFromPackage(? array $package, array|string $autoload) : false|array { $list = []; if (is_string($autoload)) { - $file = $path . DIRECTORY_SEPARATOR . ($package ? $package['name'] . DIRECTORY_SEPARATOR : "") . $autoload; + $file = static::pathFromPackage($package, $autoload); if ( ! file_exists($file) ) { - throw new \InvalidArgumentException(sprintf("Given autoload file `%s` from package `%s` was not found or is unreachable", $file, $package['name'])); + throw new \InvalidArgumentException(sprintf("Given autoload file `%s` from package `%s` was not found or is unreachable", $autoload, $package['name'])); } return require($file); } - else { - $func = implode('::', array_merge([ key($autoload) ], $autoload)); - return call_user_func($func); - } + $func = implode('::', array_merge([ key($autoload) ], $autoload)); - return false; + return call_user_func($func); } -} \ No newline at end of file +}