From ccaeb3342ed12421e6a0f2e7a1b4c91e7191e668 Mon Sep 17 00:00:00 2001 From: Chemaclass Date: Sat, 17 Aug 2024 18:58:00 +0200 Subject: [PATCH] fix: BC with current AbstractDependencyProvider behaviour --- psalm.xml | 1 + .../Domain/AllAppModules/AppModuleCreator.php | 16 ++++----- src/Framework/AbstractFactory.php | 13 ++++++-- .../ClassResolver/AbstractClassResolver.php | 16 +++++++-- .../Provider/DependencyProviderResolver.php | 33 +++++++++++++++++++ .../Provider/ProviderResolver.php | 10 +++--- .../Framework/ExtendService/FeatureTest.php | 6 ++-- .../{Provider.php => DependencyProvider.php} | 8 +++-- .../ExtendService/Module/Factory.php | 4 +-- .../Framework/MissingFile/FeatureTest.php | 2 +- .../{DependencyProvider.php => Provider.php} | 0 .../Framework/ClassResolver/ClassInfoTest.php | 16 +++++++++ 12 files changed, 98 insertions(+), 27 deletions(-) create mode 100644 src/Framework/ClassResolver/Provider/DependencyProviderResolver.php rename tests/Feature/Framework/ExtendService/Module/{Provider.php => DependencyProvider.php} (66%) rename tests/Feature/Framework/MissingFile/MissingContainerServiceKey/{DependencyProvider.php => Provider.php} (100%) diff --git a/psalm.xml b/psalm.xml index 43cd1a50..c579cbf1 100644 --- a/psalm.xml +++ b/psalm.xml @@ -19,6 +19,7 @@ + diff --git a/src/Console/Domain/AllAppModules/AppModuleCreator.php b/src/Console/Domain/AllAppModules/AppModuleCreator.php index 714e5083..a527fd52 100644 --- a/src/Console/Domain/AllAppModules/AppModuleCreator.php +++ b/src/Console/Domain/AllAppModules/AppModuleCreator.php @@ -6,7 +6,6 @@ use Gacela\Framework\ClassResolver\Config\ConfigResolver; use Gacela\Framework\ClassResolver\Factory\FactoryResolver; -use Gacela\Framework\ClassResolver\Provider\ProviderNotFoundException; use Gacela\Framework\ClassResolver\Provider\ProviderResolver; use ReflectionClass; @@ -91,16 +90,15 @@ private function findConfig(string $facadeClass): ?string */ private function findProvider(string $facadeClass): ?string { - try { - $resolver = $this->providerResolver->resolve($facadeClass); - - if ((new ReflectionClass($resolver))->isAnonymous()) { - throw new ProviderNotFoundException($resolver); - } + $resolver = $this->providerResolver->resolve($facadeClass); + if ($resolver === null) { + return null; + } - return $resolver::class; - } catch (ProviderNotFoundException) { + if ((new ReflectionClass($resolver))->isAnonymous()) { return null; } + + return $resolver::class; } } diff --git a/src/Framework/AbstractFactory.php b/src/Framework/AbstractFactory.php index 4c1724a8..1bd303bf 100644 --- a/src/Framework/AbstractFactory.php +++ b/src/Framework/AbstractFactory.php @@ -4,6 +4,8 @@ namespace Gacela\Framework; +use Gacela\Framework\ClassResolver\Provider\DependencyProviderResolver; +use Gacela\Framework\ClassResolver\Provider\ProviderNotFoundException; use Gacela\Framework\ClassResolver\Provider\ProviderResolver; use Gacela\Framework\Config\Config; use Gacela\Framework\Container\Container; @@ -43,8 +45,15 @@ private function createContainerWithProvidedDependencies(): Container { $container = Container::withConfig(Config::getInstance()); - $provider = (new ProviderResolver())->resolve($this); - $provider->provideModuleDependencies($container); + $resolver = (new ProviderResolver())->resolve($this); + $resolver?->provideModuleDependencies($container); + + $dpResolver = (new DependencyProviderResolver())->resolve($this); + $dpResolver?->provideModuleDependencies($container); + + if ($resolver === null && $dpResolver === null) { + throw new ProviderNotFoundException(static::class); + } return $container; } diff --git a/src/Framework/ClassResolver/AbstractClassResolver.php b/src/Framework/ClassResolver/AbstractClassResolver.php index 526cbea9..046b18bd 100644 --- a/src/Framework/ClassResolver/AbstractClassResolver.php +++ b/src/Framework/ClassResolver/AbstractClassResolver.php @@ -6,13 +6,17 @@ use Gacela\Container\Container; use Gacela\Framework\AbstractConfig; +use Gacela\Framework\AbstractDependencyProvider; use Gacela\Framework\AbstractFacade; use Gacela\Framework\AbstractFactory; +use Gacela\Framework\AbstractProvider; use Gacela\Framework\ClassResolver\ClassNameFinder\ClassNameFinderInterface; use Gacela\Framework\ClassResolver\Config\ConfigResolver; use Gacela\Framework\ClassResolver\Facade\FacadeResolver; use Gacela\Framework\ClassResolver\Factory\FactoryResolver; use Gacela\Framework\ClassResolver\GlobalInstance\AnonymousGlobal; +use Gacela\Framework\ClassResolver\Provider\DependencyProviderResolver; +use Gacela\Framework\ClassResolver\Provider\ProviderResolver; use Gacela\Framework\Config\Config; use Gacela\Framework\Config\GacelaFileConfig\GacelaConfigFileInterface; use Gacela\Framework\Event\ClassResolver\ResolvedClassCachedEvent; @@ -60,7 +64,6 @@ protected function doResolve(object|string $caller, ?string $previousCacheKey = { $classInfo = ClassInfo::from($caller, $this->getResolvableType()); $cacheKey = $previousCacheKey ?? $classInfo->getCacheKey(); - $resolvedClass = $this->resolveCached($cacheKey); if ($resolvedClass !== null) { self::dispatchEvent(new ResolvedClassCachedEvent($classInfo)); @@ -86,7 +89,6 @@ protected function doResolve(object|string $caller, ?string $previousCacheKey = self::dispatchEvent(new ResolvedCreatedDefaultClassEvent($classInfo)); $instance = $this->createDefaultGacelaClass(); } - self::$cachedInstances[$cacheKey] = $instance; return self::$cachedInstances[$cacheKey]; @@ -169,6 +171,16 @@ private function createDefaultGacelaClass(): ?object FacadeResolver::TYPE => new class() extends AbstractFacade {}, FactoryResolver::TYPE => new class() extends AbstractFactory {}, ConfigResolver::TYPE => new class() extends AbstractConfig {}, + // DependencyProviderResolver::TYPE => new class() extends AbstractDependencyProvider { + // public function provideModuleDependencies(\Gacela\Framework\Container\Container $container): void + // { + // } + // }, + // ProviderResolver::TYPE => new class() extends AbstractProvider { + // public function provideModuleDependencies(\Gacela\Framework\Container\Container $container): void + // { + // } + // }, default => null, }; } diff --git a/src/Framework/ClassResolver/Provider/DependencyProviderResolver.php b/src/Framework/ClassResolver/Provider/DependencyProviderResolver.php new file mode 100644 index 00000000..72498314 --- /dev/null +++ b/src/Framework/ClassResolver/Provider/DependencyProviderResolver.php @@ -0,0 +1,33 @@ +doResolve($caller); + + return $resolved; + } + + protected function getResolvableType(): string + { + return self::TYPE; + } +} diff --git a/src/Framework/ClassResolver/Provider/ProviderResolver.php b/src/Framework/ClassResolver/Provider/ProviderResolver.php index 740de994..4bbd74eb 100644 --- a/src/Framework/ClassResolver/Provider/ProviderResolver.php +++ b/src/Framework/ClassResolver/Provider/ProviderResolver.php @@ -9,25 +9,23 @@ final class ProviderResolver extends AbstractClassResolver { + public const TYPE = 'Provider'; + /** * @param object|class-string $caller * * @throws ProviderNotFoundException */ - public function resolve(object|string $caller): AbstractProvider + public function resolve(object|string $caller): ?AbstractProvider { /** @var ?AbstractProvider $resolved */ $resolved = $this->doResolve($caller); - if ($resolved === null) { - throw new ProviderNotFoundException($caller); - } - return $resolved; } protected function getResolvableType(): string { - return 'Provider'; + return self::TYPE; } } diff --git a/tests/Feature/Framework/ExtendService/FeatureTest.php b/tests/Feature/Framework/ExtendService/FeatureTest.php index c512c3b0..d94755a5 100644 --- a/tests/Feature/Framework/ExtendService/FeatureTest.php +++ b/tests/Feature/Framework/ExtendService/FeatureTest.php @@ -7,7 +7,7 @@ use ArrayObject; use Gacela\Framework\Bootstrap\GacelaConfig; use Gacela\Framework\Gacela; -use GacelaTest\Feature\Framework\ExtendService\Module\Provider; +use GacelaTest\Feature\Framework\ExtendService\Module\DependencyProvider; use PHPUnit\Framework\TestCase; final class FeatureTest extends TestCase @@ -20,14 +20,14 @@ protected function setUp(): void $config->resetInMemoryCache(); $config->extendService( - Provider::ARRAY_AS_OBJECT, + DependencyProvider::ARRAY_AS_OBJECT, static function (ArrayObject $arrayObject): void { $arrayObject->append(3); }, ); $config->extendService( - Provider::ARRAY_FROM_FUNCTION, + DependencyProvider::ARRAY_FROM_FUNCTION, static function (ArrayObject $arrayObject): void { $arrayObject->append(4); }, diff --git a/tests/Feature/Framework/ExtendService/Module/Provider.php b/tests/Feature/Framework/ExtendService/Module/DependencyProvider.php similarity index 66% rename from tests/Feature/Framework/ExtendService/Module/Provider.php rename to tests/Feature/Framework/ExtendService/Module/DependencyProvider.php index 92399c98..6cbacb18 100644 --- a/tests/Feature/Framework/ExtendService/Module/Provider.php +++ b/tests/Feature/Framework/ExtendService/Module/DependencyProvider.php @@ -5,10 +5,14 @@ namespace GacelaTest\Feature\Framework\ExtendService\Module; use ArrayObject; -use Gacela\Framework\AbstractProvider; +use Gacela\Framework\AbstractDependencyProvider; use Gacela\Framework\Container\Container; -final class Provider extends AbstractProvider +/** + * Testing Backward Compatibility for AbstractDependencyProvider. + * Use AbstractProvider when AbstractDependencyProvider is completely removed. + */ +final class DependencyProvider extends AbstractDependencyProvider { public const ARRAY_AS_OBJECT = 'ARRAY_AS_OBJECT'; diff --git a/tests/Feature/Framework/ExtendService/Module/Factory.php b/tests/Feature/Framework/ExtendService/Module/Factory.php index b96d5fe8..818a8cea 100644 --- a/tests/Feature/Framework/ExtendService/Module/Factory.php +++ b/tests/Feature/Framework/ExtendService/Module/Factory.php @@ -11,11 +11,11 @@ final class Factory extends AbstractFactory { public function getArrayAsObject(): ArrayObject { - return $this->getProvidedDependency(Provider::ARRAY_AS_OBJECT); + return $this->getProvidedDependency(DependencyProvider::ARRAY_AS_OBJECT); } public function getArrayFromFunction(): ArrayObject { - return $this->getProvidedDependency(Provider::ARRAY_FROM_FUNCTION); + return $this->getProvidedDependency(DependencyProvider::ARRAY_FROM_FUNCTION); } } diff --git a/tests/Feature/Framework/MissingFile/FeatureTest.php b/tests/Feature/Framework/MissingFile/FeatureTest.php index 1a053fd8..2681c393 100644 --- a/tests/Feature/Framework/MissingFile/FeatureTest.php +++ b/tests/Feature/Framework/MissingFile/FeatureTest.php @@ -31,7 +31,7 @@ public function test_missing_config_module(): void self::assertInstanceOf(AbstractConfig::class, $facade->getConfig()); } - public function test_missing_dependency_provider_module(): void + public function test_missing_provider_module(): void { $this->expectException(ProviderNotFoundException::class); diff --git a/tests/Feature/Framework/MissingFile/MissingContainerServiceKey/DependencyProvider.php b/tests/Feature/Framework/MissingFile/MissingContainerServiceKey/Provider.php similarity index 100% rename from tests/Feature/Framework/MissingFile/MissingContainerServiceKey/DependencyProvider.php rename to tests/Feature/Framework/MissingFile/MissingContainerServiceKey/Provider.php diff --git a/tests/Unit/Framework/ClassResolver/ClassInfoTest.php b/tests/Unit/Framework/ClassResolver/ClassInfoTest.php index c30c5115..b0e902ec 100644 --- a/tests/Unit/Framework/ClassResolver/ClassInfoTest.php +++ b/tests/Unit/Framework/ClassResolver/ClassInfoTest.php @@ -4,8 +4,10 @@ namespace GacelaTest\Unit\Framework\ClassResolver; +use Gacela\Framework\AbstractDependencyProvider; use Gacela\Framework\AbstractFacade; use Gacela\Framework\ClassResolver\ClassInfo; +use Gacela\Framework\Container\Container; use GacelaTest\Fixtures\ClassInfoTestingFacade; use PHPUnit\Framework\TestCase; @@ -22,6 +24,20 @@ public function test_anonymous_class(): void self::assertSame('\module-name@anonymous\ClassInfoTest\Factory', $actual->getCacheKey(), 'cache key'); } + public function test_anonymous_dep_pro_class(): void + { + $dependencyProvider = new class() extends AbstractDependencyProvider { + public function provideModuleDependencies(Container $container): void + { + } + }; + $actual = ClassInfo::from($dependencyProvider, 'DependencyProvider'); + + self::assertSame('module-name@anonymous', $actual->getModuleNamespace(), 'full namespace'); + self::assertSame('module-name@anonymous\ClassInfoTest', $actual->getModuleName(), 'module'); + self::assertSame('\module-name@anonymous\ClassInfoTest\Provider', $actual->getCacheKey(), 'cache key'); + } + public function test_object_real_class(): void { $facade = new ClassInfoTestingFacade();