IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Interception de méthodes


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 178
    Par défaut Interception de méthodes
    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:

    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>
    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).

    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:


    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 ?');
    Ici, quand j'appelle foo, j'aimerais que l'opération de log ait lieu AVANT le echo ' // Hello there !';
    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

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 178
    Par défaut
    Pour résumer, comment feriez-vous pour intercepter des méthodes PHP en partant d'une liste de méthodes dans un fichier XML ?

    La principale idée (et sans doute la plus difficile à appliquer), c'est que le code métier ne doit ABSOLUMENT PAS être modifié.
    La logique d'interception ne doit avoir aucune incidence...

    Pour l'instant, je suis bloqué :

    • car je ne vois pas de moyens de faire hériter une classe d'une autre au runtime (sans paquet additionnel) ;
    • je ne vois pas de moyen transparent de prioriser l'appel de la méthode mère avant que celle-ci ne laisse la main à la méthode fille (l'appel client se fait évidemment dès le début sur la méthode fille... la méthode mère est juste "créée" pour l'interception)


    Même si vous pensez que ce problème, tel que présenté, est insoluble, n'hésitez pas à me montrer d'autres approches, peut-être plus judicieuses.

    Merci d'avance,
    Rolf

Discussions similaires

  1. [Security] Interception de méthodes
    Par kkort dans le forum Spring
    Réponses: 4
    Dernier message: 03/04/2009, 15h35
  2. Réponses: 1
    Dernier message: 06/03/2009, 10h27
  3. [Framework] [AOP] Intercepter une méthode d'une inner class
    Par Widiwi dans le forum Spring
    Réponses: 4
    Dernier message: 02/02/2009, 11h16
  4. [AspectJ] pointcut pour intercepter des méthodes
    Par jymmy dans le forum Autres
    Réponses: 2
    Dernier message: 24/07/2007, 14h12
  5. Réponses: 3
    Dernier message: 04/04/2007, 08h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo