Aujourd’hui, je souhaitais vous parler de configuration.

Avant d’entrer dans le vif du sujet, je voudrais préciser que cet article est une reprise d’un billet que j’avais précédemment écrit. Malheureusement, avec ma perte de données, cet article a été perdu, ainsi que les commentaires qui y étaient attachés.
J’en profite pour m’excuser encore une fois de la perte de vos commentaires constructifs.

Chose dite, passons maintenant à ce qui vous intéresse.

La configuration ?

Dans pratiquement toutes les applications (je codais des logiciels Windows avant de faire du web) et les scripts que j’ai pu coder, il a fallu réaliser une configuration, plus ou moins complète selon le besoin.

Il peut s’agir d’identifiants de connexion à une base de données, au titre d’un site, d’une disposition de plusieurs widgets sur un layout, il existe une infinité de cas où il faut définir et modifier une configuration que l’on doit récupérer et parfois modifier.

Dans ce post, je vais essayer de faire le tour des solutions que j’ai pu mettre en place sur mes projets web. C’est parti !

Les constantes

Les constantes permettent de mettre en place une configuration rapidement et qui soit utilisable dans le scope global, c’est à dire accessible depuis n’importe où dans le script.
Voyons comment implémenter cela :

Cette procédure est très rapide à mettre en œuvre et est très lisible. De plus, votre IDE vous proposera à coup sûr l’auto-complétion. Enfin, les constantes faisant partie des bases de PHP, les conventions de nommage des constantes sont bien connues de tous.

En revanche, il n’est pas possible de réassigner une constante qui a déjà été définie, ni même d’y assigner un tableau. Oubliez donc la configuration modifiable dans le script ou complexe.

Constantes, attributs et méthodes de classe

Un second procédé, assez proche du premier évoqué, est d’utiliser des classes comme moyen de configuration. Cette technique peut prendre différents aspects qui restent toutefois relativement semblables.

En effet, vous pourrez au choix utiliser des constantes, attributs et/ou méthodes de classe pour stocker, récupérer et/ou éditer les informations de configuration.

Je vous propose ici un mix de toutes ces possibilités :

Pas grand chose à expliquer là dedans si ce n’est que les constantes ne peuvent être modifiées, et que les attributs publics ou privés sont à choisir selon votre besoin ou votre préférence.

L’avantage ici est qu’il est possible de modifier en cours d’exécution de script la configuration, mais aussi que les classes peuvent être autoloadés, et découpées pour ne pas avoir une seule grosse classe de paramétrage.

En revanche, cela peut vite devenir verbeux.

A noter que j’aurai pu utiliser des variables statiques afin de ne pas devoir créer d’instance de la classe.

L’include

Cette technique est sûrement la plus connue : Il s’agit d’inclure dans le script un fichier qui contient des variables afin de les exploiter. Il existe 2 approches :

Un tas de variables

Ici, il s’agit simplement de définir plusieurs variables qui pourront être utilisées directement dans le scope qui inclut le fichier :

Et l’appel :

Pour les environnements de développements les plus complets (Netbeans, Eclipse par exemple), l’auto-complétion fonctionne.
Cette solution est bien souvent choisie car elle permet d’extraire la config du cœur d’un site ou d’un CMS (de nombreux systèmes ont penché pour cette alternative) et qu’il est très simple de modifier à la volée un tel fichier de configuration.

Return array

La seconde façon, toujours avec un fichier config, est de retourner un tableau contenant les informations. Il suffit alors de faire un $config = include 'config.php'; :

Et le script :

Notez le $db = include ... sans quoi votre include ne sert à rien.

Ce procédé est plus pratique selon moi dans le sens où il est possible de passer un tableau à plusieurs dimensions, tout cela dans le but de structurer encore les paramètres.

Les formats alternatifs

Passons à la suite. Je vais à présent vous parler des formats tels que INI, JSON, XML ou YAML. Ce sont des formats de représentation de données, plus ou moins verbeux et lisibles, qui permettent de stocker des données selon un schéma structuré.

J’ai récemment parlé de JSON et sa mise en oeuvre, et le but ici n’est pas de faire une comparaison de tous les formats existants (il y en a des paquets).
Nous verrons ensemble comment parser et récupérer les données d’un fichier INI.

