Laravel 分页类 Pagination 在 Laravel 之外使用,也可以配合 Eloquent 模型使用分页
参考:
- 在Laravel外使用Eloquent(二)- 分页问题
- 该文章在使用的 illuminate/pagination 包 处于标签 5.2 以下可以正常使用。Simple pagination in PHP with the Laravel pagination package
经过代码一步一步的调试,知道了 pagination 包需要如下依赖
{
"require": {
"illuminate/pagination": "~5.4.26",
"illuminate/view": "~5.4.26",
"illuminate/config": "~5.4.36"
}
}
在开始之前,先将所有依赖注入容器中
<?php
require_once __DIR__ . '/vendor/autoload.php';
$app = \Illuminate\Container\Container::getInstance();
// 需要为视图指定配置,paths 是非命名空间的视图存放位置,compiled 是编译过的文件存放位置
$config = [
'view' => [
'paths' => [
__DIR__.'/resources/views',
],
'compiled' => __DIR__.'/storage/app/framework/cache'
]
];
// 向容器中注入配置信息
$app->bind('config', function ($app) use ($config) {
return new \Illuminate\Config\Repository($config);
});
// 申明需要注册的服务提供器
$providers = [
\Illuminate\Events\EventServiceProvider::class,
\Illuminate\Filesystem\FilesystemServiceProvider::class,
\Illuminate\View\ViewServiceProvider::class,
\App\Providers\PaginationServiceProvider::class, // 该类需要自定义,或者选择将 request 注入容器中
];
// 注册服务提供器
array_walk($providers, function ($provider) use ($app) {
(new $provider($app))->register();
});
// 指定分页的视图模板位置
$app['view']->addNamespace('pagination', $app['config']['view.paths'][0].'vendor/pagination');
App\Providers\PaginationServiceProvider
<?php
namespace Yly\Providers;
use Illuminate\Pagination\Paginator;
use Illuminate\Support\ServiceProvider;
class PaginationServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
$this->loadViewsFrom(__DIR__.'/resources/views', 'pagination');
if ($this->app->runningInConsole()) {
$this->publishes([
__DIR__.'/resources/views' => $this->app->resourcePath('views/vendor/pagination'),
], 'laravel-pagination');
}
}
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
Paginator::viewFactoryResolver(function () {
return $this->app['view'];
});
Paginator::currentPathResolver(function () {
// return $this->app['request']->url();
});
Paginator::currentPageResolver(function ($pageName = 'page') {
// $page = $this->app['request']->input($pageName);
$page = abs($_GET['page']) ?: 1;
if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int) $page >= 1) {
return $page;
}
return 1;
});
}
}
测试还是看注释吧:
// 生成一个需要分页的大数组,数据库的推荐做法参考上面给出的链接中的注意事项,使用 limit
$items = array_map(function ($value) {
return [
'name' => 'Blog post #' . $value,
'url' => '/post/' . $value,
];
}, range(1,1000));
// 获取当前访问的页数
$currentPage = abs(@$_GET['page']) ?: 1;
// Items per page
$perPage = 10;
// 获取该页对应的项目
$currentItems = array_slice($items, $perPage * ($currentPage - 1), $perPage);
// Create paginator
$paginator = new Illuminate\Pagination\LengthAwarePaginator($currentItems, count($items), $perPage, $currentPage);
页面展示:
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-xs-12">
<h1>Blog posts - page <?=$paginator->currentPage()?></h1>
<?php foreach ($paginator->items() as $blogPost) { ?>
<a href="<?=$blogPost['url']?>"><h3><?=$blogPost['name']?></h3></a>
<?php } ?>
<?=$paginator->links()?>
</div>
</div>
</div>
</body>
</html>
注:
需要创建包视图目录
我的为:resources/views/vendor/pagination
需要创建视图编译目录
我的为:storage/app/framework/cache
为了测试方便可使用 php 内置服务器 php -S localhost:3000 index.php
附上完整的测试文件
<?php
require_once __DIR__ . '/vendor/autoload.php';
$app = \Illuminate\Container\Container::getInstance();
// 需要为视图指定配置,paths 是非命名空间的视图存放位置,compiled 是编译过的文件存放位置
$config = [
'view' => [
'paths' => [
__DIR__.'/resources/views',
],
'compiled' => __DIR__.'/storage/app/framework/cache'
]
];
// 向容器中注入配置信息
$app->bind('config', function ($app) use ($config) {
return new \Illuminate\Config\Repository($config);
});
// 申明需要注册的服务提供器
$providers = [
\Illuminate\Events\EventServiceProvider::class,
\Illuminate\Filesystem\FilesystemServiceProvider::class,
\Illuminate\View\ViewServiceProvider::class,
\Illuminate\Pagination\PaginationServiceProvider::class,
];
// 注册服务提供器
array_walk($providers, function ($provider) use ($app) {
(new $provider($app))->register();
});
// 指定分页的视图模板位置
$app['view']->addNamespace('pagination', $app['config']['view.paths'][0].'vendor/pagination');
// Populate items
$items = array_map(function ($value) {
return [
'name' => 'Blog post #' . $value,
'url' => '/post/' . $value,
];
}, range(1,1000));
// 获取当前访问的页数
$currentPage = abs(@$_GET['page']) ?: 1;
// Items per page
$perPage = 10;
$currentItems = array_slice($items, $perPage * ($currentPage - 1), $perPage);
// Create paginator
$paginator = new Illuminate\Pagination\LengthAwarePaginator($currentItems, count($items), $perPage, $currentPage);
?>
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/css/bootstrap.min.css">
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js"></script>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-xs-12">
<h1>Blog posts - page <?=$paginator->currentPage()?></h1>
<?php foreach ($paginator->items() as $blogPost) { ?>
<a href="<?=$blogPost['url']?>"><h3><?=$blogPost['name']?></h3></a>
<?php } ?>
<?=$paginator->links()?>
</div>
</div>
</div>
</body>
</html>
本作品采用《CC 协议》,转载必须注明作者和本文链接
666