115 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			115 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
| <?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;
 | |
|         }
 | |
|     }
 | |
| } |