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.
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

666

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

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