115 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			115 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								namespace app\model;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use think\facade\Config as CConfig;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class ConfigSetting extends Base
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								    // 是否开启同步生成扩展配置文件
							 | 
						||
| 
								 | 
							
								    const with_write_config = true;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public static function setConfigByName(string $name, array $content)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $config = self::getConfigByName($name);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if(empty($config)) {
							 | 
						||
| 
								 | 
							
								            self::create([
							 | 
						||
| 
								 | 
							
								                'name'      => $name,
							 | 
						||
| 
								 | 
							
								                'contents'  => json_encode($content, JSON_UNESCAPED_UNICODE)
							 | 
						||
| 
								 | 
							
								            ]);
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            self::updateById($config['id'], [
							 | 
						||
| 
								 | 
							
								                'contents'  => json_encode($content, JSON_UNESCAPED_UNICODE)
							 | 
						||
| 
								 | 
							
								            ]);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // 同步写入与生成配置文件
							 | 
						||
| 
								 | 
							
								        if (self::with_write_config) {
							 | 
						||
| 
								 | 
							
								            self::setWithExtraConfigFile($name, $content);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public static function getConfigByName(string $name)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $item = self::where('name', $name)
							 | 
						||
| 
								 | 
							
								        ->findOrEmpty()
							 | 
						||
| 
								 | 
							
								        ->toArray();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return self::convertContents($item);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // 通过数据库查询配置信息
							 | 
						||
| 
								 | 
							
								    public static function getConfigContentsByName(string $name)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $item = self::getConfigByName($name);
							 | 
						||
| 
								 | 
							
								        return $item['contents'] ?? [];
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public static function convertContents(array $item)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        if(empty($item)) {
							 | 
						||
| 
								 | 
							
								            return [];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $item['contents'] = empty($item['contents']) ? [] : json_decode($item['contents'], true);
							 | 
						||
| 
								 | 
							
								        return $item;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // 优先通过扩展配置文件查询配置信息,没有查询到再从数据库中查询
							 | 
						||
| 
								 | 
							
								    public static function getConfigContentsWithFileByName(string $name)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $conf   = [];
							 | 
						||
| 
								 | 
							
								        if (self::with_write_config) {
							 | 
						||
| 
								 | 
							
								            $extraFileName  = self::parseExtraConfigFileNameByName($name);
							 | 
						||
| 
								 | 
							
								            CConfig::load('extra/'.$extraFileName, $name);
							 | 
						||
| 
								 | 
							
								            $conf   = config($name);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if (!empty($conf)) {
							 | 
						||
| 
								 | 
							
								            return $conf;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            $item = self::getConfigByName($name);
							 | 
						||
| 
								 | 
							
								            return $item['contents'] ?? [];
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // 通过配置名称解析扩展配置文件名称
							 | 
						||
| 
								 | 
							
								    public static function parseExtraConfigFileNameByName(string $name)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        // extra开头
							 | 
						||
| 
								 | 
							
								        if (substr($name, 0, 5) == 'extra') {
							 | 
						||
| 
								 | 
							
								            $configFileName = substr($name, 5);
							 | 
						||
| 
								 | 
							
								            // 字符串首字母转小写
							 | 
						||
| 
								 | 
							
								            $configFileName = lcfirst($configFileName);
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            $configFileName = $name;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        return $configFileName;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    // 扩展配置信息写入扩展配置文件
							 | 
						||
| 
								 | 
							
								    public static function setWithExtraConfigFile(string $name, array $content = [])
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        try {
							 | 
						||
| 
								 | 
							
								            $configFileName = self::parseExtraConfigFileNameByName($name);
							 | 
						||
| 
								 | 
							
								            if (!is_numeric($configFileName) && empty($configFileName)) {
							 | 
						||
| 
								 | 
							
								                return false;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            $extraPath      = config_path().'extra/';
							 | 
						||
| 
								 | 
							
								            checkPathExistWithMake($extraPath);
							 | 
						||
| 
								 | 
							
								            $configFil      = $extraPath.$configFileName.'.php';
							 | 
						||
| 
								 | 
							
								            $configData     = var_export($content, true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            file_put_contents($configFil, '<?php' . PHP_EOL . 'return ' . $configData . ';');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return true;
							 | 
						||
| 
								 | 
							
								        } catch (\Exception $e) {
							 | 
						||
| 
								 | 
							
								            \think\facade\Log::write('请检查扩展配置文件目录config/extra是否拥有可读写权限', 'error');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            return false;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |