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 😉

Catégories : DéveloppementPHP

13 commentaires

j0k · 11 mai 2009 à 23:01

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

Fabien · 11 mai 2009 à 23:37

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.

stephane · 12 mai 2009 à 14:01

et

/config/app.yml

Éric Rogé · 12 mai 2009 à 15:24

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.

Eric Lemoine · 12 mai 2009 à 16:58

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

tenshu · 12 mai 2009 à 17:45

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

Fabien · 12 mai 2009 à 17:57

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

Olivier Mansour · 13 mai 2009 à 20:50

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

Adrien M. · 7 juin 2009 à 22:46

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 !

Thomas · 21 septembre 2009 à 13:26

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 !

Xavier · 10 décembre 2009 à 12:10

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

Pierre · 4 janvier 2011 à 17:36

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?

samoud · 21 octobre 2011 à 01:49

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 *