diff --git a/src/ParameterResolver/Container/TypeHintContainerResolver.php b/src/ParameterResolver/Container/TypeHintContainerResolver.php index abfa940..b5fcb92 100644 --- a/src/ParameterResolver/Container/TypeHintContainerResolver.php +++ b/src/ParameterResolver/Container/TypeHintContainerResolver.php @@ -51,6 +51,9 @@ public function getParameters( } $parameterClass = $parameterType->getName(); + if ($parameterClass === 'self') { + $parameterClass = $parameter->getDeclaringClass()->getName(); + } if ($this->container->has($parameterClass)) { $resolvedParameters[$index] = $this->container->get($parameterClass); diff --git a/src/ParameterResolver/TypeHintResolver.php b/src/ParameterResolver/TypeHintResolver.php index e44e32c..fd6a449 100644 --- a/src/ParameterResolver/TypeHintResolver.php +++ b/src/ParameterResolver/TypeHintResolver.php @@ -40,6 +40,9 @@ public function getParameters( } $parameterClass = $parameterType->getName(); + if ($parameterClass === 'self') { + $parameterClass = $parameter->getDeclaringClass()->getName(); + } if (array_key_exists($parameterClass, $providedParameters)) { $resolvedParameters[$index] = $providedParameters[$parameterClass]; diff --git a/tests/ParameterResolver/Container/TypeHintContainerResolverTest.php b/tests/ParameterResolver/Container/TypeHintContainerResolverTest.php index 9b44c53..3f849f6 100644 --- a/tests/ParameterResolver/Container/TypeHintContainerResolverTest.php +++ b/tests/ParameterResolver/Container/TypeHintContainerResolverTest.php @@ -27,17 +27,19 @@ public function setUp(): void */ public function should_resolve_parameter_with_typehint_and_container() { - $callable = function (TypeHintContainerResolverFixture $foo) { + $callable = function (TypeHintContainerResolverFixture $foo, self $bar) { }; $reflection = new \ReflectionFunction($callable); $fixture = new TypeHintContainerResolverFixture; $this->container->set(self::FIXTURE, $fixture); + $this->container->set(self::class, $this); $parameters = $this->resolver->getParameters($reflection, [], []); - $this->assertCount(1, $parameters); + $this->assertCount(2, $parameters); $this->assertSame($fixture, $parameters[0]); + $this->assertSame($this, $parameters[1]); } /** diff --git a/tests/ParameterResolver/TypeHintResolverTest.php b/tests/ParameterResolver/TypeHintResolverTest.php index e37d20e..a0f980e 100644 --- a/tests/ParameterResolver/TypeHintResolverTest.php +++ b/tests/ParameterResolver/TypeHintResolverTest.php @@ -22,16 +22,20 @@ public function setUp(): void */ public function should_resolve_parameter_with_typehint() { - $callable = function (TypeHintResolverFixture $foo) { + $callable = function (TypeHintResolverFixture $foo, self $bar) { }; $reflection = new \ReflectionFunction($callable); $fixture = new TypeHintResolverFixture; - $parameters = $this->resolver->getParameters($reflection, [self::FIXTURE => $fixture], []); - - $this->assertCount(1, $parameters); + $parameters = $this->resolver->getParameters( + $reflection, + [self::FIXTURE => $fixture, self::class => $this], + [] + ); + $this->assertCount(2, $parameters); $this->assertSame($fixture, $parameters[0]); + $this->assertSame($this, $parameters[1]); } /** @@ -64,6 +68,7 @@ public function should_skip_parameter_if_already_resolved() $this->assertSame($resolvedParameters, $parameters); } + } class TypeHintResolverFixture