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 :
- Créez un fichier nommé config_handlers.yml dans le dossier config
- Copiez dans le fichier précédemment créé le code ci-dessous :
config/project.yml: class: sfDefineEnvironmentConfigHandler param: prefix: project_ - Créez le fichier config/project.yml et ajoutez quelques paramètres. Par exemple :
all: website: name: Mon site internet - 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();
- 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
Intéressant, mais pourquoi ne pas tout simplement utiliser le fichier de conf « global » /config/settings.yml et puis sfConfig::get(‘sf_…’) ?
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.
et
/config/app.yml
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.
Autre possibilité : faire un fichier /config/app.yml
Ce sera partagé par toutes les applis
Ce qui est normal Eric, comme tout les constantes =)
http://fr3.php.net/constants
Je n’avais pas pensé au fichier config/app.yml
Merci de me l’avoir signalé
/config/app.yml marche en effet. Et ce n’est pas documenté à ma connaissance
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 !
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 !
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).