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

本文概述

  • 1.安装和配置KnpPaginatorBundle
  • 2.在控制器中配置分页器
  • 3.在Twig视图中创建分页器
性能是每个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.安装和配置KnpPaginatorBundleKnpPaginatorBundle是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.yamlknp_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 namesort_field_name: sort# sort field query parameter namesort_direction_name: direction# sort direction query parameter namedistinct: true# ensure distinct results, useful when ORM queries are using GROUP BY statementsfilter_field_name: filterField# filter field query parameter namefilter_value_name: filterValue# filter value query paameter nametemplate:pagination: '@KnpPaginator/Pagination/sliding.html.twig'# sliding pagination controls templatesortable: '@KnpPaginator/Pagination/sortable_link.html.twig' # sort link templatefiltration: '@KnpPaginator/Pagination/filtration.html.twig'# filters template

保存文件, 清除项目的缓存。
2.在控制器中配置分页器【如何在Symfony 4中安装KnpPaginatorBundle来对学说进行分页】安装并配置了插件后, 其用法非常简单。只需确保你的控制器扩展了Symfony \ Bundle \ FrameworkBundle \ Controller \ Controller类, 这是允许你使用该类的get方法访问多个服务的类。只需实例化分页器并将其保留在变量上, 然后创建一些Doctrine查询(重要查询, 而非结果), 然后从分页器调用paginate方法并提供其3个必需参数:
  1. 教义查询
  2. 当前页面, 由get参数” page” 定义, 并在该参数不存在时将第一页设置为默认页面。
  3. 每页的项目限制。
你需要遍历paginate方法的返回元素。该对象包含查询结果以及结果限制和其他属性, 你可以稍后在视图中访问这些属性:
< ?phpnamespace App\Controller; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\Request; use App\Entity\Appointments; // Include paginator interfaceuse Knp\Component\Pager\PaginatorInterface; class DefaultController extends AbstractController{// Include the paginator through dependency injection, the autowire needs to be enabled in the projectpublic 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 page5); // Render the twig viewreturn $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, 新参数即页面, 该页面指示我们的控制器哪些项目返回视图。
编码愉快!

    推荐阅读