与laravel分页一致,总是第1页

时间:2016-06-26 17:19:03

标签: php pagination slim laravel-pagination

我需要Illuminate/pagination进入我的Slim 3项目

我的路线中有以下内容:

$this->get('/traces', 'UserController:getTraces')->setName('user.traces');

在getTraces方法中:

public function getTraces($req, $res)
{
    $loginRows = $this->db->table('login_history')->where('user_id', $_SESSION['user'])->orderBy('id', 'desc')->paginate(5);
    $loginRows->setPath($this->router->pathFor('user.traces'));

    $this->view->getEnvironment()->addGlobal('login_rows', $loginRows);

    return $this->view->render($res, 'user/traces.twig');
}

在我看来(我正在使用Twig):

{{ login_rows.render() | raw }}

所以一切都运行得很好,而且分页html链接,但即使我去了?page=2或任何其他页面。它始终显示具有相同行的第一页1。它说它检测到页码,但显然它是错的,有没有办法我可以手动设置页码或修复问题实际上是在我的代码中?

提前致谢。

2 个答案:

答案 0 :(得分:2)

如果有人有兴趣,我就是这么做的:

$loginRows = $this->db->table('login_history')->where('user_id', $_SESSION['user'])->orderBy('id', 'desc')->paginate(5, ['*'], 'page', $req->getParam('page'));

$loginRows->setPath($this->router->pathFor('user.traces'));

这解决了我的问题,我确信有更好的解决方案,但至少这个有效!

答案 1 :(得分:0)

问题是Eloquent的Paginator不知道如何从Slim的路由器中提取“ page”参数。但是您可以给它一个新功能来提供帮助。在这里,我创建了一个中间件,该中间件告诉Paginator如何找到“ page”参数。

<?php

/**
 * Tells the Eloquent Paginator how to get the current page
 */

namespace App\Middleware;

class Pagination {

    public function __invoke($request, $response, $next)
    {
        \Illuminate\Pagination\Paginator::currentPageResolver(function() use ($request) {
            return $request->getParam('page');
        });

        return $next($request, $response);
    }

}

然后在设置应用程序时,可以添加以下内容:

$app->add(new App\Middleware\Pagination);

请注意,它将为每个页面请求(即使是没有分页的请求)运行。我怀疑这真的会影响性能。如果有必要,您可以将其应用于特定路线。或在查询之前调用currentPageResolver()。