Мне требуется 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 с одинаковыми строками. Он говорит, что он определяет номер страницы, но, очевидно, это неправильно, есть ли способ, которым я могу установить номер страницы вручную или исправить, если проблема на самом деле в моем коде?
Заранее спасибо.
Если кому-то интересно, я просто так и сделал:
$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'));
Это исправило мою проблему, я уверен, что есть лучшее решение, но по крайней мере это работает!
Проблема в том, что Eloquent Paginator не знает, как извлечь параметр «page» из маршрутизатора Slim. Но вы можете дать ему новую функцию, чтобы помочь. Здесь я создал промежуточное программное обеспечение, которое сообщает 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 () непосредственно перед вашим запросом.