From a58be1d6f1720e51bd6ebf4472b7912b577b1636 Mon Sep 17 00:00:00 2001 From: Dmitry Derepko Date: Sun, 1 Aug 2021 13:06:05 +0300 Subject: [PATCH 1/6] Add lazy definition decorator --- composer.json | 4 ++ .../Decorator/LazyDefinitionDecorator.php | 32 ++++++++++++ tests/Support/NotFinalClass.php | 20 ++++++++ .../Decorator/LazyDefinitionDecoratorTest.php | 51 +++++++++++++++++++ 4 files changed, 107 insertions(+) create mode 100644 src/Definition/Decorator/LazyDefinitionDecorator.php create mode 100644 tests/Support/NotFinalClass.php create mode 100644 tests/Unit/Definition/Decorator/LazyDefinitionDecoratorTest.php diff --git a/composer.json b/composer.json index 2a2e2ccc..5ed3a8a0 100644 --- a/composer.json +++ b/composer.json @@ -20,12 +20,16 @@ "yiisoft/injector": "^1.0" }, "require-dev": { + "ocramius/proxy-manager": "^2.13", "phpunit/phpunit": "^9.5", "roave/infection-static-analysis-plugin": "^1.9", "spatie/phpunit-watcher": "^1.23", "vimeo/psalm": "^4.8", "yiisoft/test-support": "^1.3" }, + "suggest": { + "ocramius/proxy-manager": "Install this package if you want to use lazy loading." + }, "autoload": { "psr-4": { "Yiisoft\\Factory\\": "src" diff --git a/src/Definition/Decorator/LazyDefinitionDecorator.php b/src/Definition/Decorator/LazyDefinitionDecorator.php new file mode 100644 index 00000000..d7f669e8 --- /dev/null +++ b/src/Definition/Decorator/LazyDefinitionDecorator.php @@ -0,0 +1,32 @@ +definition = $definition; + $this->objectClass = $objectClass; + $this->factory = $factory; + } + + public function resolve(DependencyResolverInterface $container) + { + return $this->factory->createProxy( + $this->objectClass, + function (&$wrappedObject) use ($container) { + $wrappedObject = $this->definition->resolve($container); + } + ); + } +} diff --git a/tests/Support/NotFinalClass.php b/tests/Support/NotFinalClass.php new file mode 100644 index 00000000..bd0a3071 --- /dev/null +++ b/tests/Support/NotFinalClass.php @@ -0,0 +1,20 @@ +arguments = $arguments; + } + + public function getArguments(): array + { + return $this->arguments; + } +} diff --git a/tests/Unit/Definition/Decorator/LazyDefinitionDecoratorTest.php b/tests/Unit/Definition/Decorator/LazyDefinitionDecoratorTest.php new file mode 100644 index 00000000..a4de3324 --- /dev/null +++ b/tests/Unit/Definition/Decorator/LazyDefinitionDecoratorTest.php @@ -0,0 +1,51 @@ + $class, + ]); + $definition = new LazyDefinitionDecorator($factory, $definition, $class); + + $this->expectException(InvalidProxiedClassException::class); + $definition->resolve($dependencyResolver); + } + + public function testDecorateNotFinalClass(): void + { + $dependencyResolver = TestHelper::createDependencyResolver(); + $factory= new LazyLoadingValueHolderFactory(); + + $class = NotFinalClass::class; + + $definition = ArrayDefinition::fromConfig([ + ArrayDefinition::CLASS_NAME => $class, + ]); + $definition = new LazyDefinitionDecorator($factory, $definition, $class); + + $phone = $definition->resolve($dependencyResolver); + + self::assertInstanceOf(LazyLoadingInterface::class, $phone); + } +} From 9086ca7a7cbcdd0b7a0a42addccf11f545f0961d Mon Sep 17 00:00:00 2001 From: Dmitry Derepko Date: Sun, 1 Aug 2021 13:23:52 +0300 Subject: [PATCH 2/6] Add test for interface --- .../Decorator/LazyDefinitionDecoratorTest.php | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/tests/Unit/Definition/Decorator/LazyDefinitionDecoratorTest.php b/tests/Unit/Definition/Decorator/LazyDefinitionDecoratorTest.php index a4de3324..ffccfb08 100644 --- a/tests/Unit/Definition/Decorator/LazyDefinitionDecoratorTest.php +++ b/tests/Unit/Definition/Decorator/LazyDefinitionDecoratorTest.php @@ -10,6 +10,7 @@ use ProxyManager\Proxy\LazyLoadingInterface; use Yiisoft\Factory\Definition\ArrayDefinition; use Yiisoft\Factory\Definition\Decorator\LazyDefinitionDecorator; +use Yiisoft\Factory\Tests\Support\EngineInterface; use Yiisoft\Factory\Tests\Support\NotFinalClass; use Yiisoft\Factory\Tests\Support\Phone; use Yiisoft\Factory\Tests\TestHelper; @@ -48,4 +49,21 @@ public function testDecorateNotFinalClass(): void self::assertInstanceOf(LazyLoadingInterface::class, $phone); } + + public function testDecorateInterface(): void + { + $dependencyResolver = TestHelper::createDependencyResolver(); + $factory= new LazyLoadingValueHolderFactory(); + + $class = EngineInterface::class; + + $definition = ArrayDefinition::fromConfig([ + ArrayDefinition::CLASS_NAME => $class, + ]); + $definition = new LazyDefinitionDecorator($factory, $definition, $class); + + $phone = $definition->resolve($dependencyResolver); + + self::assertInstanceOf(LazyLoadingInterface::class, $phone); + } } From e4ca313818e3f681ce0b795e802ae7af8efae12b Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Sun, 1 Aug 2021 10:30:35 +0000 Subject: [PATCH 3/6] Apply fixes from StyleCI --- src/Definition/Decorator/LazyDefinitionDecorator.php | 1 + .../Definition/Decorator/LazyDefinitionDecoratorTest.php | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Definition/Decorator/LazyDefinitionDecorator.php b/src/Definition/Decorator/LazyDefinitionDecorator.php index d7f669e8..551894e0 100644 --- a/src/Definition/Decorator/LazyDefinitionDecorator.php +++ b/src/Definition/Decorator/LazyDefinitionDecorator.php @@ -1,4 +1,5 @@ Date: Sun, 20 Nov 2022 08:00:52 +0000 Subject: [PATCH 4/6] [ci-review] Apply changes from Rector action. --- src/Definition/Decorator/LazyDefinitionDecorator.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/src/Definition/Decorator/LazyDefinitionDecorator.php b/src/Definition/Decorator/LazyDefinitionDecorator.php index 551894e0..68be25e0 100644 --- a/src/Definition/Decorator/LazyDefinitionDecorator.php +++ b/src/Definition/Decorator/LazyDefinitionDecorator.php @@ -11,14 +11,10 @@ final class LazyDefinitionDecorator implements DefinitionInterface { private DefinitionInterface $definition; - private string $objectClass; - private LazyLoadingValueHolderFactory $factory; - public function __construct(LazyLoadingValueHolderFactory $factory, DefinitionInterface $definition, string $objectClass) + public function __construct(private LazyLoadingValueHolderFactory $factory, DefinitionInterface $definition, private string $objectClass) { $this->definition = $definition; - $this->objectClass = $objectClass; - $this->factory = $factory; } public function resolve(DependencyResolverInterface $container) From 366c6b18229b87aac8d083122ddcd03cc35a1c77 Mon Sep 17 00:00:00 2001 From: Dmitrii Derepko Date: Sun, 20 Nov 2022 11:17:23 +0300 Subject: [PATCH 5/6] Fix tests --- .../Decorator/LazyDefinitionDecorator.php | 6 +++--- .../Decorator/LazyDefinitionDecoratorTest.php | 16 ++++++++-------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/src/Definition/Decorator/LazyDefinitionDecorator.php b/src/Definition/Decorator/LazyDefinitionDecorator.php index 551894e0..b6e0dc91 100644 --- a/src/Definition/Decorator/LazyDefinitionDecorator.php +++ b/src/Definition/Decorator/LazyDefinitionDecorator.php @@ -5,8 +5,8 @@ namespace Yiisoft\Factory\Definition\Decorator; use ProxyManager\Factory\LazyLoadingValueHolderFactory; -use Yiisoft\Factory\Definition\DefinitionInterface; -use Yiisoft\Factory\DependencyResolverInterface; +use Psr\Container\ContainerInterface; +use Yiisoft\Definitions\Contract\DefinitionInterface; final class LazyDefinitionDecorator implements DefinitionInterface { @@ -21,7 +21,7 @@ public function __construct(LazyLoadingValueHolderFactory $factory, DefinitionIn $this->factory = $factory; } - public function resolve(DependencyResolverInterface $container) + public function resolve(ContainerInterface $container): mixed { return $this->factory->createProxy( $this->objectClass, diff --git a/tests/Unit/Definition/Decorator/LazyDefinitionDecoratorTest.php b/tests/Unit/Definition/Decorator/LazyDefinitionDecoratorTest.php index caa5bfc3..76580ff6 100644 --- a/tests/Unit/Definition/Decorator/LazyDefinitionDecoratorTest.php +++ b/tests/Unit/Definition/Decorator/LazyDefinitionDecoratorTest.php @@ -8,18 +8,18 @@ use ProxyManager\Exception\InvalidProxiedClassException; use ProxyManager\Factory\LazyLoadingValueHolderFactory; use ProxyManager\Proxy\LazyLoadingInterface; -use Yiisoft\Factory\Definition\ArrayDefinition; +use Yiisoft\Definitions\ArrayDefinition; use Yiisoft\Factory\Definition\Decorator\LazyDefinitionDecorator; use Yiisoft\Factory\Tests\Support\EngineInterface; use Yiisoft\Factory\Tests\Support\NotFinalClass; use Yiisoft\Factory\Tests\Support\Phone; -use Yiisoft\Factory\Tests\TestHelper; +use Yiisoft\Test\Support\Container\SimpleContainer; final class LazyDefinitionDecoratorTest extends TestCase { public function testDecorateFinalClass(): void { - $dependencyResolver = TestHelper::createDependencyResolver(); + $container = new SimpleContainer(); $factory = new LazyLoadingValueHolderFactory(); $class = Phone::class; @@ -30,12 +30,12 @@ public function testDecorateFinalClass(): void $definition = new LazyDefinitionDecorator($factory, $definition, $class); $this->expectException(InvalidProxiedClassException::class); - $definition->resolve($dependencyResolver); + $definition->resolve($container); } public function testDecorateNotFinalClass(): void { - $dependencyResolver = TestHelper::createDependencyResolver(); + $container = new SimpleContainer(); $factory = new LazyLoadingValueHolderFactory(); $class = NotFinalClass::class; @@ -45,14 +45,14 @@ public function testDecorateNotFinalClass(): void ]); $definition = new LazyDefinitionDecorator($factory, $definition, $class); - $phone = $definition->resolve($dependencyResolver); + $phone = $definition->resolve($container); self::assertInstanceOf(LazyLoadingInterface::class, $phone); } public function testDecorateInterface(): void { - $dependencyResolver = TestHelper::createDependencyResolver(); + $container = new SimpleContainer(); $factory = new LazyLoadingValueHolderFactory(); $class = EngineInterface::class; @@ -62,7 +62,7 @@ public function testDecorateInterface(): void ]); $definition = new LazyDefinitionDecorator($factory, $definition, $class); - $phone = $definition->resolve($dependencyResolver); + $phone = $definition->resolve($container); self::assertInstanceOf(LazyLoadingInterface::class, $phone); } From f333924366ab9e34ae7b4066f7acd5ed791bd20b Mon Sep 17 00:00:00 2001 From: rector-bot Date: Sun, 20 Nov 2022 08:20:46 +0000 Subject: [PATCH 6/6] [ci-review] Apply changes from Rector action. --- src/Definition/Decorator/LazyDefinitionDecorator.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/Definition/Decorator/LazyDefinitionDecorator.php b/src/Definition/Decorator/LazyDefinitionDecorator.php index 701a3f25..e7a010b8 100644 --- a/src/Definition/Decorator/LazyDefinitionDecorator.php +++ b/src/Definition/Decorator/LazyDefinitionDecorator.php @@ -10,11 +10,8 @@ final class LazyDefinitionDecorator implements DefinitionInterface { - private DefinitionInterface $definition; - - public function __construct(private LazyLoadingValueHolderFactory $factory, DefinitionInterface $definition, private string $objectClass) + public function __construct(private LazyLoadingValueHolderFactory $factory, private DefinitionInterface $definition, private string $objectClass) { - $this->definition = $definition; } public function resolve(ContainerInterface $container): mixed