Skip to content

Commit 2bf6afc

Browse files
committed
Add support for 'self' type hint
1 parent 8e7f353 commit 2bf6afc

File tree

4 files changed

+19
-6
lines changed

4 files changed

+19
-6
lines changed

src/ParameterResolver/Container/TypeHintContainerResolver.php

+3
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ public function getParameters(
5151
}
5252

5353
$parameterClass = $parameterType->getName();
54+
if ($parameterClass === 'self') {
55+
$parameterClass = $parameter->getDeclaringClass()->getName();
56+
}
5457

5558
if ($this->container->has($parameterClass)) {
5659
$resolvedParameters[$index] = $this->container->get($parameterClass);

src/ParameterResolver/TypeHintResolver.php

+3
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,9 @@ public function getParameters(
4040
}
4141

4242
$parameterClass = $parameterType->getName();
43+
if ($parameterClass === 'self') {
44+
$parameterClass = $parameter->getDeclaringClass()->getName();
45+
}
4346

4447
if (array_key_exists($parameterClass, $providedParameters)) {
4548
$resolvedParameters[$index] = $providedParameters[$parameterClass];

tests/ParameterResolver/Container/TypeHintContainerResolverTest.php

+4-2
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,19 @@ public function setUp(): void
2727
*/
2828
public function should_resolve_parameter_with_typehint_and_container()
2929
{
30-
$callable = function (TypeHintContainerResolverFixture $foo) {
30+
$callable = function (TypeHintContainerResolverFixture $foo, self $bar) {
3131
};
3232
$reflection = new \ReflectionFunction($callable);
3333

3434
$fixture = new TypeHintContainerResolverFixture;
3535
$this->container->set(self::FIXTURE, $fixture);
36+
$this->container->set(self::class, $this);
3637

3738
$parameters = $this->resolver->getParameters($reflection, [], []);
3839

39-
$this->assertCount(1, $parameters);
40+
$this->assertCount(2, $parameters);
4041
$this->assertSame($fixture, $parameters[0]);
42+
$this->assertSame($this, $parameters[1]);
4143
}
4244

4345
/**

tests/ParameterResolver/TypeHintResolverTest.php

+9-4
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,20 @@ public function setUp(): void
2222
*/
2323
public function should_resolve_parameter_with_typehint()
2424
{
25-
$callable = function (TypeHintResolverFixture $foo) {
25+
$callable = function (TypeHintResolverFixture $foo, self $bar) {
2626
};
2727
$reflection = new \ReflectionFunction($callable);
2828

2929
$fixture = new TypeHintResolverFixture;
3030

31-
$parameters = $this->resolver->getParameters($reflection, [self::FIXTURE => $fixture], []);
32-
33-
$this->assertCount(1, $parameters);
31+
$parameters = $this->resolver->getParameters(
32+
$reflection,
33+
[self::FIXTURE => $fixture, self::class => $this],
34+
[]
35+
);
36+
$this->assertCount(2, $parameters);
3437
$this->assertSame($fixture, $parameters[0]);
38+
$this->assertSame($this, $parameters[1]);
3539
}
3640

3741
/**
@@ -64,6 +68,7 @@ public function should_skip_parameter_if_already_resolved()
6468

6569
$this->assertSame($resolvedParameters, $parameters);
6670
}
71+
6772
}
6873

6974
class TypeHintResolverFixture

0 commit comments

Comments
 (0)