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
A quoi ça sert
- Au niveau de la structure
- 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 !!