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
相关产品推荐
相关产品推荐

