Laravel 分页类 Pagination 在 Laravel 之外使用,也可以配合 Eloquent 模型使用分页

参考:

经过代码一步一步的调试,知道了 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 协议》,转载必须注明作者和本文链接
Study hard and make progress every day. Study hard and make progress every day.
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 1

666

4年前 评论
mouyong (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!