La meilleure façon de permettre à des plugins pour une application en PHP
Je suis en train de créer une nouvelle application web en PHP et cette fois, je veux créer quelque chose que les gens peuvent s'étendre à l'aide d'un plugin d'interface.
Comment fait-on sur l'écriture de "crochets" dans leur code, de sorte que les plugins peuvent s'attacher à des événements spécifiques?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser un modèle Observateur. Une simple manière fonctionnelle pour ce faire:
De sortie:
Notes:
Pour cet exemple de code source, vous devez déclarer tous vos plugins avant le code source que vous voulez être extensible. J'ai inclus un exemple de la façon de traiter seul ou plusieurs valeurs d'être passé au plugin. La partie la plus difficile de ce d'écrire la documentation disponible qui répertorie les arguments se passait à chaque crochet.
Ce n'est qu'un moyen de réaliser un système de plugin en PHP. Il existe de meilleures alternatives, je vous suggère de vérifier les WordPress Documentation pour plus d'informations.
Désolé, il semble que les caractères de soulignement sont remplacés par les entités HTML en Markdown? Je peux re-poster ce code lorsque ce bug est corrigé.
Edit: Nevermind, il n'apparaît que lorsque vous modifiez
Mediator Pattern
. Vrai observateurs sont purement de notification, il n'y a pas de transmission de message ou de la notification conditionnelle (ni est-il un centre de gestion pour contrôler les notifications). Il ne fait pas la réponse mal, mais il convient de noter à arrêter les personnes appelant les choses par le mauvais nom...Donc, disons que vous ne voulez pas le pattern observer, car il vous demande de changer vos méthodes de la classe pour gérer la tâche de l'écoute, et que vous voulez quelque chose de générique. Et disons que vous ne souhaitez pas utiliser
extends
héritage, car vous avez peut-être déjà hériter de votre classe à partir d'une autre classe. Ne serait-il pas génial d'avoir un générique façon de faire toute la classe enfichables sans trop d'effort? Voici comment:Dans la Partie 1, c'est ce que vous pouvez inclure dans un
require_once()
appel en haut de votre script PHP. Il charge les classes pour faire quelque chose enfichable.Dans la Partie 2, où nous en charge une classe. Remarque je n'avais pas à faire quelque chose de spécial à la classe, ce qui est significativement différente de celle du modèle Observateur.
Dans la Partie 3, c'est là que nous allons passer notre classe autour de en étant "pluggable" (qui est, prend en charge les plugins qui permettent de remplacer les méthodes de la classe et de propriétés). Ainsi, par exemple, si vous avez une application web, vous pourriez avoir un plugin de registre, et vous pourriez activer les plugins ici. Remarquez aussi la
Dog_bark_beforeEvent()
fonction. Si j'ai mis$mixed = 'BLOCK_EVENT'
avant l'instruction de retour, il va bloquer le chien d'aboyer et serait également bloquer le Dog_bark_afterEvent parce qu'il n'y aurait pas de cas.Dans la Partie 4, qui est le fonctionnement normal de code, mais notez que ce que vous pourriez penser irait ne fonctionne pas du tout comme ça. Par exemple, le chien n'a pas l'annoncer, c'est le nom que "Fido", mais "Coco". Le chien n'a pas dit "miaou", mais "Woof'. Et lorsque vous voulez regarder le nom du chien par la suite, vous trouvez qu'il est "Différent" au lieu de "Coco". Tous ces substitutions ont été fournis dans la Partie 3.
Alors, comment cela fonctionne? Eh bien, nous allons exclure
eval()
(dont tout le monde dit qui est "mal") et de la règle qu'il n'est pas un modèle Observateur. Donc, la façon dont il fonctionne, c'est le sournois classe vide appelé Enfichable, qui ne contient pas les méthodes et les propriétés utilisées par la classe Chien. Ainsi, dès que cela se produit, les méthodes magiques vont s'engager pour nous. C'est pourquoi, dans les parties 3 et 4, nous avons jouer avec les objets dérivés de la Enfichable de la classe, pas le Chien de la classe elle-même. Au lieu de cela, nous laissons la classe de Plugin ne le "toucher" sur le Chien objet pour nous. (Si c'est une sorte de modèle de conception, je ne sais pas-s'il vous plaît laissez-moi savoir.)La crochet et auditeur méthode est la plus couramment utilisée, mais il y a d'autres choses que vous pouvez faire. Selon la taille de votre application, et qui vos permettra de voir le code (est-ce que ça va être un FOSS script, ou quelque chose dans la maison) va influencer fortement la façon dont vous voulez autoriser les plug-ins.
kdeloach a un bel exemple, mais sa mise en œuvre et de la fonction de raccordement est un peu dangereux. Je voudrais vous demander de donner plus d'informations de la nature de php app votre écriture, Et la façon dont vous voyez les plugins d'adaptation.
+1 à kdeloach de moi.
Ici est une approche que j'ai utilisée, c'est une tentative de copie de Qt signaux/slots mécanisme, une sorte de pattern observer.
Les objets peuvent émettre des signaux.
Chaque signal a un ID dans le système - il est composé par l'expéditeur id + nom de l'objet
Chaque signal peut être appliqué à des récepteurs, ce qui est simplement un "callable"
Vous utilisez un bus de la classe pour transmettre les signaux à toute personne intéressée de recevoir
Lorsque quelque chose arrive, vous "envoyer" un signal.
Ci-dessous est et exemple de mise en œuvre
Je crois que le plus simple serait de suivre Jeff propres conseils et un coup d'oeil dans le code existant. Essayez de regarder WordPress, Drupal, Joomla et d'autres bien connus en PHP CMS pour voir comment leur API crochets regarder et se sentir. De cette façon, vous pouvez même obtenir des idées que vous pourriez avoir pas pensé auparavant pour rendre les choses un peu plus rubust.
Plus directement la réponse serait d'écrire des fichiers généraux qu'ils seraient "include_once" dans leur dossier de fournir la facilité d'utilisation, ils auraient besoin. Ce serait divisé en catégories et ne sont PAS fournis dans un MASSIF "hooks.php" fichier. Attention tout de même, car il arrive que les fichiers qu'ils comprennent finissent par avoir plus et plusieurs dépendances et la fonctionnalité améliore. Essayez de garder l'API dépendances faible. I. E moins de fichiers pour eux d'inclure.
Il y a une jolie projet appelé Épinoche par Matt Zandstra à Yahoo qui gère une grande partie du travail pour la manipulation des plugins en PHP.
Il veille au respect de l'interface d'une classe de plugin, prend en charge une interface de ligne de commande et n'est pas trop dur de se lever et courir, surtout si vous lisez l'histoire de la couverture de ce sujet dans le PHP architecte magazine.
Un bon conseil est de regarder comment les autres projets de l'avoir fait. Beaucoup l'appellent pour avoir des plugins installés et leur "nom", enregistré pour les services (tels que wordpress ne) si vous avez des "points" dans votre code lorsque vous appelez une fonction qui identifie les écouteurs enregistrés et les exécute. Un standard de conception OO formulation est la Modèle Observateur, ce qui serait une bonne option à mettre en œuvre dans un cadre vraiment orienté objet PHP système.
La Zend Framework fait appel à de nombreuses méthodes d'accrochage, et est très bien conçu. Que serait un bon système à regarder.
Je suis surpris de voir que la plupart des réponses ici semblent être orientés sur les greffons qui sont locales à l'application web, c'est à dire, les plugins qui s'exécutent sur le serveur web local.
Ce sujet si vous vouliez que les plugins pour fonctionner sur un autre - serveur - distant? La meilleure façon de le faire serait de fournir un formulaire qui vous permet de définir les différentes Url qui sera appelé lorsque certains événements se produisent dans votre application.
Différents événements allaient envoyer des informations différentes en fonction de l'événement qui vient de se produire.
Cette façon, vous n', il suffit de faire une boucle appel à l'URL qui vous a été fourni à votre demande (par exemple via https) où des serveurs distants peuvent effectuer des tâches basées sur l'information qui a été envoyé par votre application.
Cela offre deux avantages: