因为 Laravel 5.6+ 的 laravel-pagination 标签仅创建空目录,不发布默认 Blade 文件,分页 HTML 由 Presenter 运行时动态生成;需手动创建如 bootstrap-5.blade.php 等匹配文件名的视图,并通过 Paginator::defaultView() 设置全局模板。

为什么 php artisan vendor:publish --tag=laravel-pagination 不能直接覆盖默认分页视图
因为 Laravel 从 5.6 开始,laravel-pagination 这个 tag 只会发布一个空的 resources/views/vendor/pagination 目录,不带任何 Blade 文件。它只是预留路径,不是“复制模板”。你运行后发现目录为空,不是命令失败,而是设计如此——Laravel 不再预置默认分页视图文件,而是通过 Illuminate\Pagination\LengthAwarePaginator 和 BootstrapThreePresenter 等类在运行时动态生成 HTML。
真正生效的自定义方式:用 resources/views/vendor/pagination + 自定义 Blade 文件
必须手动在该路径下创建对应名称的 Blade 文件,Laravel 才会在渲染时优先加载它们。关键点是文件名必须与底层使用的 presenter 匹配(默认是 Bootstrap 5 风格):
- 默认使用
bootstrap-5模板 → 文件名必须为bootstrap-5.blade.php - 若手动调用
->onEachSide(2)->links('pagination::tailwind'),则需提供tailwind.blade.php - 自定义 presenter 类(如继承
BootstrapFivePresenter)可指定任意文件名,但需确保getView()返回的路径能被 Blade loader 正确解析
示例:创建最简自定义分页视图
@if ($paginator->hasPages())
@endif
如何切换全局默认分页视图(避免每个 ->links() 都写路径)
Laravel 默认使用 pagination::bootstrap-5,但你可以通过配置让所有分页统一走自定义模板,无需每次显式传参:
- 在
config/app.php中添加:'pagination' => 'custom'(需配合自定义 service provider) - 更稳妥的方式:在
App\Providers\AppServiceProvider@boot()中重绑定Paginator的静态视图名
推荐做法(无侵入、不改核心):
CWMS 2.0功能介绍:一、 员工考勤系统,国内首创CWMS2.0的企业员工在线考勤系统。二、 自定义URL Rewrite重写,友好的搜索引擎 URL优化。三、 代码与模板分离技术,支持超过5种类型的模板类型。包括:文章、图文、产品、单页、留言板。四、 购物车功能,CWMS2.0集成国内主流支付接口。如:淘宝、易趣、快钱等。完全可媲美专业网上商城系统。五、 多语言自动切换 中英文的说明。六、
use Illuminate\Pagination\Paginator;
public function boot()
{
Paginator::defaultView('pagination::custom');
Paginator::defaultSimpleView('pagination::custom-simple');
}
然后确保你已创建了 resources/views/vendor/pagination/custom.blade.php 和 custom-simple.blade.php。
常见错误:分页链接不渲染 / 报 View [pagination::xxx] not found
这是路径或命名不匹配导致的典型问题:
- 检查文件是否真在
resources/views/vendor/pagination/xxx.blade.php(注意大小写,Linux 下敏感) - 确认没有多余空格或 BOM 字符(尤其 Windows 编辑器保存时容易带 BOM)
- 运行
php artisan view:clear清除视图缓存(开发中常被忽略) - 如果用了
APP_DEBUG=false,Blade 错误会被静默吞掉,建议临时开启调试定位 - 不要试图在
vendor/laravel/framework/src/Illuminate/Pagination/resources/views下修改——这些文件不会被加载,且下次 composer update 会被覆盖
自定义分页真正的复杂点不在结构,而在 presenter 逻辑和视图变量约定。比如 $elements 数组格式、$paginator->hasPages() 与 $paginator->onFirstPage() 的语义差异,稍不注意就会漏掉禁用状态或跳转逻辑。别只盯着 HTML,先读懂 BootstrapFivePresenter 的 render() 和 getLinks() 是怎么组织数据的。









