Skip to content

Commit a30bdb6

Browse files
Optimized code for Hyperf\Di\Resolver\ResolverDispatcher. (#4977)
Co-authored-by: 李铭昕 <[email protected]>
1 parent 60d6469 commit a30bdb6

File tree

2 files changed

+58
-22
lines changed

2 files changed

+58
-22
lines changed

src/Resolver/ResolverDispatcher.php

+13-22
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ public function resolve(DefinitionInterface $definition, array $parameters = [])
4545

4646
$guard = DepthGuard::getInstance();
4747

48-
return $guard->call($definition->getName(), function () use ($definition, $parameters) {
49-
$resolver = $this->getDefinitionResolver($definition);
50-
return $resolver->resolve($definition, $parameters);
51-
});
48+
return $guard->call(
49+
$definition->getName(),
50+
fn () => $this->getDefinitionResolver($definition)->resolve($definition, $parameters)
51+
);
5252
}
5353

5454
/**
@@ -65,10 +65,10 @@ public function isResolvable(DefinitionInterface $definition, array $parameters
6565

6666
$guard = DepthGuard::getInstance();
6767

68-
return $guard->call($definition->getName(), function () use ($definition, $parameters) {
69-
$resolver = $this->getDefinitionResolver($definition);
70-
return $resolver->isResolvable($definition, $parameters);
71-
});
68+
return $guard->call(
69+
$definition->getName(),
70+
fn () => $this->getDefinitionResolver($definition)->isResolvable($definition, $parameters)
71+
);
7272
}
7373

7474
/**
@@ -78,19 +78,10 @@ public function isResolvable(DefinitionInterface $definition, array $parameters
7878
*/
7979
private function getDefinitionResolver(DefinitionInterface $definition): ResolverInterface
8080
{
81-
switch (true) {
82-
case $definition instanceof ObjectDefinition:
83-
if (! $this->objectResolver) {
84-
$this->objectResolver = new ObjectResolver($this->container, $this);
85-
}
86-
return $this->objectResolver;
87-
case $definition instanceof FactoryDefinition:
88-
if (! $this->factoryResolver) {
89-
$this->factoryResolver = new FactoryResolver($this->container, $this);
90-
}
91-
return $this->factoryResolver;
92-
default:
93-
throw new RuntimeException('No definition resolver was configured for definition of type ' . get_class($definition));
94-
}
81+
return match (true) {
82+
$definition instanceof ObjectDefinition => $this->objectResolver ??= new ObjectResolver($this->container, $this),
83+
$definition instanceof FactoryDefinition => $this->factoryResolver ??= new FactoryResolver($this->container, $this),
84+
default => throw new RuntimeException('No definition resolver was configured for definition of type ' . get_class($definition)),
85+
};
9586
}
9687
}

tests/ResolverDispatcherTest.php

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
/**
5+
* This file is part of Hyperf.
6+
*
7+
* @link https://www.hyperf.io
8+
* @document https://hyperf.wiki
9+
* @contact [email protected]
10+
* @license https://github.com/hyperf/hyperf/blob/master/LICENSE
11+
*/
12+
namespace HyperfTest\Di;
13+
14+
use Hyperf\Di\Definition\FactoryDefinition;
15+
use Hyperf\Di\Resolver\FactoryResolver;
16+
use Hyperf\Di\Resolver\ResolverDispatcher;
17+
use Hyperf\Utils\Reflection\ClassInvoker;
18+
use Mockery;
19+
use PHPUnit\Framework\TestCase;
20+
use Psr\Container\ContainerInterface;
21+
22+
/**
23+
* @internal
24+
* @coversNothing
25+
*/
26+
class ResolverDispatcherTest extends TestCase
27+
{
28+
protected function tearDown(): void
29+
{
30+
Mockery::close();
31+
}
32+
33+
public function testGetDefinitionResolver()
34+
{
35+
$container = Mockery::mock(ContainerInterface::class);
36+
$dispatcher = new ClassInvoker(new ResolverDispatcher($container));
37+
$resolver = $dispatcher->getDefinitionResolver(Mockery::mock(FactoryDefinition::class));
38+
$this->assertInstanceOf(FactoryResolver::class, $resolver);
39+
$this->assertSame($resolver, $dispatcher->factoryResolver);
40+
41+
$resolver2 = $dispatcher->getDefinitionResolver(Mockery::mock(FactoryDefinition::class));
42+
$this->assertInstanceOf(FactoryResolver::class, $resolver2);
43+
$this->assertSame($resolver2, $dispatcher->factoryResolver);
44+
}
45+
}

0 commit comments

Comments
 (0)