Files
Xboard/app/Traits/HasPluginConfig.php

144 lines
3.6 KiB
PHP
Raw Normal View History

<?php
namespace App\Traits;
use App\Models\Plugin;
use Illuminate\Support\Facades\Cache;
trait HasPluginConfig
{
/**
* 缓存的插件配置
*/
protected ?array $pluginConfig = null;
/**
* 插件代码
*/
protected ?string $pluginCode = null;
/**
* 插件启用状态(仅当前对象生命周期内缓存)
*/
protected ?bool $pluginEnabled = null;
/**
* 获取插件配置
*/
public function getConfig(?string $key = null, $default = null): mixed
{
$config = $this->getPluginConfig();
if ($key) {
return $config[$key] ?? $default;
}
return $config;
}
/**
* 获取完整的插件配置
*/
protected function getPluginConfig(): array
{
if ($this->pluginConfig === null) {
$pluginCode = $this->getPluginCode();
\Log::channel('daily')->info('Telegram Login: 获取插件配置', [
'plugin_code' => $pluginCode
]);
$this->pluginConfig = Cache::remember(
"plugin_config_{$pluginCode}",
3600,
function () use ($pluginCode) {
$plugin = Plugin::where('code', $pluginCode)
->where('is_enabled', true)
->first();
if (!$plugin || !$plugin->config) {
return [];
}
return json_decode($plugin->config, true) ?? [];
}
);
}
return $this->pluginConfig;
}
/**
* 获取插件代码
*/
public function getPluginCode(): string
{
if ($this->pluginCode === null) {
$this->pluginCode = $this->autoDetectPluginCode();
}
return $this->pluginCode;
}
/**
* 设置插件代码(如果自动检测不准确可以手动设置)
*/
public function setPluginCode(string $pluginCode): void
{
$this->pluginCode = $pluginCode;
$this->pluginConfig = null; // 重置配置缓存
$this->pluginEnabled = null;
}
/**
* 自动检测插件代码
*/
protected function autoDetectPluginCode(): string
{
$reflection = new \ReflectionClass($this);
$namespace = $reflection->getNamespaceName();
// 从命名空间提取插件代码
// 例如: Plugin\TelegramLogin\Controllers => telegram_login
if (preg_match('/^Plugin\\\\(.+?)\\\\/', $namespace, $matches)) {
return $this->convertToKebabCase($matches[1]);
}
throw new \RuntimeException('Unable to detect plugin code from namespace: ' . $namespace);
}
/**
* StudlyCase 转换为 kebab-case
*/
protected function convertToKebabCase(string $string): string
{
return strtolower(preg_replace('/([a-z])([A-Z])/', '$1_$2', $string));
}
/**
* 检查插件是否启用
*/
public function isPluginEnabled(): bool
{
if ($this->pluginEnabled !== null) {
return $this->pluginEnabled;
}
$pluginCode = $this->getPluginCode();
$isEnabled = Plugin::where('code', $pluginCode)->value('is_enabled');
$this->pluginEnabled = (bool) $isEnabled;
return $this->pluginEnabled;
}
/**
* 清除插件配置缓存
*/
public function clearConfigCache(): void
{
$pluginCode = $this->getPluginCode();
Cache::forget("plugin_config_{$pluginCode}");
$this->pluginConfig = null;
$this->pluginEnabled = null;
}
}