web-ruslan / laravel-pretty-pagination
Laravel SEO友好型分页路由。
Requires
- php: ^7.1.3|^8
- ext-json: *
- illuminate/contracts: 5.8.*|^6|^7|^8|^9
- illuminate/pagination: 5.8.*|^6|^7|^8|^9
- illuminate/routing: 5.8.*|^6|^7|^8|^9
- illuminate/translation: 5.8.*|^6|^7|^8|^9
Requires (Dev)
- phpunit/phpunit: ^9.3|^10.0
- roave/security-advisories: dev-master
This package is auto-updated.
Last update: 2024-09-06 18:59:57 UTC
README
此包为Laravel添加了paginate路由方法,支持通过自定义路由而不是查询字符串进行分页。这还允许轻松地翻译分页路由,例如/news/page/2、/nieuws/pagina/2。
安装
通过Composer
composer require web-ruslan/laravel-pretty-pagination
首先在您的应用程序中注册服务提供者和外观。
// config/app.php 'providers' => [ ... 'WebRuslan\PaginateRoute\PaginateRouteServiceProvider', ]; 'aliases' => [ ... 'PaginateRoute' => 'WebRuslan\PaginateRoute\PaginateRouteFacade', ];
然后,在App\Providers\RouteServiceProvider::boot()中注册宏。
// app/Providers/RouteServiceProvider.php use WebRuslan\PaginateRoute\PaginateRouteFacade as PaginateRoute; // ... public function boot() { PaginateRoute::registerMacros(); // Add this line parent::boot(); }
用法
paginate路由宏将为您注册两个路由。
// app/Http/routes.php // Generates /users & /users/page/{page} Route::paginate('users', 'UsersController@index');
在路由的动作中,您可以直接使用Laravel的常规分页方法。
// app/Http/Controllers/UsersController.php public function index() { return view('users.index', ['users' => \App\User::simplePaginate(5)]); }
如果您想自定义分页器的基本URL,请使用setPath函数。
public function index() { $users = \App\User::simplePaginate(5); $users->setPath('custom/url'); return view('users.index', ['users' => $users]); }
如果您想自定义或添加“页面”URL段的语言翻译,可以发布语言文件。
php artisan vendor:publish --provider="WebRuslan\PaginateRoute\PaginateRouteServiceProvider"
生成URL
由于Laravel的分页器URL仍然使用查询字符串,所以PaginateRoute有自己的URL生成器和页面辅助函数。
@if(PaginateRoute::hasPreviousPage())
<a href="{{ PaginateRoute::previousPageUrl() }}">Previous</a>
@endif
@if(PaginateRoute::hasNextPage($users))
<a href="{{ PaginateRoute::nextPageUrl($users) }}">Next</a>
@endif
nextPage函数需要一个分页器实例作为参数,这样它们就可以确定是否还有更多记录。
/** * @param \Illuminate\Contracts\Pagination\Paginator $paginator * @return int|null */ public function nextPage(Paginator $paginator)
/** * @param \Illuminate\Contracts\Pagination\Paginator $paginator * @return bool */ public function hasNextPage(Paginator $paginator)
/** * @param \Illuminate\Contracts\Pagination\Paginator $paginator * @return string|null */ public function nextPageUrl(Paginator $paginator)
/** * @param \Illuminate\Contracts\Pagination\Paginator $paginator * @return int|null */ public function previousPage(Paginator $paginator)
/** * @return bool */ public function hasPreviousPage()
/** * @param bool $full * @return string|null */ public function previousPageUrl($full = false)
/** * @param \Illuminate\Contracts\Pagination\Paginator $paginator * @param int $page * @param bool $full * @return string */ public function pageUrl(Paginator $paginator, $page, $full = false)
如果$full为true,则第一页将是一个完全合格的URL。例如:/users/page/1而不是仅仅/users(这是默认值)。
要检索非当前路由的特定分页路由的URL,可以使用addPageQuery函数。
/** * @param string $url * @param int $page * @param bool $full * @return string */ public function addPageQuery($url, $page, $full = false)
您还可以检索包含所有可用URL的数组。这些可以作为纯HTML列表以页码形式渲染。请注意,这些函数需要一个LengthAwarePaginator。
/** * @param \Illuminate\Contracts\Pagination\LengthAwarePaginator $paginator * @param bool $full * @return array */ public function allUrls(LengthAwarePaginator $paginator, $full = false)
/** * @param \Illuminate\Contracts\Pagination\LengthAwarePaginator $paginator * @param bool $full * @param array $styles * @param bool $additionalLinks * @return string */ public function renderPageList(LengthAwarePaginator $paginator, $full = false, $styles = null, $additionalLinks = false)
/**
* Example : {!! PaginateRoute::renderPageList($items,true,null,true) !!}
*/
<!-- Example output: -->
<ul>
<li><a href="http://example.com/news">1</a></li>
<li><a href="http://example.com/news/page/2">2</a></li>
<li class="active"><a href="http://example.com/news/page/3">3</a></li>
<li><a href="http://example.com/news/page/4">4</a></li>
<li><a href="http://example.com/news/page/4">»</a></li>
</ul>
您可以为分页器添加样式,如下所示
/**
* Example : {!! PaginateRoute::renderPageList($companies, false,
* [
* 'ul' => 'pagination-list',
* 'li' => 'pagination-list-item',
* 'a' => 'pagination-list-link',
* 'previous_a' => 'pagination-prev',
* 'next_a' => 'pagination-next',
* 'active_a' => 'pagination-active',
* 'previous_label' => '<i class="fas fa-chevron-left"></i>',
* 'next_label' => '<i class="fas fa-chevron-right"></i>',
* ],
* true) !!}
*/
<!-- Example output: -->
<ul class="pagination-list">
<li class="pagination-list-item">
<a href="http://example.com/news" class="pagination-prev"><i class="fas fa-chevron-left"></i></a>
</li>
<li class="pagination-list-item">
<a href="http://example.com/news/page/2" class="pagination-list-link pagination-active">2</a>
</li>
<li class="pagination-list-item">
<a href="http://example.com/news/page/3" class="pagination-list-link">3</a>
</li>
<li class="pagination-list-item">
<a href="http://example.com/news/page/4" class="pagination-list-link">4</a>
</li>
<li class="pagination-list-item">
<a href="http://example.com/news/page/5" class="pagination-list-link">4</a>
</li>
<li class="pagination-list-item">
<a href="http://example.com/news/page/3" class="pagination-next"><i class="fas fa-chevron-right"></i></a>
</li>
</ul>
您可以通过渲染链接标记来标记上一页和下一页以供SEO使用。请注意,这些函数需要一个LengthAwarePaginator。
/** * @param \Illuminate\Contracts\Pagination\LengthAwarePaginator $paginator * @param bool $full * @return string */ public function renderRelLinks(LengthAwarePaginator $paginator, $full = false)
<!-- Example output: --> <link rel="prev" href="http://example.com/news/page/2" /> <link rel="next" href="http://example.com/news/page/4" />
测试
该包包含一些集成/冒烟测试,使用Orchestra设置。可以通过phpunit运行这些测试。
$ phpunit
即将推出
- 支持Bootstrap 4.*的分页渲染。
贡献
有关详细信息,请参阅CONTRIBUTING。
安全
如果您发现任何安全相关的问题,请通过webruslan@gmail.com发送电子邮件,而不是使用问题跟踪器。
致谢
许可
MIT许可(MIT)。请参阅许可文件以获取更多信息。