markdown Laravel的可分页Collection实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown Laravel的可分页Collection实现相关的知识,希望对你有一定的参考价值。
<?php
namespace App\Providers;
use Illuminate\Support\Collection;
use Illuminate\Pagination\LengthAwarePaginator;
class AppServiceProvider extends ServiceProvider
{
public function boot()
{
/**
* Paginate a standard Laravel Collection.
*
* @param int $perPage
* @param int $total
* @param int $page
* @param string $pageName
* @return array
*/
Collection::macro('paginate', function($perPage, $total = null, $page = null, $pageName = 'page') {
$page = $page ?: LengthAwarePaginator::resolveCurrentPage($pageName);
return new LengthAwarePaginator(
$this->forPage($page, $perPage),
$total ?: $this->count(),
$perPage,
$page,
[
'path' => LengthAwarePaginator::resolveCurrentPath(),
'pageName' => $pageName,
]
);
});
}
}
<?php
namespace App\Support;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Collection as BaseCollection;
class Collection extends BaseCollection
{
public function paginate($perPage, $total = null, $page = null, $pageName = 'page')
{
$page = $page ?: LengthAwarePaginator::resolveCurrentPage($pageName);
return new LengthAwarePaginator(
$this->forPage($page, $perPage),
$total ?: $this->count(),
$perPage,
$page,
[
'path' => LengthAwarePaginator::resolveCurrentPath(),
'pageName' => $pageName,
]
);
}
}
# Paginated Collections in Laravel
## Use Case
Laravel provides pagination out of the box for Eloquent Collections, but you can't use that by default on ordinary Collections.
Collections do have the `forPage()` method, but it's more low-level, so it doesn't generate pagination links.
So you have to create a LengthAwarePaginator instance. But what if you want the behaviour to be the same as an Eloquent collection? Then use this macro!
The benefit of this is that the syntax and output is almost identical to the Eloquent Collection `paginate()` method and so it can (relatively) easily be swapped out for an Eloquent Collection when testing.
## Installation
Feel free to copy the most relevant code into your project. You're free to use and adapt as you need.
## Usage
There are 2 approaches below. Which one you use is up to you, but you don't need both. I personally prefer the macro method as I feel it's cleaner and works well with minimal effort, but it's not so good at working with your IDE (code hints etc) and can feel a little detached in some cases.
### The `macro` way
If you prefer, add the `Collection` macro to a Service Provider. That way you can call `paginate()` on any collection:
```php
collect([ ... ])->paginate( 20 );
```
See `AppServiceProvider.php` for a sample implementation.
### The subclass way
Where you want a "pageable" collection that is distinct from the standard `Illuminate\Support\Collection`, implement a copy of `Collection.php` in your application and simply replace your `use Illuminate\Support\Collection` statements at the top of your dependent files with `use App\Support\Collection`:
```php
// use Illuminate\Support\Collection
use App\Support\Collection;
$items = [];
$collection = (new Collection($items))->paginate(20);
```
**Note that this method doesn't work with the `collect()` helper function.**
以上是关于markdown Laravel的可分页Collection实现的主要内容,如果未能解决你的问题,请参考以下文章