Mago guard : Proteger la structure de vos projets

22 February 2026 Modifié le 22 February 2026 Amélioration du site Software craftsmanship 3 min de lecture
Suite à la mise en place des 3 premiers outils (analyse, lint, format) , il ne me manquait plus que la partie Guard. Je conseille vivement, du maigre recul que j'ai pour l'instant.

A quoi ça sert

Ca protège la structure de votre code à 2 niveaux :
  1. Au niveau de la structure
  2. Au niveau des règles de nommages, et attributs

Au niveau de la structure

Vous voulez pas que la couche Domain appelle la couche Infrastructure ? Vous définissez les couches : [guard] mode = "default" #réalise les 2 types de guards [guard.perimeter] # Defines the architectural layers from core to infrastructure. layering = [ "App\\Domain", "App\\Infrastructure", "App\\DataFixtures", "App\\Tests" ] # Creates reusable aliases for groups of namespaces. [guard.perimeter.layers] core = ["@native", "Psl\\**"] framework = ["Symfony\\**"] doctrine = ["Doctrine\\**"] libs = ["Twig\\**", "Sonata\\**", "Gedmo\\**"] [[guard.perimeter.rules]] namespace = "App\\Domain" permit = [ "@layer:framework", "@layer:core","@layer:doctrine"] [[guard.perimeter.rules]] namespace = "App\\Infrastructure" permit = ["@native","@layer:framework","@layer:libs","@layer:doctrine"] [[guard.perimeter.rules]] namespace = "App\\Tests" permit = ["@all"] [[guard.perimeter.rules]] namespace = "App\\DataFixtures" permit = ["@all"] En mettant en place ces contrôles, j'ai pu voir que j'ai mal isolé mon domaine : il dépend de symfony et de doctrine Pour la dépendance à Symfony, je la considère pas génante, je gravite dans son écosystème. Pour Doctrine, la dépendance à cause de Collection me plait, et faudra que je la brise.

Pour les règles de nommages et attributs :

J'suis resté simple pour l'instant, mais faudra que je pose tout ça proprement : typiquement, il faut que je crée une règle qui dit que mes interfaces finissent toujours par Interface, et Abstract par abstract, etc... [[guard.structural.rules]] on = "App\\Infrastructure\\Controller\\**" target = "class" must-be-named = "*Controller" must-be-final = true reason = "Controllers must be final and follow naming conventions." [[guard.structural.rules]] on = "App\\Domain\\**\\Enum\\**" must-be = ["enum"] reason = "This namespace is designated for enums only." J'ajoute donc mago guard à la liste des outils à run avant merge ! Une bonne soirée !!