Bonjour tout le monde,
je développe actuellement un système de logs pour des applis PHP. Un fichier de configuration XML définit les méthodes à intercepter. Même si la structure est peut-être amenée à évoluer, pour l'instant ça ressemble à ça:
Le parser du fichier de configuration fonctionne très bien, il se charge de valider les données et de convertir le fichier dans un format plus exploitable (un tableau multidimensionnel pour être exact).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 <interceptor> <methods class="__CLASS_DIR__B.php"> <method name="getLevel"> <log-level>INFO</log-level> <log-message>Bonjour !</log-message> </method> </methods> </interceptor>
Ce qu'il reste à faire, c'est que chaque méthode définie dans le fichier ci-dessus puisse être interceptée afin de réaliser l'opération de log en elle-même avant de continuer. Par exemple:
Ici, quand j'appelle foo, j'aimerais que l'opération de log ait lieu AVANT le echo ' // Hello there !';
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 class B { public function foo($bar) { echo ' // Hello there !'; } } $b = new B(); $b->foo('hmmm ?');
J'ai bien quelques idées:
- générer une classe par le parser XML, qui serait composée de références des classes définies dans le fichier XML, et j'aurais un gros switch dans une fonction __call qui se chargerait de relayer l'appel à la bonne référence une fois l'opération de log terminée.
- de la même manière, la classe générée deviendrait la classe mère des classes définies dans le XML, et il faudrait faire hériter ces dernières dynamiquement (pas possible sans modifier les classes elles-mêmes ou sans installer le module PECL runkit a priori, donc pas satisfaisant).
J'aimerais éviter dans la mesure du possible d'avoir recours à une blbiothèque tierce ou à avoir à modifier les classes définies dans le XML. Le processus d'interception ne devrait idéalement avoir aucune incidence sur l'applcation qui l'utilise.
Encore une fois, le fichier XML peut être modifié, ça peut éventuellement simplifier le problème. De même, j'envisage peut-être la situation d'une mauvaise manière.
Si vous avez des remarques, des idées, des questions, n'hésitez pas !
Merci d'avance,
Rolf
Partager