getAppConfigValue($key); // 再从插件 info.php 获取(覆盖 appConfig) $pluginConfigValue = $this->getPluginConfigValue($key); // 插件配置优先 if ($pluginConfigValue !== null) { return $pluginConfigValue; } return $appConfigValue !== null ? $appConfigValue : $default; } /** * 从 appConfig 获取配置值 */ private function getAppConfigValue(string $key): mixed { $keys = explode('.', $key); $value = $this->appConfig; foreach ($keys as $k) { if (!isset($value[$k])) { return null; } $value = $value[$k]; } return $value; } /** * 从插件 info.php 获取配置值 */ private function getPluginConfigValue(string $key): mixed { static $pluginInfo = null; if ($pluginInfo === null) { $infoFile = $this->getPluginInfoFile(); $pluginInfo = file_exists($infoFile) ? include $infoFile : []; } if (empty($pluginInfo)) { return null; } $keys = explode('.', $key); $value = $pluginInfo; foreach ($keys as $k) { if (!isset($value[$k])) { return null; } $value = $value[$k]; } return $value; } /** * 获取插件信息配置文件路径 */ protected function getPluginInfoFile(): string { return $this->pluginPath . '/config/info.php'; } /** * 获取插件信息(包含隐式默认配置) * info.php 中的配置会覆盖默认配置 */ protected function getPluginInfo(): array { // 先获取显式配置(info.php) $infoFile = $this->getPluginInfoFile(); $explicitConfig = []; if (file_exists($infoFile)) { $explicitConfig = include $infoFile; $explicitConfig = is_array($explicitConfig) ? $explicitConfig : []; } // 合并隐式默认配置 return array_merge($this->getImplicitConfig(), $explicitConfig); } /** * 获取隐式默认配置 */ protected function getImplicitConfig(): array { return [ 'dependencies' => [], 'require' => [ 'composer' => [], ], 'npm_require' => [ 'admin' => [], 'web' => [], ], 'supports' => [ 'backend' => true, 'frontend' => true, 'admin' => true, 'web' => true, ], ]; } /** * 获取插件配置文件路径 */ protected function getPluginConfigFile(): string { return $this->pluginPath . '/config/installed.php'; } /** * 保存插件安装状态 */ protected function savePluginConfig(string $version): void { $configFile = $this->getPluginConfigFile(); $configDir = dirname($configFile); if (!is_dir($configDir)) { mkdir($configDir, 0755, true); } $existingConfig = []; if (file_exists($configFile)) { $existingConfig = include $configFile; $existingConfig = is_array($existingConfig) ? $existingConfig : []; } $config = array_merge($existingConfig, [ 'name' => $this->getPluginName(), 'version' => $version, 'installed_at' => date('Y-m-d H:i:s'), 'status' => 'installed', ]); $content = "output("📝 Plugin config saved: {$configFile}"); } /** * 获取插件安装状态 */ protected function getPluginConfig(): ?array { $configFile = $this->getPluginConfigFile(); if (!file_exists($configFile)) { return null; } $config = include $configFile; return is_array($config) ? $config : null; } /** * 检查插件是否已安装 */ public function isInstalled(): bool { $config = $this->getPluginConfig(); return $config !== null && ($config['status'] ?? '') === 'installed'; } /** * 获取插件版本 */ public function getVersion(): ?string { $config = $this->getPluginConfig(); return $config['version'] ?? null; } /** * 删除插件配置文件 */ protected function removePluginConfig(): void { $configFile = $this->getPluginConfigFile(); if (file_exists($configFile)) { unlink($configFile); $this->output("📝 Plugin config removed: {$configFile}"); } } }