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>