Comment utiliser KNPPaginatorBundle pour paginer des résultats en utilisant Doctrine Repository?
Je suis en train de travailler sur un projet Symfony2 et j'ai décidé d'utiliser KNPPaginatorBundle de construire un simple système de pagination. J'ai donc créé une entité de Produit et je tiens à ajouter le paginator à indexAction action (généré par le CRUD de commande).
//Retrieving products.
$em = $this->getDoctrine()->getManager();
//$entities = $em->getRepository('LiveDataShopBundle:Product')->findAll();
$dql = "SELECT a FROM LiveDataShopBundle:Product a";
$entities = $em->createQuery($dql);
//Creating pagnination
$paginator = $this->get('knp_paginator');
$pagination = $paginator->paginate(
$entities,
$this->get('request')->query->get('page', 1),
20
);
Il fonctionne très bien mais je veux utiliser le Produit de référentiel au lieu de création de la requête directement dans le contrôleur. Comment puis-je le faire ?
En fait, les ajouter directement à la collecte des résultats à la pagination de l'objet est tout simplement trop lent en raison de sa charge tous les produits, puis paginer le type arraycollection.
Merci d'avance.
K4
source d'informationauteur K4timini | 2014-04-02
Vous devez vous connecter pour publier un commentaire.
Je suggère d'utiliser
QueryBuilder
dans votreProductRepository
et puis en passant, que le paginator:Dans le contrôleur:
Je pense que dans certains cas, nous pourrions utiliser
Closure
et passer unQueryBuilder
objet.Dans votre
ProductRepository
vous pourriez faire quelque chose comme ceci:puis dans
ProductController
:Je pense qu'il est plus flexible et vous pouvez utiliser
findAllPublished
méthode pour obtenir les deux paginé ou NON paginé résultats si vous avez besoin d'.Également garder à l'esprit que
callable
type de travail en PHP>=5.4
! S'il vous plaît, vérifiez docs pour plus d'info.Dans notre projet, nous voulons éviter à l'aide de la Doctrine des requêtes dans les contrôleurs. Nous avons également des calques distincts. Les contrôleurs ne doivent pas accéder à la base de données. Je l'ai donc inclus la pagination dans le Référentiel.
Voici mon code dans le contrôleur:
Et voici le code important dans mon référentiel: