Symfony — Les Filtres doctrines

NicolasFz.code
3 min readOct 4, 2021

Comme leur nom l’indique, les filtres doctrines permettent d’appliquer un filtre sur une partie ou sur la totalité des requêtes de votre application. Ils sont particulièrement utiles si vous avez besoin de limiter la récupération d’une entité selon certains critères de manière récurrente.

Avec les filtres doctrine, vous n’aurez plus besoin de créer systématiquement une méthode de Repository pour rajouter la condition WHERE sur chaque requête. Cela rendra votre code plus clair et simple à maintenir.

De plus, les filtres s’appliquent pour les entités récupérées mais également pour les entités jointes, ce qui permet de filtrer indirectement les entités liées.

Mise en place d’un filtre simple

Pour cet article, nous voulons filtrer des articles de blogs (Posts) qui ne sont pas encore publiés (published).
Commençons par créer la classe de notre filtre, PublishedPostFilter :

Notre classe doit étendre la classe SQLFilter pour être considérée comme un filtre doctrine.
Dans cette classe, nous devons uniquement implémenter la fonction addFilterConstraint(). Celle-ci va être appelée pour chaque entité utilisée dans une requête et va nous permettre d’ajouter une condition WHERE (et uniquement cette condition la).

Pour éviter d’appliquer cette condition à toutes les requêtes de notre application (rappelez vous, nous voulons uniquement filtrer les Posts), nous pouvons utiliser le paramètre $targetEntity qui contient les “meta-informations” de l’entité récupérée par la requête.

Enfin, le paramètre $targetTableAlias contient l’alias utilisé dans la requête pour identifier l’entité et il va nous permettre de générer la condition avec le bon alias.

Maintenant que notre filtre est crée, il faut indiquer son existence à doctrine.
Pour cela, nous allons modifier le fichier de configuration doctrine.yml pour y ajouter la section filters :

Ici, published_post_filter est le nom de notre filtre. C’est ce qui va nous permettre de l’identifier lorsque nous aurons besoin de l’activer ou de le désactiver. Le paramètre class, comme son nom l’indique permet d’indiquer la classe de notre filtre.

Par défaut le filtre est inactif et il faut l’activer “manuellement” dans notre code pour qu’il soit appliqué. Dans notre Action de récupération de Posts, nous allons indiquer à l’Entity Manager d’activer le filtre :

Il est possible d’activer le filtre indépendamment pour chaque Action ou globalement pour tout le Controller directement dans son constructeur.

Il est également possible d’activer le filtre sur toute l’application, en utilisant le paramètre enabled dans la configuration :

Voilà c’est tout. Vous connaissez maintenant les bases de l’utilisation des filtres doctrines. Néanmoins nous pouvons encore aller un peu plus loin dans l’utilisation de nos filtres !

Activer dynamiquement un filtre via un Event Subscriber

Maintenant supposons que nous voulons autoriser certains utilisateurs à avoir accès aux Posts non publiés. Tester les droits de nos utilisateurs dans toutes les Actions pour déterminer si nous devons activer le filtre serait long et fastidieux. Nous allons donc utiliser un Event Subscriber qui va nous permettre de généraliser ce comportement :

Cet Event Subscriber va être exécuté pour chaque à chaque appel d’action de notre application et va déterminer s’il doit activer notre filtre en fonction du rôle “ROLE_ACCESS_UNPUBLISHED_POST” de l’utilisateur.

Ajouter des paramètres aux filtres

Pour terminer, nous avons un peu modifié le fonctionnement de notre application. Maintenant la propriété published de nos Posts n’est plus un booléen mais un code qui peu prendre plusieurs valeurs (correspondants aux statuts possibles des Posts). Nous voulons donc indiquer au filtre le code qui correspond au statut que nous désirons récupérer.

Lors de l’activation du filtre, il est possible de lui envoyer des paramètres comme ceci :

Bien sûr, cella fonctionne également si nous utilisons l’Event Subscriber mis en place précédemment, ce qui nous permettrait d’autoriser différents statuts en fonctions des droits de nos utilisateurs.

Dans le filtre, nous pouvons alors récupérer les paramètres envoyés via la fonction getParameter(). Modifions donc notre filtre :

Avant de récupérer le paramètre, nous voulons tout de même vérifier que celui-ci a correctement été passé au filtre. Si ce n’était pas le cas, nous aurions pu mettre un filtre par défaut sur un statut arbitraire par exemple.

Vous maitrisez maintenant les filtres Doctrine sur le bout des doigts !
Avec les différents éléments vu dans cet article, vous allez pouvoir grandement simplifier le fonctionnement et améliorer la maintenabilité de votre application.

J’espère que cet article vous aura plu. Si vous avez des remarques ou des suggestions à son sujet, n’hésitez pas à me le faire savoir en commentaire.

--

--

NicolasFz.code

Lead Développeur PHP/Symfony, Chargé de recrutement technique