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

Laravel 8 中如何对存储的Markdown文件实现分页功能

你可以借助Laravel自带的LengthAwarePaginator类手动生成分页实例,返回的分页对象和Eloquent的paginate()方法输出完全一致,前端无需额外适配。

完整实现代码

首先引入依赖类:

use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\Storage;

控制器逻辑替换为以下内容:

// 统一使用存储盘,注意你原代码读列表用articles盘、读内容用posts盘,确认是否为笔误,这里统一调整
$disk = Storage::disk('articles');
$allFiles = $disk->allFiles();

// 组装文章数据,按文件最后修改时间倒序,对应原Eloquent的orderBy('created_at', 'desc')逻辑
$articleList = collect($allFiles)->map(function ($filename) use ($disk) {
    return [
        'filename' => $filename,
        'content' => $disk->get($filename),
        'sort_time' => $disk->lastModified($filename)
    ];
})->sortByDesc('sort_time');

// 分页配置
$perPage = 1; // 每页展示1篇
$currentPage = LengthAwarePaginator::resolveCurrentPage();
$totalCount = $articleList->count();

// 切割获取当前页的文章数据
$currentPageArticles = $articleList->slice(($currentPage - 1) * $perPage, $perPage)->values();

// 生成分页实例
$articles = new LengthAwarePaginator(
    $currentPageArticles,
    $totalCount,
    $perPage,
    $currentPage,
    [
        'path' => LengthAwarePaginator::resolveCurrentPath(),
        'pageName' => 'page'
    ]
);

return view('articles', compact('articles'));

前端使用说明

  • 遍历文章和Eloquent分页用法完全一致:
@foreach($articles as $article)
    <h1>{{ $article['filename'] }}</h1>
    <div>
        {{-- 这里替换为你自己的Markdown渲染逻辑 --}}
        {!! Markdown::parse($article['content']) !!}
    </div>
@endforeach
  • 渲染分页链接直接调用links()方法即可,和Eloquent分页效果完全相同:
{{ $articles->links() }}

优化建议

  • 如果你的Markdown文件名包含发布日期(比如2024-05-01-my-first-post.md),可以提取文件名中的日期作为排序依据,比文件修改时间更准确。
  • 如果文章数量超过100篇,建议把文章元数据(文件名、排序时间等)缓存起来,避免每次请求都遍历读取所有文件的元信息,提升响应速度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 00:45:11