Skip to content

Commit

Permalink
fix: BC with current AbstractDependencyProvider behaviour
Browse files Browse the repository at this point in the history
  • Loading branch information
Chemaclass committed Aug 17, 2024
1 parent d169660 commit ccaeb33
Show file tree
Hide file tree
Showing 12 changed files with 98 additions and 27 deletions.
1 change: 1 addition & 0 deletions psalm.xml
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
</plugins>

<issueHandlers>
<DeprecatedClass errorLevel="suppress" />
<MoreSpecificReturnType errorLevel="suppress" />
<LessSpecificReturnStatement errorLevel="suppress" />
<UnsafeInstantiation errorLevel="suppress" />
Expand Down
16 changes: 7 additions & 9 deletions src/Console/Domain/AllAppModules/AppModuleCreator.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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;
}
}
13 changes: 11 additions & 2 deletions src/Framework/AbstractFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
}
Expand Down
16 changes: 14 additions & 2 deletions src/Framework/ClassResolver/AbstractClassResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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));
Expand All @@ -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];
Expand Down Expand Up @@ -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,
};
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
<?php

declare(strict_types=1);

namespace Gacela\Framework\ClassResolver\Provider;

use Gacela\Framework\AbstractDependencyProvider;
use Gacela\Framework\AbstractProvider;
use Gacela\Framework\ClassResolver\AbstractClassResolver;

/**
* @psalm-suppress DeprecatedClass
*/
final class DependencyProviderResolver extends AbstractClassResolver
{
public const TYPE = 'DependencyProvider';

/**
* @param object|class-string $caller
*/
public function resolve(object|string $caller): ?AbstractProvider
{
/** @var ?AbstractDependencyProvider $resolved */
$resolved = $this->doResolve($caller);

return $resolved;
}

protected function getResolvableType(): string
{
return self::TYPE;
}
}
10 changes: 4 additions & 6 deletions src/Framework/ClassResolver/Provider/ProviderResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}
}
6 changes: 3 additions & 3 deletions tests/Feature/Framework/ExtendService/FeatureTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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);
},
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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';

Expand Down
4 changes: 2 additions & 2 deletions tests/Feature/Framework/ExtendService/Module/Factory.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
2 changes: 1 addition & 1 deletion tests/Feature/Framework/MissingFile/FeatureTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down
16 changes: 16 additions & 0 deletions tests/Unit/Framework/ClassResolver/ClassInfoTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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();
Expand Down

0 comments on commit ccaeb33

Please sign in to comment.