我一直在谷歌搜索这个问题,但无法找到任何好的答案。我发现paginator有一个名为setPageName()
的方法,但只有在使用Paginator::setPageName('page')
时才有效。
我在Laravel API(http://laravel.com/api/class-Illuminate.Pagination.Environment.html)中查找了paginator,该方法是一个公共函数,就像我目前使用的setBaseUrl一样$albums->setBaseUrl('/album/');
例如我想要一个Photo paginator(?photoPage = n)和一个Comment paginator(?commentPage = n)。
有什么方法可以使用两个在一个页面上的URL中使用不同页面名称的分页器,或者至少调用setPageName()
方法,如setBaseUrl()
?
答案 0 :(得分:0)
这里实际上有两个课程:
Factory
类实际上编排了Paginator
个实例的创建。快速浏览一下后,我无法真实地告诉您为什么Factory
班级负责get/setPageName()
,但that's where they live。
您似乎需要两个不同的Factory
实例,幸运的是,这些实例可以通过IoC Container实现。由于PaginationServiceProvider
绑定到paginator
,因此调用$app->make("Illuminate\Pagination\Factory")
两次应生成两个不同的工厂。如果您正在使用名称空间,则将工厂注入控制器的服务提供程序可能如下所示:
class DoublyPaginatedControllerServiceProvider extends ServiceProvider {
public function register($app)
{
$this->bindShared('paginator.photos', function ($app) {
$factory = $app->make('Illuminate\Pagination\Factory');
$factory->setPageName('photoPage');
return $factory;
});
$this->bindShared('paginator.comments', function ($app) {
$factory = $app->make('Illuminate\Pagination\Factory');
$factory->setPageName('commentPage');
return $factory;
});
$this->app->bindShared('Namespace\DoublyPaginatedController', function ($app) {
return new DoublyPaginatedController(
$app['paginator.photos'],
$app['paginator.comments']
);
}
}
}
当然,这里的缺点是您不能使用Eloquent的Model::paginate()
- 您需要手动确定要获取的项目集,并将它们传递给每个Factory的make()
方法。