Le format INI

Pour la petite histoire, le format INI a été créé en 1985 par Microsoft pour Windows 1.0, qui l’utilisait pour stocker ses paramètres de configuration, à présent remplacés par la fameuse base de registre. Ouais, on s’en cogne.

La syntaxe

Les fichiers sont divisés en sections, qui contiennent les paramètres. Chaque section est encadrée de crochets [ ], et il n’est pas possible de créer de sous-sections.
Ce format autorise les commentaires, en plaçant un point-virgule ; en début de ligne.
Attention les vieux de la vieille : Avec PHP 7.0, les commentaires initiés avec un # en début de ligne ont été supprimés, seul le ; fonctionne.

Voici un exemple de fichier INI :

En PHP, pour parser un tel fichier, il existe une fonction native : parse_ini_file()
Celle-ci retourne les valeurs de configuration sous forme d’un tableau.

Exemple :

Le premier argument, le seul obligatoire, est le chemin du fichier ini à parser. Le second permet d’obtenir un tableau multidimensionnel avec les noms des sections.

Configuration dans une base de données

J’ai gardé le meilleur (ou le plus gros morceau) pour la fin. Il s’agit là de stocker vos configurations dans une base de données.

Quelle utilité ?

Contrairement aux méthodes exploitées jusqu’ ici, celle-ci requiert un peu plus de travail sur sa mise en place. En effet, il va falloir allouer (au moins) une table à la config dans la DB et créer un script qui nous permettra d’aller chercher, de modifier et d’enregistrer les paramètres en base.

Mais si on met en place tout cela, il va de soit que ce n’est généralement pas pour un petit site statique où la seule variable est le titre du site. Non, cette pratique est plus adaptée à de gros sites ou CMS.
Pour ma part, j’imagine aisément un CMS tel que WordPress sur lequel on pourrait installer des plugins, chacun d’eux ayant besoin d’une configuration à part entière.

Mise en place

Pour vous mâcher un peu le travail (et surtout éviter de perdre les quelques lecteurs ^^ ), j’ai écrit une petite classe que vous pourrez à votre guise reprendre et modifier si jamais vous le souhaitez.

Avant cela, préparons le travail. Nous allons créer dans une base de données une table qui sera dédiée à notre config. Cette table devra se nommer config. Dans celle-ci, 2 colonnes :

  • name : qui contiendra le nom de la config, VARCHAR, unique
  • value : c’est elle qui contiendra les valeurs des paramètres, sous forme sérialisée, de type TEXT

table config

Enfin, vous devrez avoir l’extension mysqli activée sur votre serveur.

Passons au code.

La classe

Je vous met le code de la classe en question :

L’utilisation de cette classe repose sur le fait qu’on doive fournir une instance de mysqli à la classe afin que celle-ci puisse effectuer les transactions avec la base de données. On peut alors utiliser la classe.

Rien de bien compliqué j’imagine, sinon n’hésitez pas à me le faire remarquer dans les commentaires.
Je mettrais d’ailleurs le code sur un Gist si je trouve le temps.

L’utilisation

Lorsqu’on instanciera un objet Config, il faudra fournir le nom de la configuration. Puis on pourra lui affecter et récupérer des paramètres, comme si on utilisait ses attributs. Une fois terminé, il suffit d’appeler la méthode save() pour envoyer le tout à la BDD.

C’est pas beau ça ? 😉

Inconvénient majeur

Vous vous en doutez, il y a un hic. Et oui, pour utiliser cette classe, il me faut une connexion à ma base, et donc des identifiants.
Ainsi, cette solution seule ne suffit pas, puisqu’il faut stocker quelque part la configuration (identifiants) de la connexion à ma DB, donc utiliser un fichier INI, ou un include etc.

J’en ai fini

C’est le mot de la fin. Parmi toutes ces méthodes, vous aurez bien vu qu’il n’y en a pas de meilleure, tout est question de goût mais aussi surtout de besoin. A vous maintenant de faire le bon choix.

N’hésitez pas à commenter si vous avez des remarques ou d’autres méthodes non présentées ici. Merci !