Răsfoiți Sursa

refactor(autoload): 重构扩展自动加载逻辑

- 修改 AutoloadService 类,新增 load 方法替代 init 方法
- 更新 CoreService 类,使用新的 load 方法加载扩展
- 移除 ExtensionInstaller 类中未使用的 getInstallPath 方法
- 删除 Plugin 类中冗余的 onPrePackageInstall 检查
runphp 7 luni în urmă
părinte
comite
67be81c946
4 a modificat fișierele cu 22 adăugiri și 50 ștergeri
  1. 0 9
      src/ExtensionInstaller.php
  2. 0 21
      src/Plugin.php
  3. 7 17
      src/Service/AutoloadService.php
  4. 15 3
      src/Service/CoreService.php

+ 0 - 9
src/ExtensionInstaller.php

@@ -12,13 +12,4 @@ class ExtensionInstaller extends LibraryInstaller
     {
         return $packageType === $this->type;
     }
-
-    public function getInstallPath(PackageInterface $package): string
-    {
-        if (!isset($package->getExtra()['sixshop']['id'])) {
-            throw new \InvalidArgumentException('Extension id not found in extra.sixshop.id');
-        }
-        $id = $package->getExtra()['sixshop']['id'];
-        return 'extension/' . $id;
-    }
 }

+ 0 - 21
src/Plugin.php

@@ -33,27 +33,6 @@ class Plugin implements PluginInterface, EventSubscriberInterface
 
     public function onPrePackageInstall(PackageEvent $event): bool
     {
-        $package = $event->getOperation()->getPackage();
-        $extra = $package->getExtra();
-        if (!isset($extra['sixshop'])) {
-            return true;
-        }
-        if (!isset($extra['sixshop']['id']) || !isset($extra['sixshop']['class'])) {
-            throw new \RuntimeException('Invalid sixshop extension configuration');
-        }
-        $extensionId = $extra['sixshop']['id'];
-        $installedPackages = InstalledVersions::getInstalledPackagesByType(self::EXTENSION_TYPE);
-        foreach ($installedPackages as $installedPackage) {
-            $installPath = InstalledVersions::getInstallPath($installedPackage);
-            if (!file_exists($installPath . '/composer.json')) {
-                continue;
-            }
-            $composerJson = new JsonFile($installPath . '/composer.json');
-            $composer = $composerJson->read();
-            if ($composer['extra']['sixshop']['id'] === $extensionId) {
-                throw new \RuntimeException("Extension ID '{$extensionId}' already exists. Please use a unique ID for your extension.");
-            }
-        }
         return true;
     }
 

+ 7 - 17
src/Service/AutoloadService.php

@@ -15,26 +15,16 @@ class AutoloadService
     {
     }
 
-    public function init(): void
+    public function load(array $extensionComposerMap, array $extensionNameList): void
     {
+        foreach ($extensionComposerMap as $extensionID => $composerFile) {
+            $this->app->bind('extension.' . $extensionID, $composerFile['extra']['sixshop']['class']);
+        }
         $extensionPath = Helper::extension_path();
         $classLoader = $this->app->classLoader;
-        foreach (Helper::extension_name_list() as $moduleName) {
+        foreach ($extensionNameList as $moduleName) {
             $dir = $extensionPath . $moduleName;
-            if (file_exists($dir . '/composer.json')) {
-                $composerJson = new JsonFile($dir . '/composer.json');
-                $composer = $composerJson->read();
-                $autoload = $composer['autoload'] ?? [];
-                $autoload['psr-4'] = $autoload['psr-4'] ?? [];
-                foreach ($autoload['psr-4'] as $namespace => $path) {
-                    $classLoader->addPsr4($namespace, $dir . '/' . $path);
-                }
-                $autoload['files'] = $autoload['files'] ?? [];
-                foreach ($autoload['files'] as $file) {
-                    require_once $dir . '/' . $file;
-                }
-                $extensionClass = $composer['extra']['sixshop']['class'];
-            } else {
+            if (!file_exists($dir . '/composer.json')) {
                 $namespace = "SixShop\\Extension\\$moduleName\\";
                 $path = $dir . '/src';
                 if (!isset($classLoader->getPrefixesPsr4()[$namespace])) {
@@ -45,8 +35,8 @@ class AutoloadService
                     }
                 }
                 $extensionClass = $namespace . 'Extension';
+                $this->app->bind('extension.' . $moduleName, $extensionClass);
             }
-            $this->app->bind('extension.' . $moduleName, $extensionClass);
         }
     }
 

+ 15 - 3
src/Service/CoreService.php

@@ -6,6 +6,7 @@ namespace SixShop\Core\Service;
 use Composer\InstalledVersions;
 use Composer\Json\JsonFile;
 use SixShop\Core\Exception\ExceptionHandle;
+use SixShop\Core\Helper;
 use SixShop\Core\Plugin;
 use SixShop\Core\Request;
 use think\event\HttpRun;
@@ -22,6 +23,8 @@ class CoreService extends Service
     /* @deprecated */
     public static array $extensionNameList = [];
 
+    private static array $normalExtensionNameList = [];
+
     public function register(): void
     {
         $this->app->bind(Handle::class, ExceptionHandle::class);
@@ -35,7 +38,7 @@ class CoreService extends Service
 
     public function boot(): void
     {
-        $this->app->make(AutoloadService::class)->init();
+        $this->app->make(AutoloadService::class)->load(self::$extensionComposerMap,self::$normalExtensionNameList);
         $this->app->make(HookAttributeService::class)->init();
         $this->app->event->trigger('hook_init', $this->app);
         $this->app->event->listen(HttpRun::class, function () {
@@ -58,7 +61,7 @@ class CoreService extends Service
             return;
         }
         foreach (InstalledVersions::getInstalledPackagesByType(Plugin::EXTENSION_TYPE) as $item) {
-            $version = InstalledVersions::getInstallPath($item);
+            //$version = InstalledVersions::getInstallPath($item);
             $installPath = InstalledVersions::getInstallPath($item);
             $composerJson = new JsonFile($installPath . '/composer.json');
             $composer = $composerJson->read();
@@ -77,7 +80,16 @@ class CoreService extends Service
             self::$extensionNameList = array_keys(self::$extensionComposerMap);
             $normalFile = $this->app->getRootPath() . 'runtime/module_name_list_normal.php';
             if (file_exists($normalFile)) {
-                self::$extensionNameList = array_merge(self::$extensionNameList, require $normalFile);
+                $normalExtensionList = require $normalFile;
+                foreach ($normalExtensionList as $item) {
+                    if (array_key_exists($item, self::$extensionComposerMap)) {
+                        continue;
+                    }
+                    if (is_dir( Helper::extension_path($item).'src')) {
+                        self::$extensionNameList[] = $item;
+                        self::$normalExtensionNameList[] = $item;
+                    }
+                }
             }
         }
     }