Wie funktioniert Drupal? [geschlossen]

151

Könnte jemand einen architektonischen Überblick über den Drupal 7-Steuerungsfluss geben? Vielleicht im Sinne eines Flussdiagramms darüber, wie eine Seite generiert wird. Welche zusätzlichen Ressourcen würden Sie zur Beratung in Bezug auf die Funktionsweise von Drupal vorschlagen?

Domoaringatoo
quelle
1
Frage? Warum hast du es dann nicht selbst gefragt :-)
liori
Ich glaube nicht, dass es damals einen Stapelüberlauf gab. :)
Jeremy French
2
Die Drupal-Community ist immer auf der Suche nach Mitarbeitern, die bei der Dokumentation helfen. Warum nicht helfen, wenn die Dokumentation ungeschickt oder die Tutorials lahm sind? :)
Rimian
4
Dokumentation erfordert Verständnis .. was Dokumentation oder viel Erfahrung erfordert
Damon

Antworten:

160

Drupal kann an dieser Front verwirrend sein, teilweise weil es einen relativ tiefen Funktionsstapel hat. Obwohl es sich um prozedurales PHP handelt, ist es in seiner Architektur rein ereignis- / listenergesteuert, und es gibt keinen einfachen "Fluss" im PHP-Hauptskript, den Sie sich ansehen können. Ich habe kürzlich eine Präsentation zu diesem Thema gehalten , und die Folien werden auf Slideshare veröffentlicht, aber eine kurze Zusammenfassung auf hoher Ebene kann hilfreich sein.

  • Die index.php-Datei von Drupal fungiert als Frontside-Controller. Alle Seiten werden durch sie geleitet, und die vom Benutzer angeforderte "tatsächliche" URL / der "tatsächliche" Pfad wird als Parameter an index.php übergeben.
  • Das Pfad-Routersystem (MenuAPI) von Drupal wird verwendet, um den angeforderten Pfad einem bestimmten Plugin-Modul zuzuordnen. Dieses Plugin-Modul ist für die Erstellung des "primären Inhalts" der Seite verantwortlich.
  • Sobald der primäre Seiteninhalt erstellt ist, ruft index.php das Thema ('Seite', $ Inhalt) auf, das den Inhalt an das Theming / Skinning-System von Drupal weitergibt. Dort ist es in Seitenleisten / Header / Widgets / etc eingewickelt.
  • Die gerenderte Seite wird dann an Apache zurückgegeben und an den Browser des Benutzers zurückgesendet.

Während dieses gesamten Prozesses lösen Drupal- und Plugin-Module von Drittanbietern Ereignisse aus und warten darauf, dass sie reagieren. Drupal nennt dies das "Hook" -System und es wird unter Verwendung von Funktionsbenennungskonventionen implementiert. Das 'Blog'-Modul kann beispielsweise' Benutzer 'abfangen, indem es eine Funktion namens blog_user () implementiert. Im Drupal-Sprachgebrauch heißt das hook_user () .

Es ist etwas klobig, aber aufgrund einer PHP-Eigenart (es enthält eine interne Hashtabelle aller geladenen Funktionen) kann Drupal schnell nach Listenern suchen, indem es einfach eine Liste der installierten Plugins durchläuft. Für jedes Plugin kann es function_exists () für das entsprechend benannte Muster aufrufen und die Funktion aufrufen, falls vorhanden. ("Ich löse das 'Login'-Ereignis aus. Existiert die Funktion' mymodule_login '? Ich werde sie aufrufen. Existiert' yourmodule_login '? Nein? Wie wäre es mit' nextmodule_login '?" Usw.) Wieder ein Hauch klobig, aber es funktioniert ziemlich gut.

Alles , was in Drupal passiert, passiert, weil eines dieser Ereignisse ausgelöst wird. Die MenuAPI weiß nur, welche URLs / Pfade von verschiedenen Plugin-Modulen verarbeitet werden, da sie das 'menu'-Ereignis (hook_menu) auslöst und alle Metadaten-Plugin-Module sammelt, mit denen sie antworten. ("Ich kümmere mich um die URL 'news / Recent', und hier ist die Funktion, die aufgerufen wird, wenn diese Seite erstellt werden muss ...") Inhalte werden nur gespeichert, weil Drupals FormAPI für das Erstellen einer Seite verantwortlich ist und ausgelöst wird Das Ereignis "Ein Formular wurde gesendet", auf das ein Modul antworten kann. Die stündliche Wartung erfolgt, weil hook_cron () ausgelöst wird und für jedes Modul mit mymodulenname_cron () als Funktionsname die Funktion aufgerufen wird.

