Je viens vous présenter un outil que j'utilise assez régulièrement dans mes projets, et que j'ai un peu complété depuis que j'utilise Symfony.
En préambule, il faut connaître le format YAML.
Pour pouvoir générer les graphiques, il faut également avoir l'(excellentissime) application Graphviz installée.
[mode="troll"]
Pour résumer : XML c'est le mal, c'est verbeux, lourd, et soit-disant lisible par les humains (?). Le YAML c'est le bien, c'est léger, c'est clair, et vraiment lisible par les humains (!).
[/mode]
Pour ceux qui connaissent JSON, il s'agit d'un sous-ensemble de YAML.
Objectif
On écrit son modèle en YAML, cela décrit les objets et les relations qu'il y a entre eux. Du même coup cela décrit la base de données.
L'objectif est de pouvoir écrire un schéma simple, sans avoir à expliciter le fonctionnement interne des relations.
On devra pouvoir également spécifier des types personnalisés pour le confort d'utilisation.
Description
L'outil se compose de la classe externe "Spyc" (parseur de fichiers YAML), et de la classe "YmlSchemaConverter" qui offre les fonctionnalités de conversion.
Il se base sur la commande 'dot' de Graphviz pour générer les graphiques.
La classe permet de lire un schéma comme celui fourni en exemple et :
- de générer un graphique correspondant à ce schéma
- d'«étendre» les relations (cela consiste à expliciter les clé étrangères et les tables intermédiaires)
- de générer un schéma compatible Symfony (à compléter évidemment car cet outil ne gère pas les index ni les valeurs par défaut, entre autres).
Exemple
Voici le modèle que l'on veut décrire :
- Un utilisateur a une adresse e-mail, un nom, un niveau, un à plusieurs groupes, zéro à plusieurs permissions, et un profil d'utilisateur.
- Un profil d'utilisateur a un nom et un prénom.
- Un groupe a un nom, zéro à plusieurs utilisateurs, zéro à un groupe parent, et zéro à plusieurs permissions.
- Une permission a un nom d'action, et une valeur autorisé/interdit.
Voici un exemple de schéma YAML correspondant, que l'outil peut comprendre et analyser :
Code : Tout sélectionner
_types:
email: varchar(128)
level: [ guest, member, moderator, administrator ]
user:
username: { type: varchar(64), required: true }
email: { type: _email, required: true }
level: { type: _level, required: true }
groups: { type: Group, has_many: true, required: true }
permissions: { type: Permission, has_many: true }
profile: { type: UserProfile, required: true }
user_profile:
first_name: { type: varchar(64) }
last_name: { type: varchar(64) }
permission:
action: { type: varchar(16), required: true }
authorized: { type: boolean, required: true }
group:
name: { type: varchar(64), required: true }
parent_group: { type: Group }
users: { type: User, has_many: true }
permissions: { type: Permission, has_many: true }Résultat des conversions de l'exemple
Graphique du schéma «normal» :

Graphique du schéma «étendu» :

Schéma Symfony :
Code : Tout sélectionner
propel:
user:
_attributes:
phpName: User
username:
type: varchar(64)
required: true
email:
type: varchar(128)
required: true
level:
type: integer # ENUM( guest, member, moderator, administrator )
required: true
id:
type: ~
user_profile:
_attributes:
phpName: UserProfile
first_name:
type: varchar(64)
last_name:
type: varchar(64)
user_id:
type: ~
required: true
permission:
_attributes:
phpName: Permission
action:
type: varchar(16)
required: true
authorized:
type: boolean
required: true
user_id:
type: ~
group_id:
type: ~
group:
_attributes:
phpName: Group
name:
type: varchar(64)
required: true
id:
type: ~
group_id:
type: ~
user_group:
_attributes:
phpName: UserGroup
user_id:
type: ~
group_id:
type: ~Téléchargement
ymlconvert.zip (32k)
Utilisation
Un script d'exemple "convert-schema.php" ainsi qu'un schéma d'exemple "schema.yml" sont disponibles.
Pas besoin de se plonger dans les méandres de la documentation (à générer avec phpDocumentor) pour l'utiliser :
- Ecrivez votre propre schema dans "schema.yml"
- Ouvrez le fichier "convert-schema.php" pour modifier la configuration. Vous pourrez choisir quels graphiques générer, le chemin vers l'exécutable 'dot', et l'emplacement du schéma symfony à générer (ou pas).
- Exécutez le script "convert-schema.php"
Même pour ceux qui ne travaillent pas avec Symfony, la génération de graphiques automatiques est assez sympa si on a plus l'habitude de travailler en mode «texte» qu'avec un gros modeleur UML
Et je vous encourage à regarder en détail le fonctionnement de Graphviz, c'est un outil qui nous offre bien des possibilités trop méconnues.