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

OctoberCMS获取以cont*开头的内容文件列表报错求助

解决Content::loadCached无法获取匹配cont*的文件列表问题

我猜你大概率是对Content::loadCached的用法理解有点偏差,这个方法一般是用来读取已缓存的数据,而不是直接动态匹配文件列表的。结合你遇到的报错和只能获取单个文件的情况,我给你梳理下可行的解决思路:

1. 先明确loadCached的定位

Content::loadCached('theme', 'listOfContentFiles')里的第二个参数是缓存键,不是文件匹配规则。所以你直接传listOfContentFiles,它只会去读之前用这个键缓存好的数据——如果之前只缓存了单个文件,那自然只能拿到单个结果。

2. 正确流程:生成匹配列表→缓存→读取

要拿到cont*开头的文件列表,得先主动生成这个列表并缓存,之后才能用loadCached读取:

步骤1:获取并过滤文件列表

如果Content类有内置的获取所有内容文件的方法(比如getContentFiles()),先拿全量列表再过滤:

// 获取所有内容文件
$allContentFiles = Content::getContentFiles();

// 筛选出以cont开头的文件
$contFiles = array_filter($allContentFiles, function($fileName) {
    return str_starts_with($fileName, 'cont');
});

如果没有内置方法,也可以用原生PHP函数读取目录并过滤:

// 假设内容文件存在这个目录下
$contentDir = '/path/to/your/content/files';
$allFiles = scandir($contentDir);
$contFiles = array_filter($allFiles, function($file) {
    return str_starts_with($file, 'cont') && is_file($contentDir . '/' . $file);
});

步骤2:缓存筛选后的列表

用Content类的缓存方法(一般是cache()或者类似命名的方法)把列表存起来:

// 将列表缓存到theme组,键设为listOfContentFiles
Content::cache('theme', 'listOfContentFiles', $contFiles);

步骤3:读取缓存的列表

现在再调用loadCached就能拿到完整的cont*文件列表了:

$cachedContFiles = Content::loadCached('theme', 'listOfContentFiles');

3. 排查报错的常见原因

如果还是报错,先看具体报错信息:

  • 如果是「缓存键不存在」:说明你没执行上面的缓存步骤,直接读了一个不存在的缓存键;
  • 如果是「方法参数无效」:检查Content::loadCached的参数要求,比如是否需要额外的匹配模式参数;
  • 如果是「权限错误」:确认缓存目录的读写权限,保证Content类能正常写入缓存文件。

4. 临时替代方案(不需要缓存的情况)

如果不需要缓存列表,直接跳过缓存步骤,用过滤后的$contFiles即可,省去缓存读写的环节。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 11:45:36