Alles andere sind letztendlich nur Details - wichtige Details, aber Variationen dieses Themas. index.php ist der Controller, das Menüsystem bestimmt, was die "aktuelle Seite" ist, und viele Ereignisse werden beim Erstellen dieser Seite ausgelöst. Plugin-Module können sich an diese Ereignisse anschließen und den Workflow ändern / zusätzliche Informationen bereitstellen / etc. Dies ist auch ein Grund dafür, dass sich so viele Drupal-Ressourcen auf die Erstellung von Modulen konzentrieren. Ohne Module macht Drupal eigentlich nichts anderes als zu sagen: „Jemand hat nach einer Seite gefragt! Existiert es? Nein? OK, ich werde einen 404 servieren. '

Eaton
quelle
1
FWIW, es ist ein bisschen anders in D7 (Thema ('Seite') ist weg und die Symbole werden jetzt in der Code-Registrierung zwischengespeichert), aber der Gesamtprozess bleibt der gleiche.
FGM
2
Tolle Erklärung Eaton, danke, dass du hier rumhängst. Meine Frage an Sie lautet: Wie können Sie all dies debuggen, außer var_dump in jedes Modul einzufügen, um herauszufinden, was passiert ist?
Brian G
3
Gute Frage. Es hängt davon ab, was Sie debuggen. Die Installation des Entwicklungsmoduls kann hilfreich sein, indem Sie einige nützliche Tools bereitstellen. Der Schritt besteht (in den meisten Fällen) darin, zu ermitteln, welches Modul für die Erstellung einer bestimmten Seite verantwortlich ist. hook_menu () ordnet URLs / Pfade Modulen zu, damit dies helfen kann. Identifizieren Sie dann, was der Menü-Rückruf bewirkt - rufen Sie drupal_get_form () auf, um ein Formular oder ein Thema ('some_custom_thing') zum Erstellen von HTML usw. zu erstellen. Achten Sie auf die Verwendung von Funktionen wie drupal_alter () oder module_invoke_all (), die Ereignisse für andere auslösen Module auch ...
Eaton
Ich fand das super hilfreich. Wissen Sie, wie sich Drupal 7 unterscheidet?
Hortitude
D7 Update: (siehe auch) drupal.org/node/350780
dreftymac
63

Drupal Page Serving Mechanism

Um zu verstehen, wie Drupal funktioniert, müssen Sie den Mechanismus zur Seitenbereitstellung von Drupal verstehen.

Kurz gesagt, alle Aufrufe / URLs / Anforderungen werden von index.php bedient, das Drupal lädt, indem es verschiedene Include-Dateien / Module einschließt und dann die entsprechende im Modul definierte Funktion aufruft, um die Anforderung / URL zu bedienen.

Hier ist der Auszug aus dem Buch Pro Drupal Development, in dem der Bootstrap-Prozess von Drupal erläutert wird:

Der Bootstrap-Prozess

Drupal bootet sich bei jeder Anforderung selbst, indem es eine Reihe von Bootstrap-Phasen durchläuft. Diese Phasen sind in bootstrap.inc definiert und verfahren wie in den folgenden Abschnitten beschrieben.

Konfiguration initialisieren

In dieser Phase wird das interne Konfigurationsarray von Drupal gefüllt und die Basis-URL ($ base_url) der Site erstellt. Die Datei settings.php wird über include_once () analysiert, und alle dort festgelegten Variablen- oder Zeichenfolgenüberschreibungen werden angewendet. Weitere Informationen finden Sie in den Abschnitten "Variable Overrides" und "String Overrides" der Dateisites / all / default / default.settings.php.

Früher Seiten-Cache

