Laravel 4 - 在一个页面上使用多个分页器

时间:2014-08-20 21:48:55

标签: php laravel-4 pagination

我一直在谷歌搜索这个问题,但无法找到任何好的答案。我发现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()

1 个答案:

答案 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()方法。