J'ai une collection de classes PHP qui peuvent être instanciées traditionnellement en utilisant des constructeurs. Maintenant, je veux ajouter la possibilité d'instancier ces objets en utilisant des fichiers de configuration YAML.Comment créer au mieux des objets à partir de fichiers de configuration?
Voici un exemple d'un fichier de configuration décrivant un formulaire Web:
title: Contact
fields:
message:
type: text
required: true
topic:
type: dropdown
options: ["HTML", "CSS", "PHP"]
Cela devrait se traduire par un objet de forme avec deux objets de champ correspondant. En d'autres termes, les fichiers de configuration décrivent parfois des objets contenant d'autres objets.
Je ne veux pas simplement un mappage des paires clé/valeur YAML vers les propriétés PHP car je veux autoriser la syntaxe abrégée dans les fichiers de configuration. Par exemple, je veux abréger certains noms de propriété et être capable de taper quelque chose comme default: today
, où "aujourd'hui" n'est pas interprété comme un littéral de chaîne mais plutôt transformé en l'horodatage actuel.
Étant donné que beaucoup de classes sont des sous-classes, je cherche une solution qui me permette en quelque sorte d '"hériter" de la logique de configuration de la superclasse.
Je veux éviter de modifier les classes existantes, mais je suis prêt à le faire si cela permet une solution plus simple. À la réflexion, je ne m'occupe pas vraiment de modifier les classes existantes; Je suis juste intéressé par la meilleure solution.
Comment créer au mieux des objets à partir de fichiers de configuration de cette manière?
C'est en fait l'approche que j'ai utilisée jusqu'à présent, et ça marche mieux que je ne le pensais quand j'ai écrit la question. Je ne sais toujours pas comment gérer l'héritage avec, cependant: Disons que j'ai une classe 'Checkbox' qui étend la classe' Field' et je veux que 'Checkbox' soit lu de la même manière que' Field' sauf pour un peu de nouvelles propriétés (ou différentes). Puisque la méthode 'fromArray' de la superclasse retourne un objet de cette classe particulière (' Field'), je ne peux pas simplement appeler 'parent :: fromArray' dans la sous-classe. Des idées sur la façon de gérer l'héritage? – Jakob
difficile - vous n'auriez pas ce problème si fromArray n'était pas une méthode statique. Dans ce cas, vous devez instancier l'objet (Case à cocher) et utiliser fromArray pour le laisser se configurer. –