Как установить KnpPaginatorBundle для разбивки запросов Doctrine в Symfony 4

Производительность является важной особенностью каждого веб-приложения. Одной из самых необходимых вещей в приложениях, которые обрабатывают большие наборы данных, является реализация нумератора страниц. Таким образом, пользователь может перемещаться по сбору данных, не загружая тысячи элементов одновременно. В Symfony 3 KnpPaginatorBundle является идеальным решением, когда вы работаете с Doctrine, однако с появлением Symfony 4 установка и настройка этой утилиты не были хорошо документированы, и большинство разработчиков в конечном итоге реализуют другой пакет ради простота. Но не волнуйтесь, установка этого комплекта будет легкой задачей, если вы будете следовать нашим шагам. KnpPaginatorBundle может разбивать на страницы:

  • array
  • Doctrine\ORM\Query
  • Doctrine\ORM\QueryBuilder
  • Doctrine\ODM\MongoDB\Query\Query
  • Doctrine\ODM\MongoDB\Query\Builder
  • Doctrine\ODM\PHPCR\Query\Query
  • Doctrine\ODM\PHPCR\Query\Builder\QueryBuilder
  • Doctrine\Common\Collection\ArrayCollection — любая коллекция отношений доктрины, включая
  • ModelCriteria — Выполнить запрос ORM
  • массив с Solarium_Client а также Solarium_Query_Select как элементы

В этой статье мы покажем вам, как установить широко известный KnpPaginatorBundle в ваш проект на основе Symfony 4.

1. Установите и настройте KnpPaginatorBundle

KnpPaginatorBundle — это пакет для Symfony, который позволяет вам использовать SEO-дружественный пагинатор Symfony для разбивки на страницы. Эта утилита:

  • Не требует инициализации определенных адаптеров
  • Может быть настроен любым необходимым способом и т. Д .: просмотр страниц, подписчики событий.
  • Возможность добавления настраиваемой фильтрации, сортировки в зависимости от параметров запроса.
  • Разделяя проблемы, paginator отвечает только за создание представления разбивки на страницы, представление разбивки на страницы — для целей представления.

Чтобы установить его в свой проект Symfony, вы можете установить его последнюю версию с помощью composer, используя следующую команду:

composer require knplabs/knp-paginator-bundle

Это установит пакет и автоматически зарегистрирует его на app/config/bundles.php файл. Для получения дополнительной информации об этом пакете, пожалуйста, посетите официальный репозиторий на Github здесь.

После установки пакета вам нужно всего лишь создать файл конфигурации paginator в каталоге 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. Настройте Paginator в контроллере

Как только плагин установлен и настроен, его использование довольно просто. Просто убедитесь, что ваши контроллеры расширяют Symfony\Bundle\FrameworkBundle\Controller\Controller класс, поскольку это тот, который позволяет вам получить доступ к нескольким службам с помощью метода get класса. Просто создайте экземпляр paginator и сохраните его в переменной, затем создайте некоторый запрос Doctrine (важный запрос, а не результаты), а затем вызовите метод paginate из paginator и предоставьте его 3 обязательных аргумента:

  1. Запрос доктрины
  2. Текущая страница, определенная параметром get «page» и устанавливающая первую страницу по умолчанию, когда этот параметр не существует.
  3. Лимит элементов на страницу.

Вам нужно перебрать возвращенный элемент метода paginate. Этот объект содержит результаты вашего запроса с ограничением результатов и другими свойствами, к которым вы можете обратиться позже в представлении:

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();
/* @var $paginator \Knp\Component\Pager\Paginator */
$paginator  = $this->get('knp_paginator');
// 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. Создайте paginator в виде Twig

Как показано на предыдущем шаге, мы отправили объект разбивки на страницы в представление Twig, которое отображает наш ползунок разбивки на страницы и элементы. В нашем примере содержимое нашего представления Twig следующее:

{# ./templates/default/index.html.twig #}
My Application
    {% for appointment in appointments %}
  • {{ appointment.title }}
  • {% endfor %}
{{ knp_pagination_render(appointments) }}

Это создаст список из 5 элементов на каждой странице, как указано в нашем контроллере. knp_pagination_render Функция отображает слайдер со всеми доступными страницами элементов. При нажатии на каждую сгенерированную ссылку также будет использоваться тот же URL со всеми его параметрами запроса и новый параметр, а именно страница, которая указывает нашему контроллеру, какие элементы возвращать в представление.

Ссылка на основную публикацию
Adblock
detector