本文概述
性能是每个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个必需参数:
- 教义查询
- 当前页面, 由get参数” page”定义, 并在该参数不存在时将第一页设置为默认页面。
- 每页的项目限制。
你需要遍历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, 新参数即页面, 该页面指示我们的控制器哪些项目返回视图。
编码愉快!
评论前必须登录!
注册