Eloquent Slim 3 项目中使用 twig 的分页功能
Eloquent paginate function in Slim 3 project using twig
如何在使用 twig 的 Slim 3 项目中使用 Eloquent 中的分页功能?
这是在我的控制器中:
$posts = Sound::paginate(2);
$this->container->view->render($response, 'admin/sounds/index.twig', [
'posts' => $posts
]);
这是观点:
{{ posts.links() }}
但效果不如我预期:
Warning: call_user_func() expects parameter 1 to be a valid callback, no array or string given in **PATH_TO_PROJECT**\vendor\illuminate\pagination\AbstractPaginator.php on line 412
Fatal error: Call to a member function make() on null in **PATH_TO_PROJECT**\vendor\illuminate\pagination\LengthAwarePaginator.php on line 90
我需要做什么才能让它发挥作用?
你能试试这个吗:
{{ posts.links }}
我认为 links
是 getter 与 returns 的链接。否则,这将不会像您期望的那样工作。
首先,您需要在您的项目中包含 illuminate/pagination(它不包含在 illuminate/database 中):
composer require illuminate/pagination
现在分页器需要知道如何解析当前页面。你应该确保在使用分页器之前完成这项工作,我个人把它放在我设置依赖项的地方:
// $container is application's DIC container.
// Setup Paginator resolvers
Illuminate\Pagination\Paginator::currentPageResolver(function ($pageName = 'page') use ($container) {
$page = $container->request->getParam($pageName);
if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int) $page >= 1) {
return $page;
}
return 1;
});
然后在你的树枝模板中你可以输出分页链接。但是请注意,paginator 会生成一些 HTML 代码,需要将其写入输出 原样 因此您需要告诉 twig 忽略链接转义:
{{ posts.links | raw }}
抱歉来晚了:
我没有保留该项目,我不记得我是怎么做的,但是这个:https://github.com/romanzipp/PHP-Slim-Pagination 看起来像我所做的。
$app->get('/posts', function(Request $req, Response $res, $args = []) use ($cache) {
$page = ($req->getParam('page', 0) > 0) ? $req->getParam('page') : 1;
$limit = 5; // Number of posts on one page
$skip = ($page - 1) * $limit;
$count = Post::getCount([]); // Count of all available posts
return $this->view->render($res, 'post-list.twig', [
'pagination' => [
'needed' => $count > $limit,
'count' => $count,
'page' => $page,
'lastpage' => (ceil($count / $limit) == 0 ? 1 : ceil($count / $limit)),
'limit' => $limit,
],
// return list of Posts with Limit and Skip arguments
'posts' => Post::getList([
'limit' => $limit,
'skip' => $skip,
])
]);
});
在模板中:
{% if pagination.needed %}
<div class="ui pagination menu">
{% for i in 1..pagination.lastpage %}
<a class="{% if i == pagination.page %}active{% endif %} item" href="?page={{ i }}">{{ i }}</a>
{% endfor %}
</div>
{% endif %}
<div class="ui container">
{% for post in posts %}
<a class="item">
{# Post contents (title, url, ...) #}
</a>
{% endfor %}
</div>
如何在使用 twig 的 Slim 3 项目中使用 Eloquent 中的分页功能?
这是在我的控制器中:
$posts = Sound::paginate(2);
$this->container->view->render($response, 'admin/sounds/index.twig', [
'posts' => $posts
]);
这是观点:
{{ posts.links() }}
但效果不如我预期:
Warning: call_user_func() expects parameter 1 to be a valid callback, no array or string given in **PATH_TO_PROJECT**\vendor\illuminate\pagination\AbstractPaginator.php on line 412
Fatal error: Call to a member function make() on null in **PATH_TO_PROJECT**\vendor\illuminate\pagination\LengthAwarePaginator.php on line 90
我需要做什么才能让它发挥作用?
你能试试这个吗:
{{ posts.links }}
我认为 links
是 getter 与 returns 的链接。否则,这将不会像您期望的那样工作。
首先,您需要在您的项目中包含 illuminate/pagination(它不包含在 illuminate/database 中):
composer require illuminate/pagination
现在分页器需要知道如何解析当前页面。你应该确保在使用分页器之前完成这项工作,我个人把它放在我设置依赖项的地方:
// $container is application's DIC container.
// Setup Paginator resolvers
Illuminate\Pagination\Paginator::currentPageResolver(function ($pageName = 'page') use ($container) {
$page = $container->request->getParam($pageName);
if (filter_var($page, FILTER_VALIDATE_INT) !== false && (int) $page >= 1) {
return $page;
}
return 1;
});
然后在你的树枝模板中你可以输出分页链接。但是请注意,paginator 会生成一些 HTML 代码,需要将其写入输出 原样 因此您需要告诉 twig 忽略链接转义:
{{ posts.links | raw }}
抱歉来晚了:
我没有保留该项目,我不记得我是怎么做的,但是这个:https://github.com/romanzipp/PHP-Slim-Pagination 看起来像我所做的。
$app->get('/posts', function(Request $req, Response $res, $args = []) use ($cache) {
$page = ($req->getParam('page', 0) > 0) ? $req->getParam('page') : 1;
$limit = 5; // Number of posts on one page
$skip = ($page - 1) * $limit;
$count = Post::getCount([]); // Count of all available posts
return $this->view->render($res, 'post-list.twig', [
'pagination' => [
'needed' => $count > $limit,
'count' => $count,
'page' => $page,
'lastpage' => (ceil($count / $limit) == 0 ? 1 : ceil($count / $limit)),
'limit' => $limit,
],
// return list of Posts with Limit and Skip arguments
'posts' => Post::getList([
'limit' => $limit,
'skip' => $skip,
])
]);
});
在模板中:
{% if pagination.needed %}
<div class="ui pagination menu">
{% for i in 1..pagination.lastpage %}
<a class="{% if i == pagination.page %}active{% endif %} item" href="?page={{ i }}">{{ i }}</a>
{% endfor %}
</div>
{% endif %}
<div class="ui container">
{% for post in posts %}
<a class="item">
{# Post contents (title, url, ...) #}
</a>
{% endfor %}
</div>