You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

监听admin_system_config_changed_section_[SECTION]时,如何获取旧配置值并检测字段变更?

好问题!我之前在处理系统配置变更监听的需求时,刚好踩过类似的坑,给你分享下具体的实现思路和实操方法:

检测字段变更与获取旧配置值的方案

1. 先拿到新旧配置数据

admin_system_config_changed_section_[SECTION]事件触发时,回调函数通常会接收包含旧配置快照和新配置数据的事件对象——这正是你需要的核心信息。以PHP生态的系统为例,回调里可以这样获取:

public function onConfigChanged($event) {
    // 变更前的完整配置(根据你用的系统,参数名可能是oldData/oldSettings,先print_r确认)
    $oldConfig = $event->oldConfig;
    // 变更后的最新配置
    $newConfig = $event->newConfig;
}

如果不确定参数结构,直接在回调里var_dump($event)打印一下,就能清楚看到所有可用的属性了。

2. 对比特定字段是否变更

有了新旧配置后,只需要针对目标字段做值对比就行,还要考虑字段新增/删除的情况:

// 替换成你要检测的目标字段名
$fieldToCheck = 'site_maintenance_mode';

// 先处理字段存在性的情况
if (isset($oldConfig[$fieldToCheck]) && isset($newConfig[$fieldToCheck])) {
    // 对比值:注意复杂类型(数组/对象)要用递归对比,比如array_diff_recursive
    if ($oldConfig[$fieldToCheck] !== $newConfig[$fieldToCheck]) {
        // 字段确实变更了,这里写你的业务逻辑
        echo "字段{$fieldToCheck}已变更:旧值{$oldConfig[$fieldToCheck]} → 新值{$newConfig[$fieldToCheck]}";
    }
} else {
    // 字段新增或删除的情况
    if (!isset($oldConfig[$fieldToCheck]) && isset($newConfig[$fieldToCheck])) {
        echo "新增了字段{$fieldToCheck},值为{$newConfig[$fieldToCheck]}";
    } elseif (isset($oldConfig[$fieldToCheck]) && !isset($newConfig[$fieldToCheck])) {
        echo "删除了字段{$fieldToCheck},旧值为{$oldConfig[$fieldToCheck]}";
    }
}

3. 几个要注意的细节

  • 参数结构差异:不同系统的事件参数命名可能不一样,比如有的是$event->old和$event->new,有的会把数据放在$event->data里,一定要先打印确认。
  • 复杂字段对比:如果目标字段是数组或对象,直接用!==可能不准确,要用递归对比的方法(比如PHP的array_diff_recursive,或者自己写递归函数)。
  • 事件注册正确性:确保你的监听器已经正确绑定到admin_system_config_changed_section_[SECTION]这个事件上,不然回调根本不会触发。

内容的提问来源于stack exchange,提问作者Yohanes Pradono

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:17:15