|
|
@@ -3,7 +3,10 @@ declare(strict_types=1);
|
|
|
|
|
|
namespace SixShop\Core\Service;
|
|
|
|
|
|
+use Composer\InstalledVersions;
|
|
|
+use Composer\Json\JsonFile;
|
|
|
use SixShop\Core\Exception\ExceptionHandle;
|
|
|
+use SixShop\Core\Plugin;
|
|
|
use SixShop\Core\Request;
|
|
|
use think\event\HttpRun;
|
|
|
use think\exception\Handle;
|
|
|
@@ -13,6 +16,9 @@ class CoreService extends Service
|
|
|
{
|
|
|
public static string $extensionPath;
|
|
|
|
|
|
+ public static array $extensionComposerMap = [];
|
|
|
+
|
|
|
+ /* @deprecated */
|
|
|
public static array $extensionNameList = [];
|
|
|
|
|
|
public function register(): void
|
|
|
@@ -23,6 +29,7 @@ class CoreService extends Service
|
|
|
require $this->app->getRootPath() . 'vendor/autoload.php');
|
|
|
self::$extensionPath = $this->app->getRootPath() . 'extension' . DIRECTORY_SEPARATOR;
|
|
|
$this->initExtensionList();
|
|
|
+ $this->compatibleExtensNameList();
|
|
|
}
|
|
|
|
|
|
public function boot(): void
|
|
|
@@ -38,36 +45,33 @@ class CoreService extends Service
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- public function initExtensionList(): void
|
|
|
+ private function initExtensionList(): void
|
|
|
+ {
|
|
|
+ if (!empty(self::$extensionComposerMap)) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ $extensionComposerFile = $this->app->getRootPath() . 'runtime/extension_' . InstalledVersions::getRootPackage()['reference'].'.php';
|
|
|
+ if (file_exists($extensionComposerFile)) {
|
|
|
+ self::$extensionComposerMap = require $extensionComposerFile;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ foreach (InstalledVersions::getInstalledPackagesByType(Plugin::EXTENSION_TYPE) as $item) {
|
|
|
+ $version = InstalledVersions::getInstallPath($item);
|
|
|
+ $installPath = InstalledVersions::getInstallPath($item);
|
|
|
+ $composerJson = new JsonFile($installPath . '/composer.json');
|
|
|
+ $composer = $composerJson->read();
|
|
|
+ self::$extensionComposerMap[$composer['extra']['sixshop']['id']] = $composer;
|
|
|
+ };
|
|
|
+ $header = '// This file is automatically generated at:' . date('Y-m-d H:i:s') . PHP_EOL . 'declare (strict_types = 1);' . PHP_EOL;
|
|
|
+ $content = '<?php ' . PHP_EOL . $header . "return " . var_export(self::$extensionComposerMap, true) . ';';
|
|
|
+ file_put_contents($extensionComposerFile, $content);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* @deprecated */
|
|
|
+ private function compatibleExtensNameList(): void
|
|
|
{
|
|
|
if (empty(self::$extensionNameList)) {
|
|
|
- $coreFile = $this->app->getRootPath() . 'runtime/module_name_list_core.php';
|
|
|
- if (file_exists($coreFile)) {
|
|
|
- self::$extensionNameList = require $coreFile;
|
|
|
- } else {
|
|
|
- $extensionInfoList = [];
|
|
|
- $extensionDirs = array_diff(scandir(self::$extensionPath), ['.', '..']);
|
|
|
- foreach ($extensionDirs as $item) {
|
|
|
- if (!is_dir(self::$extensionPath . $item)) {
|
|
|
- continue;
|
|
|
- }
|
|
|
- $infoFile = self::$extensionPath . $item . '/info.php';
|
|
|
- if (is_file($infoFile)) {
|
|
|
- $info = require $infoFile;
|
|
|
- $info['weight'] = $info['weight'] ?? 10000;
|
|
|
- if ($info['is_core'] ?? false) {
|
|
|
- self::$extensionNameList[] = $info['id'];
|
|
|
- $extensionInfoList[] = $info;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- usort($extensionInfoList, function ($a, $b) {
|
|
|
- return $a['weight'] <=> $b['weight'];
|
|
|
- });
|
|
|
- $header = '// This file is automatically generated at:' . date('Y-m-d H:i:s') . PHP_EOL . 'declare (strict_types = 1);' . PHP_EOL;
|
|
|
- $content = '<?php ' . PHP_EOL . $header . "return " . var_export(array_column($extensionInfoList, 'id'), true) . ';';
|
|
|
- file_put_contents($coreFile, $content);
|
|
|
- }
|
|
|
+ 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);
|