2009-08-30 4 views
3

Je construis un framework MVC en PHP qui devra définir un certain nombre de variables/constantes de configuration par défaut. Exemple de config vars serait où enregistrer les fichiers journaux, que ce soit pour enregistrer les requêtes, les paramètres de Doctrine, parmi beaucoup d'autres. Parce que je veux que les développeurs puissent créer de nouveaux projets avec un minimum d'agitation, ces variables de configuration doivent avoir des valeurs par défaut. Cependant, pour que ce framework soit vraiment utile, j'ai besoin qu'ils soient capables de remplacer ces valeurs par défaut soit dans un fichier bootstrap de projet, soit à partir d'un contrôleur ou d'un modèle. J'aimerais utiliser des constantes, mais elles ne peuvent pas être écrasées. Je me sens comme s'il devait y avoir une solution simple que je ne vois tout simplement pas (peut-être un motif de conception?). Tout conseil serait grandement apprécié, merci.Recherche d'idées/solutions pour gérer les paramètres de configuration des applications

Répondre

5

Dans une telle situation, je serais probablement:

  • Créer une classe qui traitent de tout liés à la configuration
    • cette classe contiendrait des méthodes pour obtenir/définir des options de configurations; quelle que soit votre application a besoin
    • Il serait également définir des valeurs par défaut, lorsque approprié
  • Utilisez un fichier .ini ou .xml, dans lequel les valeurs de configuration peuvent être redéfinis

Lorsque instancier la classe :

  • Vous avez déjà les valeurs par défaut
  • Vous parser le fichier .ini ou .xml
  • Chaque valeur définie dans ce fichier de configuration est utilisée pour remplacer la valeur par défaut correspondante définie dans la classe.


Une solution un peu plus complexe, mais peut-être mieux, peut-être à:

  • ont encore cette classe de configuration, mais pas l'utiliser pour stocker des valeurs par défaut
  • avoir un. Fichier ini ou .xml pour stocker les valeurs par défaut
  • Avoir un .ini ou.fichier xml dans lequel les gens peuvent passer outre les valeurs définies dans la valeur par défaut d'un
  • Chargez le fichier contenant les valeurs par défaut, puis celui contenant ceux spécifiques

Les avantages de cette solution sont:

  • Aucune valeur de configuration stockée dans une classe PHP
  • Toutes les options de configuration pouvant être remplacées sont déjà définies dans un fichier .ini/.xml, ce qui signifie que les utilisateurs doivent simplement copier/coller une ligne dans leur fichier spécifique pour la remplacer: non besoin d'aller jeter un oeil à la classe PHP et penser "comment est-ce que je traduis ceci en un fichier de configuration?"


Quelques notes plus:

  • Vous pouvez utiliser une sorte de mise en cache mécanisme, de ne pas ré-analyser les fichiers à chaque demande
  • Zend_Config et Zend_Config_Ini pourrait être utile ; même si vous ne l'utilisez ceux-ci, comme vous écrivez votre propre cadre, vous voudrez peut-être jeter un oeil à ce qu'ils font - Si je me souviens bien, Zend_Config_Ini permet la hiérarchie et l'héritage dans les fichiers .ini

Amusez-vous!

+1

Merci pour la bonne réponse! J'ai une question de suivi pour vous: pourriez-vous fournir un peu plus d'informations sur les mécanismes de mise en cache possibles? Je ne veux certainement pas gaspiller de ressources en ré-analysant les fichiers. –

+0

Salut. Vous êtes les bienvenus :-) A propos de la mise en cache: la première règle est que vous ne devriez pas vous en préoccuper en ce moment; attendez que votre application fonctionne. Ensuite, si cela est nécessaire, vous pouvez stocker les données de configuration analysées soit dans un fichier, soit dans la mémoire (avec APC ou memcache, par exemple); rappelez-vous juste que vous devrez vérifier si le fichier de configuration a été modifié, pour savoir quand invalider le cache, afin que les modifications soient prises en compte. pour un peu plus d'infos, vous pouvez lire l'introduction de http://framework.zend.com/manual/fr/zend.cache.frontends.html#zend.cache.frontends.fichier (même si vous n'utilisez pas ZF) –

1

Voici le motif de conception que j'utiliserais. Je voudrais créer une classe simple pour le faciliter:

class Configuration { 
    String get($key) {...} 
    String set($key, $value) {...} 
} 

La mise en œuvre initiale pourrait tous être codée en dur avec des valeurs par défaut. Plus tard, cependant, vous pourriez glisser dans la lecture d'un serveur et/ou un fichier de configuration spécifique au projet. Cela vous donnerait la flexibilité d'ajouter au besoin.

(J'ai aussi remarqué que les configurations de php.ini semblent avoir le comportement que vous voulez, mais je ne vois pas comment vous tirer parti de ce système directement.)

+0

ne devrait pas être 'void set (...)' ou vous renvoyez l'ancienne valeur? – nickf

2

Je suggérerais d'utiliser plusieurs fichiers ini: un fichier default.ini, puis autant de fichiers override.ini-s que nécessaire. Il suffit ensuite de les charger avec parse_ini_file() et de fusionner en une configuration avec array_merge(). Rapide et simple.

1

Cette question peut venir avec une grande variété de réponses. Ma recommandation personnelle serait de stocker des valeurs dans SQLite et avoir un script séparé pour accéder et modifier ces valeurs. Pour l'autre façon continuer à lire. C'est assez simple en fonction de l'orientation de l'objet que vous souhaitez et de la simplicité avec laquelle vous voulez créer des choses pour vos utilisateurs. Vos instructions d'installation pourraient simplement indiquer aux utilisateurs de modifier un fichier directement. Dans ce cas, vous pouvez simplement demander aux utilisateurs de modifier directement un fichier de constantes.

La plupart des applications qui suivent cette voie la mettre en œuvre avec des détails explination

<?php 
/** 
* Global application configuration 
*/ 
class AWConfig { 

    /** 
    * true or false 
    * If the is set to true debug messages will be added to the application logs 
    */ 
    public $DEBUG_MODE = true; 
    /** 
    * Path to Station database 
    * ex (/homepages/26/3/htdocs/databases/stations.db) 
    */ 
    public $DB_STATION = '/homepages/26/3/htdocs/databases/stations.db'; 
    /** 
    * Path to logs database 
    * ex (/homepages/26/3/htdocs/databases/stations.db) 
    */ 
    public $DB_LOGS = '/homepages/26/d175338743/htdocs/weather/dev/metrics/beta2/databases/metriclogs.db'; 

    /**** DO NOT EDIT BELOW THIS LINE *****/ 
    public $LIST_STATION_LIMIT = 10; 
    public $MAX_COMPARE = 6; 
} 
?> 

Si vous souhaitez masquer ces détails de l'utilisateur qu'un script de configuration initiale serait le mieux qui demande à l'utilisateur pour plus de détails et écrire un fichier (config.php, config.ini, config.xml ou vers une base de données) les paramètres qu'ils ont choisis. Ensuite, un script différent à éditer dans le futur. Un bon exemple serait Joomla CMS.

Questions connexes