这是可能的,但您需要编写一些代码。
首先你需要更改app/config/app.php分页服务提供者——你需要自己写。
评论:
// 'Illuminate\Pagination\PaginationServiceProvider',
并添加
'Providers\PaginationServiceProvider',
在提供者部分。
现在你需要创建你的 PaginationServiceProvider 来使用自定义分页工厂:
model/Providers/PaginationServiceProvider.php文件:
<?php
namespace Providers;
use Illuminate\Support\ServiceProvider;
class PaginationServiceProvider extends ServiceProvider
{
/**
* Indicates if loading of the provider is deferred.
*
* @var bool
*/
protected $defer = true;
/**
* Register the service provider.
*
* @return void
*/
public function register()
{
$this->app->bindShared('paginator', function ($app) {
$paginator = new PaginationFactory($app['request'], $app['view'],
$app['translator']);
$paginator->setViewName($app['config']['view.pagination']);
$app->refresh('request', $paginator, 'setRequest');
return $paginator;
});
}
/**
* Get the services provided by the provider.
*
* @return array
*/
public function provides()
{
return array('paginator');
}
}
上面你创建了Providers\PaginationFactory对象,所以现在我们需要创建这个文件:
model/providers/PaginationFactory.php文件:
<?php
namespace Providers;
use Illuminate\Pagination\Factory;
class PaginationFactory extends Factory {
/**
* Get a new paginator instance.
*
* @param array $items
* @param int $total
* @param int|null $perPage
* @return \Illuminate\Pagination\Paginator
*/
public function make(array $items, $total, $perPage = null)
{
$paginator = new \Utils\Paginator($this, $items, $total, $perPage);
return $paginator->setupPaginationContext();
}
}
在这里你只创建\Utils\Paginator 对象,所以现在让我们创建它:
model/Utils/Paginator.php文件:
<?php
namespace Utils;
class Paginator extends \Illuminate\Pagination\Paginator {
/**
* Get a URL for a given page number.
*
* @param int $page
* @return string
*/
public function getUrl($page)
{
$routeParameters = array();
if ($page > 1) { // if $page == 1 don't add it to url
$routeParameters[$this->factory->getPageName()] = $page;
}
return \URL::route($this->factory->getCurrentUrl(), $routeParameters);
}
}
在这个文件中,我们最终覆盖了创建分页 url 的默认方法。
假设您已经这样定义了路由:
Route::get('/categories/{page?}',
['as' => 'categories',
'uses' => 'CategoryController@displayList'
])->where('page', '[1-9]+[0-9]*');
如您所见,我们在这里使用as 定义了路由名称(这很重要,因为上面的 Paginator 实现 - 但您当然可以用不同的方式来做)。
现在在 CategoryController 类的方法 displayList 中,您可以这样做:
public function displayList($categories, $page = 1) // default 1 is needed here
{
Paginator::setCurrentPage($page);
Paginator::setBaseUrl('categories'); // use here route name and not the url
Paginator::setPageName('page');
$categories = Category::paginate(15);
return View::make('admin.category')->with(
['categories' => $categories]
);
}
当您在视图中添加时:
<?php echo $categories->links(); ?>
您将通过这种方式获得生成的网址:
http://localhost/categories
http://localhost/categories/2
http://localhost/categories/3
http://localhost/categories/4
http://localhost/categories/5
没有?在查询字符串中
但是在我看来,应该默认添加这样的东西,或者至少应该足以扩展一个类,而不是仅仅为了实现一种方法而创建 3 个类。