11
mai
2009
11

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 ;)

Vous avez apprécié ce billet ?
Abonnez-vous au flux RSS pour être informé des nouveaux billets.
11 commentaires :
  1. j0k 11 mai, 2009

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

  2. Fabien 11 mai, 2009

    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. stephane 12 mai, 2009

    et

    /config/app.yml

  4. Éric Rogé 12 mai, 2009

    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.

  5. Eric Lemoine 12 mai, 2009

    Autre possibilité : faire un fichier /config/app.yml
    Ce sera partagé par toutes les applis :)

  6. tenshu 12 mai, 2009

    Ce qui est normal Eric, comme tout les constantes =)
    http://fr3.php.net/constants

  7. Fabien 12 mai, 2009

    Je n’avais pas pensé au fichier config/app.yml
    Merci de me l’avoir signalé :)

  8. Olivier Mansour 13 mai, 2009

    /config/app.yml marche en effet. Et ce n’est pas documenté à ma connaissance :-(

  9. Adrien M. 7 juin, 2009

    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 !

  10. Thomas 21 sept, 2009

    Merci pour l’astuce :)
    Ca me sert pour avoir un fichier local.yml qui n’est pas versionné dans le cas de configuration différentes entre recette/production !

  11. Xavier 10 déc, 2009

    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).

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