Symfony : Utiliser un fichier de config personnalisé

Lorsque l’on développe un projet, on a (presque?) toujours un certain nombre de paramètres propres à ce dernier. Cela peut-être le nom du site internet, la clé d’accès à un WebService ou encore la taille des miniatures à générer. De façon générale, il s’agit de tous ces paramètres communs à la fois au frontend et au backend du projet.

Tout bon développeur qui se respecte, je ne laisserai pas ce genre de paramètre perdu dans la logique métier. Tout d’abord parce que ça n’a absolument rien à faire là et ensuite parce qu’il ne serait pas facile de modifier le paramètre plus tard. Une bonne pratique est donc de créer un fichier à part pour stocker ces paramètres…

Dans symfony, il y a un fichier de paramètres pour les applications (apps/monapp/config/app.yml) et un pour les modules (apps/monapp/modules/monmodule/config/module.yml) mais pour tout le projet il n’y aucun fichier pré-défini par défaut. Heureusement, symfony est un framework très flexible et l’on peut ainsi ajouter un nouveau fichier de config en quelques lignes seulement…

Pour les intéressés, voici la procédure :

  1. Créez un fichier nommé config_handlers.yml dans le dossier config
  2. Copiez dans le fichier précédemment créé le code ci-dessous :
    config/project.yml:
      class:		sfDefineEnvironmentConfigHandler
      param:
        prefix: project_
  3. Créez le fichier config/project.yml et ajoutez quelques paramètres. Par exemple :
    all:
      website:
        name: Mon site internet
  4. Il faut maintenant charger les paramètres pour chaque application du projet.
    • Modifiez le fichier config/ProjectConfiguration.class.php
    • Ajoutez une fonction loadProjectConfig :
      	protected function loadProjectConfig()
      	{
      		static $load = false;
      
      		if (!$load && $this instanceof sfApplicationConfiguration)
      		{
      			require $this->getConfigCache()->checkConfig('config/project.yml');
      			$load = true;
      		}
      	}
    • Chargez le fichier de config en ajoutant le code ci-dessous dans la méthode setup de la classe :
      			$this->loadProjectConfig();
  5. C’est fini !

Vous pouvez maintenant, dans les applications de votre projet, accéder aux paramètres définis dans project.yml en utilisant sfConfig::get('project_...').

Attention, si comme moi vous écrivez des tests automatisés pour vos projets, pour les tests unitaires, il faudra ajouter un ligne afin de charger le fichier de config personnalisé :

$configuration = ProjectConfiguration::getApplicationConfiguration('frontend', 'test', true);

Je vous conseille d’ailleurs d’écrire un bootstrap avec cette ligne plutôt que de la copier/coller dans chaque fichier de test ;)

13 réponses sur “Symfony : Utiliser un fichier de config personnalisé”

  1. Intéressant, mais pourquoi ne pas tout simplement utiliser le fichier de conf « global » /config/settings.yml et puis sfConfig::get(‘sf_…’) ?

  2. J’avoue que j’ai hésité à l’utiliser, ça m’aurait facilité la tâche en plus.

    Je l’ai finalement pas fait car j’ai l’impression que ce fichier sert plus à configurer les paramètres par défaut de symfony (comme activer un helper dans toutes les apps) plutôt qu’à stocker des paramètres persos.

  3. Heuu..

    C’est un faux problème, il y a bien un fichier de configuration qui existe au niveau du projet, c’est app.yml que tu dois créer toi-même dans ton répertoire « mySymfonyProject/config ».

    Par contre les variables définies sont du coup chargée en mémoire pour chaque requête http.

  4. Je usis presque sûr que c’est documenté ! J’utilisais moi aussi ce app.yml bien placé en tout cas, et pas par hasard :-)

    Merci pour l’astuce cependant. Je suis tombé sur ton blog par hasard, beaux articles, j’espère que ça va continuer !

  5. si vous souhaitez gérer cela encore plus finement, vous pouvez également ajouter des fichiers de configuration au sein de vos modules ($nom_de_votre_module/config/module.yml).
    Vous y accederez de cette façon : sfConfig::get(‘mod_’.$nom_de_votre_module.’_’.$nom_de_votre_variable).

  6. Ces solutions (le project.yml avec getApplicationConfiguration(), les config/app.yml) ne règlent cependant pas un problème : l’accès à une conf globale depuis une tache, sans la rattacher à une application. Si un réglage s’applique à tout le projet, dans le cas d’une tâche, ça ne me parait pas logique de devoir charger une conf d’application. Quelqu’un a une solution?

  7. Cette astuce sert par exemple si on a plusieurs plateformes et il nous des paramètres pour chaque plateforme par exemple un plateforme local, recette et Dev . Donc on créer un fichier de config dédié pour chaque plateforme

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

:D :) :o :eek: :( :lol: :wink: :arrow: :idea: :?: :!: :evil: :p