Manipuler les paramètres de configuration dans symfony

Posted: 9th décembre 2009 by Mohammed CHERIFI in Symfony
Tags: , , ,

SymfonyDans symfony, tous les paramètres de configuration sont stockés dans des fichiers .yml (settings.yml, app.yml, module.yml, logging.yml, and i18n.yml), ceux-ci sont accessibles via une classe spéciale sfConfig, certains sont automatiquement utilisés dans le framework!
Lors du développement d’une application/module symfony, on peut définir des paramètres de configuration spécifiques à notre application, l’objectif de ce tutoriel est d’expliquer comment récupérer/modifier les valeurs de ces variables !

Exemple de fichier de configuration

On considère que le nom de l’application est frontend, et le fichier de configuration de l’application /apps/frontend/config/app.yml

all:
  categoryPages:
    maxPages: 10
  productPages:
    maxPages: 5
  generalMax: 15

Récupérer une valeur

echo sfConfig::get('app_categoryPages_maxPages'); // => 10
echo sfConfig::get('app_productPages_maxPages'); // => 5
echo sfConfig::get('app_generalMax'); // => 15

Symfony utilise le format YAML pour tous ses fichiers de configuration grâce à sa syntaxe simple et efficace, les données sont représentées par une combinaison de listes, tableaux (de hachage) et données scalaires.

L’accès à une variable se fait via la méthode get() de la classe sfConfig, il suffit d’indiquer le chemin permettant d’accéder à la variable, on respectant ces petites règles :

  • Le premier paramètre corrépond au nom d’un fichier de configuration sans le .yml (settings, app, module, logging, i18n..), ces fichiers se trouve dans le répertoire /apps/NOMAPPLICATION/config/
  • Il ne faut pas mentionner le « all » ou « default » dans la méthode sfConfig::get()
  • Séparez les paramètres par des « _ » en respectant arborescence selon le fichier .yml
  • Il est préférable de ne pas utilisé des « _ » dans le nom des paramètres pour éviter un éventuel conflit

Modifier la valeur d’un paramètre « on the fly »

La méthode set de la classe sfConfig permet la modification de la valeur d’un paramètre de configuration, cette modificationn’est pas permanente, et n’affecte pas le fichier de configuration concerné:
Exemple :

sfConfig::set('sf_timeout', 86400);

Modifier un paramètre dans le fichier yml

Par défaut, symfony ne gère pas l’écriture dans les fichiers de configuration, il n’y a donc pas de méthode save() dans la classe sfConfig, néanmoins il fourni d’autre méthodes permettant la réalisation de cette tache:

Exemple :

Modifier app_categoryPages_maxPages dans /apps/frontend/config/app.yml

all:
  categoryPages:
    maxPages: 10
  productPages:
    maxPages: 5
  generalMax: 15

Dans actions.class.php

$app_config_file = sfConfig::get('sf_app_config_dir')."/app.yml";
$config_values = sfYaml::load($app_config_file);
$config_values['all']['categoryPages']['imap_maxPages'] = 20; // à titre d'exemple
$content = sfYaml::dump($config_values);
file_put_contents($app_config_file, $content);

sfYaml::load() retourne un tableau associatif contenant les paramètres de configuration du fichier passé en paramètre, sfYaml::dump() permet de génerer le code YAML à partir d’un tableau sur-lequel on a effectué nos modifications. sans oublier que le chemin du fichier en question doit être inscriptible (+w) pour permettre l’écriture des nouveaux paramètres

Pourquoi symfony ne gère pas l’écriture dans les fichiers YML?

Je vous rassure, ce n’est pas un oubli ;) au début ça m’a fait un peu bizarre mais voilà pourquoi :

  • Dans symfony, les paramètres de configuration ne découlent pas d’un seul fichier mais de plusieurs fichiers yml (en cascade), on saura pas lequel des fichiers modifier
  • Sur un serveur de développement, tous les fichiers YAML sont version-nés, si ceux-ci sont édités, il y aura des conflits au moment de mettre à jour par le biais du SVN/GIT
  • Les fichiers YAML ne sont pas destinés à être modifiés dynamiquement surtout dans un projets collaboratif (sauf cas particulier)

Un grand merci à Charles, Jérôme et François qui m’ont éclairci les idées à ce sujet =)

Voilà, ce billet touche à sa fin, à très bientôt ;)

Partager cet article:
  • Twitter
  • Facebook
  • Google Bookmarks
  • del.icio.us
  • Netvibes
  • viadeo FR
  • Digg
  • LinkedIn
  • Slashdot
  • Sphinn
  • Mixx
  • Blogplay
  • Identi.ca
  • Print
  • Ping.fm
  • email
  • Posterous
  • Reddit
  • Yahoo! Buzz
  • PDF
  • RSS
  • Diigo
  • Fark
  • Blogosphere News
  • blogtercimlap

  1. dioumassi med dit :

    Bonjour

    En recherchant comment configurer i18n.yml sur le net je suis tombé sur votre blog. J’ai des questions à vous poser
    _Quelle est le contenu du fichier i18n.yml?
    _Comment rendre obligatoire un ou les champs obligatoires?
    _Comment initialiser les valeurs des champs?
    Pour le moment c’est tout, je vous remercie d’avance