Dans 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 ;)
Leave a Reply