Eine PHP-Plugin-Architektur
Ich versuche über eine Möglichkeit nachzudenken, eine Plugin-Architektur für mein eigenes Framework zu erstellen. Ich habe zahlreiche Themen gelesen und poste hier und auf anderen Seiten. Und im Grunde bin ich zu der folgenden Lösung gekommen, die die einzige gute Option in PHP zu sein scheint (derzeit).
Die Idee ist, dass jede Klasse eine Art Beobachter wie eine Klasse erweitert. Eine Template-Klasse, BaseController usw. erweitert also immer eine Plugin-Klasse.
<code>class BaseController extends Plugin { public function __construct() { // Plugin check, notify all loaded plugins $this->checkForEarlyHooks(); // Init some standard stuff $this->view = new Template(); $this->baseLayout = 'layout.html'; $this->something = new Something(); // Plugin check, notify all loaded plugins $this->checkForLateHooks(); } } </code>
Grundsätzlich passiert hier also, dass beim Erweitern eines baseControllers durch einen indexController ein Plugin-Check durchgeführt wird. In diesem Fall für den Konstruktor. Dies kann praktisch sein, wenn Sie eine Art Login-Prüfung mit einem Plugin durchführen möchten, bevor eine Action-Methode aufgerufen wird.
Die Plugin-Klasse kann bestimmen, von welcher Klasse aus sie aufgerufen wird und nach welchen Funktionen in den geladenen Plugins gesucht werden muss.
Beachten Sie auch, dass die geladene Plugin-Liste zweimal überprüft wird. Eine, bevor etwas in den Konstruktor geladen wird (früh), und eine, wenn alle Variablen geladen werden (spät).
Ich kann der Funktion "checkForLateHooks ()" auch Variablen hinzufügen. Die Hook-Funktionen können also auch diese wie die Variable 'baseLayout' bearbeiten.
Eine Hook-Funktion würde folgendermaßen aussehen:
<code>public function hookConstruct ( &$baseLayout ) { $baseLayout = 'login.html'; } </code>
Grundsätzlich frage ich mich nun, ob dieser Ansatz gut ist. Ich weiß, dass es wahrscheinlich auch viele andere Möglichkeiten gibt. Aber hauptsächlich möchte ich später nicht auf Designprobleme stoßen. Es scheint jetzt eine gute Idee zu sein, aber man weiß nie, wie es später weitergeht ...
Wenn ich mich richtig erinnere (aus all den Posts, die ich gelesen habe), ist dies so, wie es WordPress tut (und einige andere Frameworks).