SpiriitFormFilterBundle - Bundle Symfony

Avec la sortie de Symfony 6.3, les bundles se mettent à jour. Il y en a un que j’apprécie particulièrement, c’est le spiriit-form-filter-bundle récemment mis à jour pour Symfony 6.3 (déjà présent depuis Symfony 2.0).

Pourquoi ne pas en profiter pour faire un petit rappel de ce qu’il apporte comme fonctionnalité.

Chez Spiriit, on aime utiliser des thèmes Admin en Bootstrap pour nos clients et pouvoir les customiser facilement par nos équipes de développeurs Symfony et front.

Dans ce genre de thème, on est souvent confronté à des listes de nos entités Doctrine et des filtres de recherche. C’est là qu’intervient le bundle.

Filtrer des requêtes Doctrine

Comme son nom l’indique, le but premier de ce bundle est de filtrer votre requête SQL via des formulaires. Pour être encore plus précis, le bundle fournit un QueryBuilder permettant d’utiliser ceux de doctrine, que ce soit via l’ORM, ODM ou DBAL.

Avec l’ORM, le bundle va construire des expressions en DQL. C’est là sa seule fonctionnalité, générer des clauses WHERE en DQL.

Le Bundle propose quelques formulaires pour filtrer, des FilterType.

Par exemple le BooleanFilterType qui propose par défaut deux choix yes(y) ou no(n). Le DateRangeFilterType et DateTimeRangeFilterType, qui proposent deux champs pour filtrer entre deux dates. Voici un extrait de code de son fonctionnement :

Autre exemple, le TextFilterType qui propose un champ texte de recherche et par défaut va générer une expression « égale à ». Si dans ma recherche, je tape « symfony », le DQL va être where name = 'symfony'.

On peut choisir parmi une liste d’opérateurs de recherche :

STRING_STARTS, STRING_ENDS, STRING_EQUALS (default), STRING_CONTAINS

Et ainsi dans le code du bundle, on obtient le DQL via le code :

Utilisation

Si vous avez une entité Camping, avec un champ « name » et une relation « sport » vers une entité « Sport », vous pouvez créer ce formulaire, le bundle va faire le lien tout seul entre le nom du champ du formulaire et le champ de l’entité pour générer le DQL :

On peut également utiliser des champs qui n’existent pas dans votre entité et créer sa clause Where manuellement :

Bonus

Le Bundle propose aussi un form_div_layout.html.twig, par exemple le TextFilterType peut afficher une liste d’opérateurs (starts, ends, equals, contains) en plus du champ texte.

Le template affichera le html ci-dessous :

Pagination

La pagination va souvent de pair avec les filtres de recherches, voici un morceau d’exemple avec Pagerfanta que vous pouvez retrouver entièrement dans la documentation :

Avec ça on a bien notre pagination avec les clauses WHERE ajoutées au DQL.

Conclusion

Pour résumer, le bundle permet de construire des clauses WHERE dans vos requêtes DQL en utilisant des formulaires classiques.


Vous pouvez l’utiliser également avec symfony/twig.component comme démontré ici et symfony/live-component.

J’espère que ce petit article vous aura donné envie d’installer ce bundle très pratique !

Voir l’étude de cas
Lire l’article
Voir le témoignage
Fermer