Hyperf 3.1 中 Apollo 配置的 JSON 数组需手动 json_decode,因 config() 默认返回字符串;推荐封装 jsonArray 辅助方法并校验类型,避免 foreach 报错。

Hyperf 3.1 中使用 Apollo 配置中心时,若配置项为 JSON 数组(如 ["a","b","c"] 或嵌套对象数组),config('xxx') 可能返回字符串而非 PHP 数组,导致 foreach 报错或 is_array() 为 false——这不是 Apollo 没推送,而是配置值未被自动 JSON 解析。
确认 Apollo 返回的是 JSON 字符串而非原生数组
Apollo 后台编辑配置时,即使输入的是数组字面量(如 [1,2,3]),其 HTTP 接口实际返回的仍是 字符串类型 的 JSON 文本。Hyperf 的 config-apollo 驱动默认不会自动 json_decode,除非该值在 Apollo 中被明确标记为 JSON 格式(通过后缀或 Content-Type),但标准 namespace(如 application)不启用此行为。
- 在代码中打印原始值验证:
var_dump(config('your.namespace.key'));—— 若输出为string(9) "[1,2,3]",说明是 JSON 字符串 - 对比 Apollo 控制台中该 key 的「值」字段:若显示为带引号的完整 JSON(如
"[\"a\",\"b\"]"),即为字符串化存储
手动 JSON 解码是最直接可靠的修复方式
不要依赖框架自动转换,显式调用 json_decode 并校验结果。推荐封装成辅助方法复用:
- 定义工具函数(如放在
app/Helper/ConfigHelper.php):
public static function jsonArray(string $key, array $default = []): array {
$raw = config($key);
if (!is_string($raw)) { return $default; }
$decoded = json_decode($raw, true);
return is_array($decoded) ? $decoded : $default;
} - 业务中调用:
$list = ConfigHelper::jsonArray('redis.whitelist'); - 关键点:必须加
is_string判断,避免对已解码的值重复 decode 导致 null
避免在 Apollo 中“伪数组”写法引发歧义
有些团队会把数组写成逗号分隔字符串(如 "a,b,c")再用 explode 处理,这看似简单,实则易出错:
- 无法表达嵌套结构(如
[{"id":1,"name":"x"}]) - 值本身含逗号(如
"user,name,email")会导致切分错误 - 建议统一使用标准 JSON 格式,并在文档中注明该 key 必须为合法 JSON 数组
- Apollo 控制台编辑时,开启「JSON Schema 校验」(如有)或人工校验
json_last_error() === JSON_ERROR_NONE
检查 config-apollo 是否启用了 auto_json_decode(Hyperf 3.1+ 可选)
部分高版本 hyperf/config-apollo(≥ v3.1.5)新增了 auto_json_decode 配置项,默认关闭。如已升级,可在 config/autoload/apollo.php 中启用:
- 添加配置:'auto_json_decode' => true,
- 注意:它仅对值匹配
^\s*(\[|\{).*(\]|\})\s*$的字符串生效,且失败时静默回退到原始字符串 - 仍建议配合
json_decode(..., true)+is_array()双重校验,不完全依赖此开关


















