个性化阅读
专注于IT技术分析

如何在Symfony 4中安装KnpPaginatorBundle来对学说进行分页

本文概述

性能是每个Web应用程序的重要功能。分页器的实现是处理大量数据的应用程序中最必要的事情之一。因此, 用户可以浏览数据集合而无需一次加载数千个项目。在Symfony 3中, 当你使用Doctrine时, KnpPaginatorBundle是一个完美的解决方案, 但是, 随着Symfony 4的引入, 该实用程序的安装和配置没有得到很好的文档说明, 并且大多数开发人员最终都会为实现另一个软件包而实现简单。但是请放心, 如果你按照我们的步骤进行安装, 那么这个捆绑包的安装很容易。 KnpPaginatorBundle可以分页:

  • Array
  • 原则\ ORM \查询
  • 主义\ ORM \ QueryBuilder
  • 教义\ ODM \ MongoDB \ Query \ Query
  • 主义\ ODM \ MongoDB \ Query \ Builder
  • 教义\ ODM \ PHPCR \ Query \ Query
  • 主义\ ODM \ PHPCR \ Query \ Builder \ QueryBuilder
  • Doctrine \ Common \ Collection \ ArrayCollection-任何教义关系集合, 包括
  • ModelCriteria-推进ORM查询
  • 以Solarium_Client和Solarium_Query_Select为元素的数组

在本文中, 我们将向你展示如何在基于Symfony 4的项目中安装广为人知的KnpPaginatorBundle。

1.安装和配置KnpPaginatorBundle

KnpPaginatorBundle是Symfony的软件包, 允许你使用SEO友好的Symfony分页器对所有内容进行分页。该实用程序:

  • 不需要初始化特定的适配器
  • 可以按任何需要的方式进行自定义, 等等:分页视图, 事件订阅者。
  • 可以根据请求参数添加自定义过滤, 排序功能。
  • 关注点分离, 分页器仅负责生成分页视图, 即分页视图-用于表示目的。

为了将其安装在你的Symfony项目中, 可以使用以下命令通过composer安装其最新版本:

composer require knplabs/knp-paginator-bundle

这将安装捆绑软件并将其自动注册到app / config / bundles.php文件中。有关此软件包的更多信息, 请访问Github上的官方存储库。

安装软件包后, 只需在app / config / packages目录中创建分页器的配置文件。该文件是knp_paginator.yaml, 其中包含此实用程序的配置。该配置由你决定, 但是你可以使用文档提供的默认配置:

# config/packages/paginator.yaml
knp_paginator:
    page_range: 5                       # number of links showed in the pagination menu (e.g: you have 10 pages, a page_range of 3, on the 5th page you'll see links to page 4, 5, 6)
    default_options:
        page_name: page                 # page query parameter name
        sort_field_name: sort           # sort field query parameter name
        sort_direction_name: direction  # sort direction query parameter name
        distinct: true                  # ensure distinct results, useful when ORM queries are using GROUP BY statements
        filter_field_name: filterField  # filter field query parameter name
        filter_value_name: filterValue  # filter value query paameter name
    template:
        pagination: '@KnpPaginator/Pagination/sliding.html.twig'     # sliding pagination controls template
        sortable: '@KnpPaginator/Pagination/sortable_link.html.twig' # sort link template
        filtration: '@KnpPaginator/Pagination/filtration.html.twig'  # filters template

保存文件, 清除项目的缓存。

2.在控制器中配置分页器

安装并配置了插件后, 其用法非常简单。只需确保你的控制器扩展了Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller类, 这是允许你使用该类的get方法访问多个服务的类。只需实例化分页器并将其保留在变量上, 然后创建一些Doctrine查询(重要查询, 而非结果), 然后从分页器调用paginate方法并提供其3个必需参数:

  1. 教义查询
  2. 当前页面, 由get参数” page”定义, 并在该参数不存在时将第一页设置为默认页面。
  3. 每页的项目限制。

你需要遍历paginate方法的返回元素。该对象包含查询结果以及结果限制和其他属性, 你可以稍后在视图中访问这些属性:

<?php

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use App\Entity\Appointments;

// Include paginator interface
use Knp\Component\Pager\PaginatorInterface;

class DefaultController extends AbstractController
{
    // Include the paginator through dependency injection, the autowire needs to be enabled in the project
    public function index(Request $request, PaginatorInterface $paginator)
    {
        // Retrieve the entity manager of Doctrine
        $em = $this->getDoctrine()->getManager();
        
        // Get some repository of data, in our case we have an Appointments entity
        $appointmentsRepository = $em->getRepository(Appointments::class);
                
        // Find all the data on the Appointments table, filter your query as you need
        $allAppointmentsQuery = $appointmentsRepository->createQueryBuilder('p')
            ->where('p.status != :status')
            ->setParameter('status', 'canceled')
            ->getQuery();
        
        // Paginate the results of the query
        $appointments = $paginator->paginate(
            // Doctrine Query, not results
            $allAppointmentsQuery, // Define the page parameter
            $request->query->getInt('page', 1), // Items per page
            5
        );
        
        // Render the twig view
        return $this->render('default/index.html.twig', [
            'appointments' => $appointments
        ]);
    }
}

现在, 你返回了分页结果, 你可以在Twig视图中访问该对象, 该对象将作为对控制器中此操作的响应而呈现。

3.在Twig视图中创建分页器

如上一步所示, 我们将分页对象发送到了Twig视图, 该视图呈现了分页滑块和项目。在我们的示例中, Twig视图的内容如下:

{# ./templates/default/index.html.twig #}
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>My Application</title>
    </head>
    <body>
        <ul>
        {% for appointment in appointments %}
            <li>
                {{ appointment.title }}
            </li>
        {% endfor %}
        </ul>
        
        <div class="navigation">
            {{ knp_pagination_render(appointments) }}
        </div>
    </body>
</html>

如控制器中所示, 这将在每个页面上生成5个项目的列表。 knp_pagination_render函数使用项目的所有可用页面呈现一个滑块。当单击每个生成的链接时, 还将使用具有所有查询参数的相同URL, 新参数即页面, 该页面指示我们的控制器哪些项目返回视图。

编码愉快!

赞(0)
未经允许不得转载:srcmini » 如何在Symfony 4中安装KnpPaginatorBundle来对学说进行分页

评论 抢沙发

评论前必须登录!