93 lines
2.5 KiB
PHP
93 lines
2.5 KiB
PHP
<?php
|
||
|
||
namespace App\Service;
|
||
|
||
use App\BaseApp\BaseService;
|
||
use App\Models\SystemConfigModel;
|
||
|
||
/**
|
||
* 系统配置 Service:按 key 读写 kv,供 AI 运行时等模块复用
|
||
*/
|
||
class SystemConfigService extends BaseService
|
||
{
|
||
public function __construct()
|
||
{
|
||
// 配置读写不依赖登录态(工厂解析时可能被其他 Service 调用)
|
||
$this->isAuth = false;
|
||
parent::__construct();
|
||
$this->model = SystemConfigModel::class;
|
||
}
|
||
|
||
/**
|
||
* 读取配置值;不存在时返回默认值
|
||
* 为什么:业务侧只关心 value,不关心行结构
|
||
*/
|
||
public function getValue(string $key, mixed $default = null): mixed
|
||
{
|
||
$key = trim($key);
|
||
if ($key === '') {
|
||
return $default;
|
||
}
|
||
$row = SystemConfigModel::where('key', $key)
|
||
->where('deleted_at', 0)
|
||
->first();
|
||
if (!$row) {
|
||
return $default;
|
||
}
|
||
$value = $row->value;
|
||
if ($value === null) {
|
||
return $default;
|
||
}
|
||
return $value;
|
||
}
|
||
|
||
/**
|
||
* 写入/更新配置;存在则更新,不存在则插入
|
||
* 为什么用 upsert:配置项数量少,按 key 幂等更稳
|
||
*/
|
||
public function setValue(string $key, mixed $value, string $remark = ''): bool
|
||
{
|
||
$key = trim($key);
|
||
if ($key === '') {
|
||
$this->utils->errorThrow('配置键不能为空');
|
||
}
|
||
if (is_array($value) || is_object($value)) {
|
||
$value = json_encode($value, JSON_UNESCAPED_UNICODE);
|
||
}
|
||
$value = (string) $value;
|
||
$now = time();
|
||
$row = SystemConfigModel::where('key', $key)
|
||
->where('deleted_at', 0)
|
||
->first();
|
||
if ($row) {
|
||
$row->value = $value;
|
||
if ($remark !== '') {
|
||
$row->remark = $remark;
|
||
}
|
||
$row->updated_at = $now;
|
||
return (bool) $row->save();
|
||
}
|
||
return (bool) SystemConfigModel::insert([
|
||
'key' => $key,
|
||
'value' => $value,
|
||
'remark' => $remark,
|
||
'created_at' => $now,
|
||
'updated_at' => 0,
|
||
'deleted_at' => 0,
|
||
]);
|
||
}
|
||
|
||
/**
|
||
* 批量写入配置
|
||
*
|
||
* @param array<string, mixed> $pairs key => value
|
||
*/
|
||
public function setValues(array $pairs): bool
|
||
{
|
||
foreach ($pairs as $key => $value) {
|
||
$this->setValue((string) $key, $value);
|
||
}
|
||
return true;
|
||
}
|
||
}
|