从数据库动态生成导出页面:laravel-export 的 Exporter 类编程式配置完整指南

📅 2026/8/24 9:22:06
从数据库动态生成导出页面:laravel-export 的 Exporter 类编程式配置完整指南
从数据库动态生成导出页面laravel-export 的 Exporter 类编程式配置完整指南【免费下载链接】laravel-exportCreate a static site bundle from a Laravel app项目地址: https://gitcode.com/gh_mirrors/la/laravel-exportlaravel-export 是 Laravel 生态中的静态站点导出工具——它会自动爬取你的应用为每个 URL 生成一份静态 HTML最终打包成一个可直接上传托管的静态站点。当导出页面需要从数据库动态获取时比如把全部已发布文章导出成静态页最灵活的方式不是改配置文件而是注入Exporter 类用代码编程式地配置导出内容。为什么静态站点导出值得尝试 用 Laravel 写博客、文档站或内容站很方便但托管起来要维护服务器、PHP 环境、数据库……而 laravel-export 让你鱼和熊掌兼得✅保留 Laravel 开发体验路由、Blade 模板、Eloquent 模型照用✅输出一堆纯静态文件丢到任意静态托管即可快、省心、易扩展✅适合内容型站点后台管理 本地/远程服务器编辑一键发布静态版运行一次导出命令后你会看到$ php artisan export Exporting site... Files were saved to disk export配置文件的局限为什么需要编程式配置laravel-export 默认通过config/export.php配置导出内容核心选项有四个配置项作用默认值crawl自动爬取站内所有链接并导出truepaths手动指定要导出的 URL 路径[]include_files要打包进静态包的文件/目录源路径 目标路径[public ]exclude_file_patterns排除匹配的正则文件模式[/\\.php$/, /mix-manifest\\.json$/]配置文件适合固定不变的导出清单但遇到这类需求就无能为力了把数据库中所有已发布文章的 URL 都导出成静态页根据环境变量或运行时数据决定导出范围不同环境下导出不同的路径集合这时就需要用到 Exporter 类——它把上面所有配置项都暴露成了可链式调用的方法。认识 Exporter 类导出流程的总指挥Exporter 是整个包的入口类它内部维护 4 组状态cleanBeforeExport— 导出前是否清空目标目录crawl/useStreaming— 是否爬站、是否启用流式省内存paths— 要导出为 HTML 的路径列表includeFiles/excludeFilePatterns— 要打包的文件与排除规则这个类由服务提供者注册为单例见 ExportServiceProvider 中的singleton(Exporter::class)并且启动时会自动把config/export.php里的值填充进去——代码中的配置与配置文件是叠加关系而不是互相覆盖。从数据库动态生成导出页面核心场景 下面是一个典型的真实场景博客每篇文章的 slug 存在数据库里希望每次导出时把所有文章页都生成静态 HTML。只需在应用服务提供者中注入 Exporter// app/Providers/AppServiceProvider.php use App\Models\Post; use Spatie\Export\Exporter; public function boot(Exporter $exporter) { $exporter-crawl(false); // 关闭全站爬取改用手动清单 $exporter-useStreaming(true); // 大站点建议开启流式处理 $exporter-paths([, about, contact, posts]); $exporter-paths(Post::published()-pluck(slug)); // 从数据库动态取路径 }然后照常运行php artisan export所有文章页就会按数据库现状被导出。这个写法有几个值得注意的细节paths()支持累加多次调用会合并结果源码中使用array_merge静态页面和动态查询结果可以分开写paths()接受数组或可变参数两种写法都合法还有urls()方法如果你手头是完整 URL 而不是路径urls()会自动剥掉域名前缀再交给paths()处理Exporter 方法速查表方法参数用途新手建议crawl()bool开关自动爬取有动态清单时设为falseuseStreaming()bool流式爬取省内存页面多时开启paths()数组 / 可变参数指定导出路径可多次累加数据库结果集直接传入urls()数组 / 可变参数传入完整 URL自动转路径数据来自绝对链接时用includeFiles()[源路径 目标路径]打包静态资源默认已含public目录excludeFilePatterns()正则数组排除特定文件默认排除.php文件cleanBeforeExport()bool导出前清空目标目录建议保持true所有方法都返回$this可以像上面那样链式书写代码非常紧凑。一次 export() 背后发生了什么调用$exporter-export()后见 Exporter.php 第 100-125 行导出器会按固定顺序派发 4 类任务CleanDestination— 若开启了cleanBeforeExport先清空输出目录保证包是新鲜的CrawlSite— 若开启了crawl从首页开始爬取站内链接并逐页落盘由 Crawler/LocalClient 在本地直接处理请求无需真正发 HTTPExportPath— 对paths中的每个路径模拟一次请求把响应内容写成index.html。返回 200/301/302 视为成功其他状态码会直接抛异常IncludeFile— 按includeFiles递归复制静态资源并套用excludeFilePatterns过滤默认输出位置是项目根目录下的dist文件夹如果想存到 S3 或其他磁盘只需在config/filesystems.php定义一个 disk并在config/export.php里设置disk export即可见 config/export.php 注释。进阶技巧钩子命令让发布全自动 配置文件还支持before/after钩子在导出前后执行任意 shell 命令。常见组合拳// config/export.php return [ before [ assets /usr/local/bin/yarn production, // 导出前编译前端资源 ], after [ deploy /usr/local/bin/netlify deploy --prod, // 导出后自动部署 ], ];不想跑某个钩子命令行加--skip-{钩子名}即可例如php artisan export --skip-deploy--skip-all则跳过全部。这意味着数据库改内容 → 跑一条命令 → 线上静态站更新的完整流水线可以完全自动化。新手常见疑问 FAQ ❓Q爬取crawl和 paths 是互斥的吗不是。两者会叠加生效爬取导出的页面 paths里指定的页面。如果你的页面都能被链接到通常开crawl就够了paths适合补充链接不到的页面或做纯动态清单。Q导出后 PHP 文件会混进包里吗默认不会。exclude_file_patterns默认排除所有.php文件和mix-manifest.json避免public/index.php这类入口文件被打包。Q为什么我改的代码没生效注意配置文件与代码配置是叠加的ExportServiceProvider启动时已把配置文件值灌入单例boot()中再调用的方法会合并追加而不是重置。所以想完全覆盖配置时记得在代码里显式关闭冲突项如crawl(false)。总结固定清单→ 用config/export.php就够了动态清单数据库驱动→ 注入 Exporter用paths()传入查询结果大型站点→ 开启useStreaming(true)控制内存自动发布→ 配合before/after钩子实现一条命令上线laravel-export 的 Exporter 类把导出什么从静态配置变成了可编程的决策这正是它从博客导出小工具升级为内容管线组件的关键。把数据库查询结果喂给paths()你的 Laravel 应用就拥有了真正的静态站点发布能力。【免费下载链接】laravel-exportCreate a static site bundle from a Laravel app项目地址: https://gitcode.com/gh_mirrors/la/laravel-export创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考