Skip to content

Commit bda3652

Browse files
Removed proxy mode from Hyperf\Di\ClassLoader and Optimized Composer::getLoader(). (#4961)
Co-authored-by: 李铭昕 <[email protected]>
1 parent a6bba3f commit bda3652

File tree

5 files changed

+29
-81
lines changed

5 files changed

+29
-81
lines changed

src/Annotation/Scanner.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,11 @@
1313

1414
use Hyperf\Config\ProviderConfig;
1515
use Hyperf\Di\Aop\ProxyManager;
16-
use Hyperf\Di\ClassLoader;
1716
use Hyperf\Di\Exception\DirectoryNotExistException;
1817
use Hyperf\Di\MetadataCollector;
1918
use Hyperf\Di\ReflectionManager;
2019
use Hyperf\Di\ScanHandler\ScanHandlerInterface;
20+
use Hyperf\Utils\Composer;
2121
use Hyperf\Utils\Filesystem\Filesystem;
2222
use ReflectionClass;
2323

@@ -27,7 +27,7 @@ class Scanner
2727

2828
protected string $path = BASE_PATH . '/runtime/container/scan.cache';
2929

30-
public function __construct(protected ClassLoader $classloader, protected ScanConfig $scanConfig, protected ScanHandlerInterface $handler)
30+
public function __construct(protected ScanConfig $scanConfig, protected ScanHandlerInterface $handler)
3131
{
3232
$this->filesystem = new Filesystem();
3333
}
@@ -313,7 +313,7 @@ protected function getChangedAspects(array $aspects, int $lastCacheModified): ar
313313
}
314314
}
315315
foreach ($classes as $class) {
316-
$file = $this->classloader->getComposerClassLoader()->findFile($class);
316+
$file = Composer::getLoader()->findFile($class);
317317
if ($file === false) {
318318
echo sprintf('Skip class %s, because it does not exist in composer class loader.', $class) . PHP_EOL;
319319
continue;

src/ClassLoader.php

+11-64
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111
*/
1212
namespace Hyperf\Di;
1313

14-
use Composer\Autoload\ClassLoader as ComposerClassLoader;
1514
use Dotenv\Dotenv;
1615
use Dotenv\Repository\Adapter;
1716
use Dotenv\Repository\RepositoryBuilder;
@@ -24,34 +23,6 @@
2423

2524
class ClassLoader
2625
{
27-
protected ComposerClassLoader $composerClassLoader;
28-
29-
public function __construct(ComposerClassLoader $classLoader, string $proxyFileDir, string $configDir, ScanHandlerInterface $handler)
30-
{
31-
$this->setComposerClassLoader($classLoader);
32-
if (file_exists(BASE_PATH . '/.env')) {
33-
$this->loadDotenv();
34-
}
35-
36-
// Scan by ScanConfig to generate the reflection class map
37-
$config = ScanConfig::instance($configDir);
38-
$classLoader->addClassMap($config->getClassMap());
39-
40-
$scanner = new Scanner($this, $config, $handler);
41-
$classLoader->addClassMap(
42-
$scanner->scan($classLoader->getClassMap(), $proxyFileDir)
43-
);
44-
}
45-
46-
public function loadClass(string $class): void
47-
{
48-
$path = $this->locateFile($class);
49-
50-
if ($path) {
51-
include $path;
52-
}
53-
}
54-
5526
public static function init(?string $proxyFileDirPath = null, ?string $configDir = null, ?ScanHandlerInterface $handler = null): void
5627
{
5728
if (! $proxyFileDirPath) {
@@ -68,50 +39,26 @@ public static function init(?string $proxyFileDirPath = null, ?string $configDir
6839
$handler = new PcntlScanHandler();
6940
}
7041

71-
$loaders = spl_autoload_functions();
42+
$composerLoader = Composer::getLoader();
7243

73-
// Proxy the composer class loader
74-
foreach ($loaders as &$loader) {
75-
$unregisterLoader = $loader;
76-
if (is_array($loader) && $loader[0] instanceof ComposerClassLoader) {
77-
/** @var ComposerClassLoader $composerClassLoader */
78-
$composerClassLoader = $loader[0];
79-
$loader[0] = new static($composerClassLoader, $proxyFileDirPath, $configDir, $handler);
80-
}
81-
spl_autoload_unregister($unregisterLoader);
44+
if (file_exists(BASE_PATH . '/.env')) {
45+
static::loadDotenv();
8246
}
8347

84-
unset($loader);
48+
// Scan by ScanConfig to generate the reflection class map
49+
$config = ScanConfig::instance($configDir);
50+
$composerLoader->addClassMap($config->getClassMap());
8551

86-
// Re-register the loaders
87-
foreach ($loaders as $loader) {
88-
spl_autoload_register($loader);
89-
}
52+
$scanner = new Scanner($config, $handler);
53+
$composerLoader->addClassMap(
54+
$scanner->scan($composerLoader->getClassMap(), $proxyFileDirPath)
55+
);
9056

9157
// Initialize Lazy Loader. This will prepend LazyLoader to the top of autoload queue.
9258
LazyLoader::bootstrap($configDir);
9359
}
9460

95-
public function setComposerClassLoader(ComposerClassLoader $classLoader): self
96-
{
97-
$this->composerClassLoader = $classLoader;
98-
// Set the ClassLoader to Hyperf\Utils\Composer to avoid unnecessary find process.
99-
Composer::setLoader($classLoader);
100-
return $this;
101-
}
102-
103-
public function getComposerClassLoader(): ComposerClassLoader
104-
{
105-
return $this->composerClassLoader;
106-
}
107-
108-
protected function locateFile(string $className): ?string
109-
{
110-
$file = $this->getComposerClassLoader()->findFile($className);
111-
return is_string($file) ? $file : null;
112-
}
113-
114-
protected function loadDotenv(): void
61+
protected static function loadDotenv(): void
11562
{
11663
$repository = RepositoryBuilder::createWithNoAdapters()
11764
->addAdapter(Adapter\PutenvAdapter::class)

tests/Annotation/ScannerTest.php

+11-8
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,10 @@
1515
use Hyperf\Di\Annotation\AnnotationReader;
1616
use Hyperf\Di\Annotation\ScanConfig;
1717
use Hyperf\Di\Annotation\Scanner;
18-
use Hyperf\Di\ClassLoader;
1918
use Hyperf\Di\ReflectionManager;
2019
use Hyperf\Di\ScanHandler\NullScanHandler;
2120
use Hyperf\Utils\ApplicationContext;
21+
use Hyperf\Utils\Composer;
2222
use Hyperf\Utils\Filesystem\Filesystem;
2323
use HyperfTest\Di\Stub\AnnotationCollector;
2424
use HyperfTest\Di\Stub\Aspect\Debug1Aspect;
@@ -40,19 +40,22 @@ protected function tearDown(): void
4040
AnnotationCollector::clear();
4141
Mockery::close();
4242
ReflectionManager::clear();
43+
(function () {
44+
self::$classLoader = null;
45+
})->call(new Composer());
4346
}
4447

4548
public function testGetChangedAspects()
4649
{
4750
$this->getContainer();
48-
$scanner = new Scanner($loader = Mockery::mock(ClassLoader::class), new ScanConfig(false, '/'), new NullScanHandler());
49-
$loader->shouldReceive('getComposerClassLoader')->andReturnUsing(function () {
50-
$loader = Mockery::mock(\Composer\Autoload\ClassLoader::class);
51-
$loader->shouldReceive('findFile')->andReturnUsing(function ($class) {
52-
return $class;
53-
});
54-
return $loader;
51+
52+
$loader = Mockery::mock(\Composer\Autoload\ClassLoader::class);
53+
$loader->shouldReceive('findFile')->andReturnUsing(function ($class) {
54+
return $class;
5555
});
56+
Composer::setLoader($loader);
57+
58+
$scanner = new Scanner(new ScanConfig(false, '/'), new NullScanHandler());
5659
$ref = new \ReflectionClass($scanner);
5760
$property = $ref->getProperty('filesystem');
5861
$property->setAccessible(true);

tests/AnnotationTest.php

+2-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313

1414
use Hyperf\Di\Annotation\ScanConfig;
1515
use Hyperf\Di\Annotation\Scanner;
16-
use Hyperf\Di\ClassLoader;
1716
use Hyperf\Di\Exception\DirectoryNotExistException;
1817
use Hyperf\Di\ScanHandler\NullScanHandler;
1918
use Mockery;
@@ -32,7 +31,7 @@ protected function tearDown(): void
3231

3332
public function testScanAnnotationsDirectoryNotExist()
3433
{
35-
$scanner = new Scanner($loader = Mockery::mock(ClassLoader::class), new ScanConfig(false, '/'), new NullScanHandler());
34+
$scanner = new Scanner(new ScanConfig(false, '/'), new NullScanHandler());
3635
$ref = new \ReflectionClass($scanner);
3736
$method = $ref->getMethod('normalizeDir');
3837
$method->setAccessible(true);
@@ -43,7 +42,7 @@ public function testScanAnnotationsDirectoryNotExist()
4342

4443
public function testScanAnnotationsDirectoryEmpty()
4544
{
46-
$scanner = new Scanner($loader = Mockery::mock(ClassLoader::class), new ScanConfig(false, '/'), new NullScanHandler());
45+
$scanner = new Scanner(new ScanConfig(false, '/'), new NullScanHandler());
4746
$ref = new \ReflectionClass($scanner);
4847
$method = $ref->getMethod('normalizeDir');
4948
$method->setAccessible(true);

tests/InjectTest.php

+2-3
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
use Hyperf\Di\Annotation\ScanConfig;
1919
use Hyperf\Di\Annotation\Scanner;
2020
use Hyperf\Di\Aop\Ast;
21-
use Hyperf\Di\ClassLoader;
2221
use Hyperf\Di\Exception\AnnotationException;
2322
use Hyperf\Di\ReflectionManager;
2423
use Hyperf\Di\ScanHandler\NullScanHandler;
@@ -242,7 +241,7 @@ public function testInjectParentPrivateProperty()
242241
public function testInjectException()
243242
{
244243
try {
245-
$scanner = new Scanner(Mockery::mock(ClassLoader::class), new ScanConfig(false, '/'), new NullScanHandler());
244+
$scanner = new Scanner(new ScanConfig(false, '/'), new NullScanHandler());
246245
$reader = new AnnotationReader();
247246
$scanner->collect($reader, ReflectionManager::reflectClass(DemoInjectException::class));
248247
} catch (\Exception $e) {
@@ -271,7 +270,7 @@ protected function getContainer(array $classes = [])
271270
throw new Exception('The process fork failed');
272271
}
273272
if ($pid === 0) {
274-
$scanner = new Scanner($loader = Mockery::mock(ClassLoader::class), new ScanConfig(false, '/'), new NullScanHandler());
273+
$scanner = new Scanner(new ScanConfig(false, '/'), new NullScanHandler());
275274
$reader = new AnnotationReader();
276275

277276
if (empty($classes)) {

0 commit comments

Comments
 (0)