In Situationen, die ein hohes Maß an Skalierbarkeit erfordern, muss möglicherweise ein Caching-System aufgerufen werden, bevor überhaupt eine Datenbankverbindung versucht wird. In der frühen Seiten-Cache-Phase können Sie (mit include ()) eine PHP-Datei einschließen, die eine Funktion namens page_cache_ fastpath () enthält, die Inhalte übernimmt und an den Browser zurückgibt. Der frühe Seitencache wird aktiviert, indem die Variable page_cache_fastpath auf TRUE gesetzt wird, und die einzuschließende Datei wird definiert, indem die Variable cache_inc auf den Pfad der Datei gesetzt wird. Ein Beispiel finden Sie im Kapitel zum Zwischenspeichern.

Datenbank initialisieren

Während der Datenbankphase wird der Datenbanktyp bestimmt und eine erste Verbindung hergestellt, die für Datenbankabfragen verwendet wird.

Hostname / IP-basierte Zugriffssteuerung

Drupal ermöglicht das Verbot von Hosts pro Hostname / IP-Adresse. In der Zugriffskontrollphase wird schnell überprüft, ob die Anforderung von einem gesperrten Host stammt. In diesem Fall wird der Zugriff verweigert.

Sitzungsbehandlung initialisieren

Drupal nutzt die in PHP integrierte Sitzungsbehandlung, überschreibt jedoch einige der Handler mit eigenen, um die datenbankgestützte Sitzungsbehandlung zu implementieren. Sitzungen werden in der Sitzungsphase initialisiert oder wiederhergestellt. Hier wird auch das globale $ user-Objekt initialisiert, das den aktuellen Benutzer darstellt. Aus Effizienzgründen sind jedoch nicht alle Eigenschaften verfügbar (sie werden bei Bedarf durch einen expliziten Aufruf der Funktion user_load () hinzugefügt).

Late Page Cache

In der späten Seiten-Cache-Phase lädt Drupal genügend unterstützenden Code, um zu bestimmen, ob eine Seite aus dem Seiten-Cache bereitgestellt werden soll oder nicht. Dies umfasst das Zusammenführen von Einstellungen aus der Datenbank in das Array, das während der Initialisierungskonfigurationsphase erstellt wurde, und das Laden oder Parsen von Modulcode. Wenn die Sitzung angibt, dass die Anforderung von einem anonymen Benutzer ausgegeben wurde und das Seiten-Caching aktiviert ist, wird die Seite aus dem Cache zurückgegeben und die Ausführung gestoppt.

Sprachbestimmung

In der Phase der Sprachermittlung wird die mehrsprachige Unterstützung von Drupal initialisiert und anhand der Site- und Benutzereinstellungen entschieden, welche Sprache für die aktuelle Seite verwendet wird. Drupal unterstützt verschiedene Alternativen zur Bestimmung der Sprachunterstützung, z. B. Pfadpräfix und Sprachaushandlung auf Domänenebene.

Pfad

In der Pfadphase wird Code geladen, der Pfade und Pfadaliasing verarbeitet. In dieser Phase können von Menschen lesbare URLs aufgelöst werden, und das interne Zwischenspeichern und Nachschlagen von Drupal-Pfaden wird durchgeführt.

Voll

Diese Phase schließt den Bootstrap-Prozess ab, indem eine Bibliothek mit allgemeinen Funktionen, Themenunterstützung und Unterstützung für Rückrufzuordnung, Dateiverwaltung, Unicode, PHP-Image-Toolkits, Formularerstellung und -verarbeitung, E-Mail-Verarbeitung, automatisch sortierbare Tabellen und Ergebnismengen-Paging geladen wird. Der benutzerdefinierte Fehlerhandler von Drupal ist festgelegt und alle aktivierten Module werden geladen. Schließlich löst Drupal den Init-Hook aus, sodass Module die Möglichkeit haben, benachrichtigt zu werden, bevor die offizielle Verarbeitung der Anforderung beginnt.

Sobald Drupal das Bootstrapping abgeschlossen hat, sind alle Komponenten des Frameworks verfügbar. Es ist Zeit, die Anfrage des Browsers an die PHP-Funktion weiterzuleiten, die sie bearbeitet. Die Zuordnung zwischen URLs und Funktionen, die sie verarbeiten, erfolgt mithilfe einer Rückrufregistrierung, die sowohl die URL-Zuordnung als auch die Zugriffssteuerung übernimmt. Module registrieren ihre Rückrufe über den Menü-Hook (weitere Informationen finden Sie in Kapitel 4).

Wenn Drupal festgestellt hat, dass ein Rückruf vorhanden ist, dem die URL der Browseranforderung erfolgreich zugeordnet wurde, und der Benutzer die Berechtigung hat, auf diesen Rückruf zuzugreifen, wird die Steuerung an die Rückruffunktion übergeben.

Anfrage bearbeiten

Die Rückruffunktion erledigt alle erforderlichen Arbeiten, um die zur Erfüllung der Anforderung erforderlichen Daten zu verarbeiten und zu sammeln. Wenn beispielsweise eine Anforderung für Inhalte wie http://example.com/q = node / 3 empfangen wird, wird die URL der Funktion node_page_view () in node.module zugeordnet. Durch die weitere Verarbeitung werden die Daten für diesen Knoten aus der Datenbank abgerufen und in eine Datenstruktur eingefügt. Dann ist es Zeit für Themen.

Theming der Daten

Beim Theming werden die Daten, die abgerufen, bearbeitet oder erstellt wurden, in HTML (oder XML oder ein anderes Ausgabeformat) umgewandelt. Drupal verwendet das vom Administrator ausgewählte Thema, um der Webseite das richtige Erscheinungsbild zu verleihen. Die resultierende Ausgabe wird dann an den Webbrowser (oder einen anderen HTTP-Client) gesendet.

amitgoyal
quelle
20

Die Antwort von Eaton bietet einen guten Überblick. (Ich bin neu hier, also kann ich ihn nicht modifizieren, daher der Kommentar.)

Der brutale "Aha" -Moment für mich war die Erkenntnis, dass alles durch index.php und dann durch den Wasserfall von Modulen passiert (Kern zuerst, dann nach Site). Um die Kernfunktionalität zu erweitern, schreiben Sie sie nicht neu. Kopieren Sie stattdessen das Modul in / sites / all / modules / oder / sites / [Ihre Site] / modules und erweitern Sie DAS oder erstellen Sie an diesen Stellen ein neues Modul. Gleiches gilt für Themen. Modulverzeichnisse können auch Anzeigecode in Form von tpl, css usw. enthalten.

Wenn Sie es gewohnt sind, MVC-Frameworks wie Rails, Django usw. strenger zu gestalten, wird dies alles etwas verwirrend. Module können eine Menge Anzeigecode einmischen, und wenn Sie sich die Module oder Vorlagen anderer ansehen, werden Sie schließlich rückwärts durch den Stapel laufen. Das ist die Schönheit / der Schmerz der Arbeit in PHP.

Ironischerweise könnte "nur eine App erstellen" der schlechteste Weg sein, dies zu lernen. Drupal macht so viel aus dem Kasten heraus, dass es einfach dunkel ist, bis Sie den Kontrollfluss herausfinden. In einer tpl-Datei gibt es nichts, was Ihnen sagt, woher beispielsweise eine Funktion mit einem unterhaltsamen Namen wie l () kommt.

Axoplasma
quelle
7

Es hängt davon ab, wie tief Sie nach einem Verständnis suchen. Wenn Sie über gute PHP-Kenntnisse verfügen, würde ich empfehlen, den Code selbst zu lesen, beginnend mit index.php, und dann mit Includes / bootstrap.inc und einigen anderen Skripten in diesem Verzeichnis fortzufahren.

Der Schlüssel enthält Dateien:

  • menu.inc ist sehr wichtig, um zu verstehen, wie das Gesamtsystem funktioniert, da es einen Großteil der impliziten Zuordnung von URLs zu Inhalten übernimmt.
  • common.inc verfügt über die meisten ansonsten mysteriösen Funktionen, die die Grundlage der API bilden.
  • module.inc verarbeitet die von Eaton erwähnten Hook-Aufrufe
  • form.inc befasst sich mit der Anzeige, Übermittlung und Verarbeitung von Formularen
  • theme.inc kümmert sich um die Präsentation.

