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 :

Rendre une application modulaire (ex Wordpress) [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Points : 7
    Points
    7
    Par défaut Rendre une application modulaire (ex Wordpress)
    Bonjour à tous,

    J'ai une petite question sur laquelle je me penche sérieusement depuis un bon moment.

    Comment réalisez-vous une application web modulaire en PHP ? Dans cette question je veux parler d'une modularité de fonctions et non d'objets (sinon un simple héritage aurait suffit).

    L'exemple concret sur lequel je me base est Wordpress. En effet, il dispose d'extensions qui permettent de modifier totalement le fonctionnement de celui-ci, j'aimerais faire de même avec les fonctionnalités de mon application.

    Voici les pistes que j'ai explorés :

    Piste 1 remplacement de fonctions

    Méthode : Utiliser la fonction function_exists() de PHP pour toutes les fonctions de l'application et inclure les fonctions des extensions avant les fonctions de l'application (cela aura pour but de remplacer les fonctions de l'application).
    Problèmes : Je trouve ça un peut "bourrin", pas très optimisé (les fonctions sont censés être exécutés et non testés), impossible d'avoir deux extensions qui manipulent les mêmes fonctions.

    Piste 2 poser des jalons dans l'application

    Méthode : Poster des include à des endroits stratégique du code (couplé à un glob("/exts/*.ext.php" par exemple pour inclure toutes les extensions données d'un répertoire à un endroit). Les fichiers inclus auront donc en portée les variables de l'application et pourront les modifier.

    Problèmes : Partager la portée des variables de l'application est dangereux et non normalisé (si on change le nom d'une variable de l'application il ne sera plus possible d'y accéder. Ensuite, comment gérer les accès concurrents des extensions ? (prévoir un ordre d'inclusion etc...)

    Piste : Peut être qu'il serait de bonne coutume d'utiliser des fonctions d'API programmés dans l'application ???

    Piste 3 callback des fonctions intégrés (qu'en pensez vous ?)

    Piste : Cette méthode je ne l'ai pas encore testé, l'idée serrait de mettre une fonction qui sera placée juste avant le return de chaque fonction de l'application afin de faire passer ça vers un tableau de nom de fonctions (remplis par les extensions qui souhaitent modifier le retour de la fonction de l'application) qui seraient appelé unes à unes par call_user_func().

    Voilà, la problématique est assez complexe ainsi que les solutions à envisager pour la résoudre. Si quelqu'un a une pierre à poser à ma réflexion je suis preneur !

    Bonne journée !

    Cordialement.

  2. #2
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Bonjour,

    Personnellement j'ai choisi le pattern SplSubject / SplObserver pour implémenter des évènements dans mon CMS et de ce fait permettre la modification du coeur de l'application. J'aime beaucoup, c'est très propre, fortement typé, performant, et très maintenable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    iJCore::instance()->events->onBeforeRenderFront->attach(new iJGoogleAnalytics_Renderer);
     
    class iJGoogleAnalytics_Renderer extends iJEventHandler {
        public function update(SplSubject $subject, &$arg = null){
           // etc...
        }
    }
    Utiliser function_exists pour remplacer entièrement une définition de fonction c'est vraiment pas terrible, je préfère encore le système de hooks, au moins on a pas à recoder à chaque fois ce que l'autre fonction faisait. Ce système ne peut pas fonctionner car si deux modules souhaites surcharger une fonction, le second module chargé devra également écrire le code du premier.

    Le système de hook se base en effet sur l'utilisation de call_user_func_array pour appeler chacun des modules et récupérer les valeurs de retours pour obtenir un état modifié.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Merci infiniment pour ces pistes, effectivement wordpress utilise apparemment un système de hook pour l'intégration de ses plugins.

    Je viens de regarder le pattern SplSubject avec SplObserver (que je ne connaissais pas) et j'avoue que je suis séduit par le système.
    Cependant je ne pense pas l'utiliser à cause d'une contrainte liée à la portée de mes variables (je n'utilise pas d'objet partout dans mon système).

    Je me tourne donc vers un système de hook, mais j'ai une question. Comment on récupère "les valeurs de retours pour obtenir un état modifié" ?
    - On utilise les variables passés par références avec call_user_func_array(); à notre hook pour modifier les éléments de la fonction du système ?
    Ou...
    - On élabore un système de traitement de retour de fonction avec des retours de tableaux pour chaque point d'appel de hook ?

    Le système de passage par référence est plus pratique à mettre en place non ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 13
    Points : 7
    Points
    7
    Par défaut
    Je me réponds à moi-même pour faire un lien vers un article que je viens de publier sur mon mon blog qui répond exactement à la problématique que j'ai présenté ci-dessus.

    Pour ceux qui sont dans le même cas, voici un tutoriel qui présente comment fonctionne un système de Hook en PHP.

    En espérant que ça pourra aider certaines personnes !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. rendre une application "furtive"
    Par kaderscream dans le forum C++Builder
    Réponses: 9
    Dernier message: 01/04/2007, 09h38
  2. Rendre une application dissociable de ms access
    Par densdic dans le forum Access
    Réponses: 3
    Dernier message: 26/10/2006, 21h08
  3. Comment rendre une application agréable !
    Par Pharma dans le forum Delphi
    Réponses: 19
    Dernier message: 21/09/2006, 22h29
  4. Comment faire une application modulaire
    Par JuJu° dans le forum C++Builder
    Réponses: 3
    Dernier message: 04/08/2006, 11h35

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