Правильный способ использования класса пагинации в Symfony
Я пытаюсь использовать этот пакет Symfony: https://github.com/KnpLabs/KnpPaginatorBundle
В документах они используют контроллер. Таким образом, они имеют легкий доступ к контейнеру службы или объекту запроса.
Но, насколько я понимаю, запрос Doctrine должен быть в репозитории, а не в контроллере, верно? И у меня уже есть функция, возвращающая записи. Просто служба нумерации страниц не ожидает "результатов" при создании экземпляра. Он хочет запрос. Так что я не могу вернуть "результаты" в контроллер, а в середине этой функции используйте paginator.
С другой стороны, такие вещи, как игра с сервисами или запросами, действительно принадлежат контроллерам.
Так как это должно быть сделано? Сначала я подумал о внедрении службы "knp_paginator" и объекта запроса в хранилище. Но я не думаю, что это правильный путь.
3 ответа
Я бы сказал, что объект Request не должен идти дальше по стеку, чем из контроллера.
Ничто не мешает вам ввести paginator непосредственно в ваш собственный репозиторий, так почему бы не сделать это?
your.repository.service.definition:
class: Your\Repository\Class
# for symfony 2.3
factory_service: doctrine
factory_method: getRepository
# for symfony 2.8 and higher
factory: ["@doctrine.orm.entity_manager", getRepository]
arguments:
- YourBundle:YourEntity
calls:
- [setPaginator, ["@knp_paginator"]]
В хранилище вы должны иметь paginator, доступный для использования с QueryBuilder:
public function setPaginator($paginator)
{
$this->paginator = $paginator;
}
...
$this->paginator->paginate($qb->getQuery(), $page, $limit);
Для того, чтобы получить ваш $page
а также $limit
переменные в хранилище, вам не нужен объект запроса. Просто передайте их как параметр в вызов хранилища:
// In your controller
// You can use forms here if you want, but for brevity:
$criteria = $request->get('criteria');
$page = $request->get('page');
$limit = $request->get('limit');
$paginatedResults = $myCustomRepository->fetchPaginatedData($criteria, $page, $limit);
Передача объекта запроса дальше вниз по Контроллеру означает, что у вас есть утечка в ваших абстракциях. Ваше приложение не должно знать об объекте Request. На самом деле, запрос вполне может поступить из других источников, таких как команда CLI. Вы не хотите создавать объект Request оттуда из-за неправильного уровня абстракции.
Предполагая, что у вас есть пользовательский класс репозитория, вы можете иметь метод в этом репозитории, который возвращает Query или действительный экземпляр Query Builder, а затем вызывает этот метод из контроллера и передает его в paginate()
метод.
Например, когда пользовательский репозиторий возвращает $qb (не возвращает результат, а только его создатель запросов)
$paginator = $this->get('knp_paginator');
$pagination = $paginator->paginate(
$qb->getQuery(),
$request->query->getInt($pageParameterName, 1),
$perPage,
array('pageParameterName' => $pageParameterName)
);