Es gibt auch einige Schlüsselfunktionen im Modul / Verzeichnis; Insbesondere bildet modules / node / node.module die Basis des Knotensystems, das im Allgemeinen zur Kapselung von Site-Inhalten verwendet wird.

Der Code ist im Allgemeinen sehr gut kommentiert und klar. Die Verwendung von Doxygen-Markups innerhalb des Kommentars bedeutet, dass der Code effektiv die kanonische Dokumentation ist.

Es ist auch hilfreich, dies mit einem Editor zu tun, der schnell zur Definition einer Funktion springen kann. Die Verwendung von vim in Kombination mit ctags funktioniert bei mir. Sie müssen ctags anweisen, .inc-, .module- usw. Dateien als PHP-Dateien zu indizieren.

intuitiv
quelle
5

Ich habe das Laden durch Importieren des drupal .php-Codes in ein NetBeans-Projekt gelernt. Sie können dann den NetBeans-Debugger ausführen und beobachten, wie die verschiedenen Phasen der Seite zusammenkommen.

Ben Hammond
quelle
5

Die besten Bücher zu diesem Thema sind "Pro Drupal Development" und "Using Drupal".

"Pro Drupal Development" enthält mehrere nette Flussdiagramme und gründliche Zusammenfassungen der einzelnen Drupal-APIs (Formulare, Themen usw.). Es soll besonders lehrreich für Leute sein, die ihre eigenen Module und Themen erstellen, hat aber viel Wert für den durchschnittlichen PHP-versierten Entwickler, der Drupal verstehen möchte. Außerdem habe ich für jede Site, die ich erstellt habe, ein benutzerdefiniertes Modul erstellt, um die zusätzliche Kontrolle über Dinge wie das selektive Ausblenden von Feldern in verschiedenen Formularen zu erlangen (was Sie im Allgemeinen tun möchten, um Knotenformulare für End- zu vereinfachen. Benutzer), also ist es gut, dieses Wissen unter Ihrem Hut zu haben.

"Using Drupal" richtet sich an den Site-Entwickler, der wissen möchte, wie man gute Dinge wie Galerien, Blogs und Social-Networking-Sites erstellt. Es werden mehrere Anwendungsfälle durchlaufen und gezeigt, wie vorhandene Module für die einzelnen Aufgaben konfiguriert werden. Dabei werden Sie mit den wesentlichen Zusatzmodulen "Content Construction Kit" (CCK) und "Views", dem Erstellen benutzerdefinierter Blöcke und Vorlagen sowie den Vor- und Nachteilen der Pflege einer Drupal-Site vertraut gemacht. Ich empfehle dieses Buch besonders für diejenigen, die sich auf dem Laufenden halten und Drupal sofort verwenden möchten. Dabei erhalten Sie ein Verständnis für die interne Organisation von Drupal.

Scott Lahteine
quelle
5

Dies (für Drupal 6) und dies (für Drupal 7) ist ein ziemlich guter architektonischer Überblick über Drupal. Wenn Sie mehr Details wünschen, würde ich anfangen, etwas zu schreiben. Der größte Teil der Dokumentation ist gut. Der Versuch, es mit einem hohen Detaillierungsgrad zu lernen, ohne etwas Konkretes zu erreichen, ist viel schwieriger als das Ausprobieren.

Jeremy French
quelle
4

Neuer Mitwirkender hier, 2 Jahre zu spät im Gespräch ;-)

Antwort auf https://stackoverflow.com/a/1070325/1154755

Um die Kernfunktionalität zu erweitern, schreiben Sie sie nicht neu. Kopieren Sie stattdessen das Modul in / sites / all / modules / oder / sites / [Ihre Site] / modules und erweitern Sie DAS oder erstellen Sie an diesen Stellen ein neues Modul. Gleiches gilt für Themen.

Eigentlich musste ich nie ein Kernmodul kopieren, um es zu aktualisieren. Drupal Hooks sollten alles sein, was Sie brauchen.

Ja, manchmal ist dies der einzige Weg, aber oft können Sie ein Unterthema erstellen, um das gewünschte Ergebnis zu erzielen.

Robin Millette
quelle