Parcourir la source

feat(core): 添加扩展启动状态检查功能

- 在 ExtensionInterface 中新增 isBooted 方法定义
- 在 ExtensionAbstract 中实现 isBooted 方法
- 修改 AutoloadService 的 load 方法返回类型为 void
- 移除无效扩展 ID 的收集和返回逻辑
- 在 CoreService 的 boot 方法中增加对扩展是否已启动的判断
- 优化扩展启动流程,避免重复启动已加载的扩展
runphp il y a 3 mois
Parent
commit
d3168c20fd

+ 7 - 0
src/Contracts/ExtensionInterface.php

@@ -61,4 +61,11 @@ interface ExtensionInterface
      * 启动扩展
      */
     public function boot(): void;
+
+    /**
+     * 扩展是否启动
+     *
+     * @return bool
+     */
+    public function isBooted(): bool;
 }

+ 6 - 0
src/ExtensionAbstract.php

@@ -115,4 +115,10 @@ abstract class ExtensionAbstract implements ExtensionInterface
     {
         $this->isBooted = true;
     }
+
+    #[\Override]
+    public function isBooted(): bool
+    {
+        return $this->isBooted;
+    }
 }

+ 1 - 4
src/Service/AutoloadService.php

@@ -14,9 +14,8 @@ readonly class AutoloadService
     {
     }
 
-    public function load(array $extensionComposerMap): array
+    public function load(array $extensionComposerMap): void
     {
-        $invalidExtensionIDs = [];
         foreach ($extensionComposerMap as $extensionID => $composerFile) {
             if (!isset($composerFile['extra']['sixshop']['class'])) {
                 $invalidExtensionIDs[] = $extensionID;
@@ -24,8 +23,6 @@ readonly class AutoloadService
             }
             $this->app->bind('extension.' . $extensionID, $composerFile['extra']['sixshop']['class']);
         }
-        $classLoader = $this->app->get('classLoader');
-        return $invalidExtensionIDs;
     }
 
     public function getExtension(string $moduleName): ExtensionInterface

+ 2 - 5
src/Service/CoreService.php

@@ -84,14 +84,11 @@ class CoreService extends Service
     public function boot(): void
     {
         $autoloadService = $this->app->make(AutoloadService::class);
-        $invalidExtensionIDs = $autoloadService->load(self::$extensionComposerMap);
+        $autoloadService->load(self::$extensionComposerMap);
         $this->app->get('extension.system')->boot();
         foreach (self::$extensionComposerMap as $moduleName => $_) {
-            if (in_array($moduleName, $invalidExtensionIDs)) {
-                continue;
-            }
             $extension = $autoloadService->getExtension($moduleName);
-            if (!$extension->available()) {
+            if (!$extension->available() || $extension->isBooted()) {
                 continue;
             }
             $extension->boot();