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

