Tiefe in Drupal 8 (und Symfony2): Request-to-Response-Prozess
Kernpunkte
Im ersten Artikel über die Entwicklung von Drupal 8 -Modul haben wir ein wenig über die Routing -Aspekte dieses Prozesses gelernt. Wir haben gesehen, dass das Erstellen von Seiten mit Pfaden jetzt nur ein Problem ist, Routen zu deklarieren, die dem Controller übereinstimmen. Wie wir sehen können, kann letzteres ein gerendertes Array zurückgeben, das als Marker interpretiert und im Hauptinhaltsbereich dieser Seite angezeigt wird. Aber wussten Sie, dass Drupal hinter den Kulissen dieses Array tatsächlich in ein -Reaktion -Objekt gemäß den Httpkernelinterface -Vorschriften von Symfony umwandelt?
In diesem Artikel möchte ich uns einen tieferen Blick auf die interne Struktur von Drupal 8 (und Symfony2) geben und verstehen, was tatsächlich passiert (und was möglicherweise passieren kann) zwischen dem Moment, in dem der Benutzer eine Anfrage auf die Zeit stellt, die sie sehen die Antwort, die sie zurückgeben). Die oben erwähnten Beispiele sind nur eine Richtung, in die dieser Prozess gehen kann, und heute werden wir andere Möglichkeiten sehen. Ziel ist es, die Flexibilität des Systems zu verstehen, was uns wiederum helfen kann, großartige Anwendungen aufzubauen.
Bevor Sie tiefer eintauchen, empfehle ich Ihnen dringend, dieses Diagramm zu lesen, das eine großartige Aufgabe bei der Synthese des sogenannten Rendering Pipeline macht. Obwohl es mir scheint, dass es mehr darstellt, als der Name vorschlägt, weil das Rendering -System nur ein Teil des Bildes ist, wenn auch ein großer Teil.
Front-End-Controller (index.php)
symfony2 ist jetzt ein wichtiger Bestandteil von Drupal. Letzterer verwendet viele Symfony -Komponenten. Die wichtigsten Komponenten für diesen Artikel sind die HTTPKernel- und Httpfoundation -Komponenten. Zusammen sind sie dafür verantwortlich, Benutzeranfragen zu verkörpern, an die Anwendung weiterzugeben und dann den zurückgegebenen Inhalt konsistent und objektorientiert an den Benutzer zurückzugeben.
httpkernelInterface (Sie haben möglicherweise auch von anderen Kontexten davon gehört. Ein sehr einfaches, aber mächtiges Konzept. Dieser Vorgang beginnt in der Datei index.php, die zuerst das Anforderungsobjekt generiert und an die Methode httpkernel :: handle () weitergibt. Letzteres ist dann für die Rückgabe des Antwortobjekts verantwortlich. Auf hohem Niveau geschieht dies sowohl in Drupal -Anwendungen als auch in Symfony -Anwendungen (oder in einer anderen Anwendung, die HTTPKernel -Komponenten verwendet).
httpkernel und Ereignisse
httpkernel ist der Kern einer symfonybasierten Anwendung. Wie wir sehen können, hat seine Handle () -Methode viel Verantwortung für die Vorbereitung der Antwort, und dies mit einem ereignisgesteuerten Prozess. Dies macht die Anwendung sehr flexibel, und die schwere Arbeit wird immer an den Hörer dieser Ereignisse delegiert. Wenn Sie sich das vorherige Diagramm ansehen, können Sie feststellen, dass dieser Workflow in der zweiten Spalte beschrieben wird, was im Grunde genommen den Klebstoff in Bezug auf Symfony und Drupal darstellt.
Es beginnt mit dem ersten Ereignis namens Kernel.request. Abonnenten dieser Veranstaltung erledigen verschiedene Aufgaben. Aber in Drupal 8 sind zwei sehr wichtige Aufgaben Formatverhandlungen und Routing. Der erste bestimmt die Art der Antwort, die zurückgegeben werden muss (HTML, JSON, Image, PDF usw.), und der zweite bestimmt den Code, der für die Verarbeitung dieser Antwort verantwortlich ist (die von der Route in der Routing.yml -Datei definierte _controller -Taste ). Wie die meisten Schritte in diesem Ereignis -Workflow, wenn der Hörer das Antwortobjekt zurückgibt, überspringt der Prozess die meisten nachfolgenden Schritte (Stop -Propagation) und geht direkt zu Kernel.Response.
Das zweite Ereignis ist Kernel.Controller, der aufgerufen wird, nachdem der Antrag weiß, welcher Controller für die Bearbeitung der Anfrage verantwortlich ist. Zu diesem Zeitpunkt kann der Hörer immer noch einige übergeordnete Operationen ausführen. Unmittelbar nach diesem Schritt ist der Kernel für die Parsen der an den Controller übergebenen Parameter verantwortlich. Ein solcher Vorgang in Drupal besteht darin, Objekte basierend auf der ID in der Anforderung (z. B. einem Knoten) basierend zu laden und diese Objekte direkt an den Controller zu liefern. Der Controller wird schließlich mit den entsprechenden Parametern aufgerufen.
Der Controller ist für die Rückgabe einer Antwort verantwortlich. Wenn es ein Antwortobjekt zurückgibt, springt der Prozess zum Kernel.Response -Ereignis. Der letztere Hörer kann Last-Minute-Modifikationen am Objekt durchführen, z. B. das Ändern des Headers oder des Inhalts selbst. Und nachdem der Front-End-Controller es von der Handle () -Methode erhalten hat, sendet er es an den Benutzer zurück, indem er die Methode SENT () für das Antwortobjekt beendet und den Prozess beendet.
Ein tieferes Verständnis von gerenderten Arrays
Wenn der Controller kein Antwortobjekt zurückgibt, löst der Kernel das letzte Ereignis aus: kernel.view. Die Abonnenten sind dafür verantwortlich, die Ergebnisse des Controllers in tatsächliche Antwortobjekte umzuwandeln. Dies bedeutet also, dass Sie jede Art von Objekt aus dem Controller zurückgeben können, solange Sie sie mit dem Ansichtsereignis -Abonnenten kombinieren, der dieses Objekt in die richtige Antwort umwandelt.
Wie wir im Beispiel sehen, gibt der Controller die meiste Zeit das gerenderte Array zurück. Dies stellt normalerweise den Hauptinhalt der Seite dar (ähnlich dem Seitenaufruf in Drupal 7).
Um dies zu bewältigen, hat Drupal 8 einen MainContentViewSubscriber, der für die Konvertierung dieses Arrays in das richtige Antwortobjekt verantwortlich ist. Dies geschieht, indem ein bestimmter Maincontentenderer verwendet wird, der in der zuvor erörterten Formatverhandlungsphase ausgewählt wurde. Obwohl einige dieser Renderer bereits verfügbar sind, ist der verwendete Standard -Renderer HTMLRenderer.
htmlrenderer
Da dies der am häufigsten verwendete Hauptinhalte -Renderer -Typ ist, schauen wir uns genauer an, wie er die Seite erstellt.
Eine coole Sache in diesem Prozess ist das Konzept der Seitenvariation. Dies bedeutet, dass der HTMLRenderer ein Ereignis schickt, das dafür verantwortlich ist, herauszufinden, welche Art von Seite zum Wickeln des wichtigsten Inhalts -Rendering -Arrays: RendereEvents :: SELECT_PAGE_DISPLY_VARIANT verwendet werden. Standardmäßig wird SimplePageVariant verwendet, es sei denn, das Blockmodul ist aktiviert. In diesem Fall startet BlockpageVariante und ermöglicht es, Blöcke in den Bereich um den Hauptinhalt zu platzieren. Wenn Sie möchten, können Sie diese Veranstaltung in Ihrem eigenen Modul abonnieren und Ihre eigene Variation angeben.
All dies geschieht in der Methode Prepe () von HTMLRenderer, die eine #Type = & gt -Methode für RendErePonse () enthält, die das Hauptinhaltsarray umhüllt. Die beiden letzteren sind in das #Type = & gt; 'html' Rendering -Array, das schließlich mit der Renderer -Klasse (das Äquivalent von Drupal_Render () in Drupal 7 gerendert wird. Die generierte HTML-Zeichenfolge wird dem Antwortobjekt hinzugefügt und zum Front-End-Controller zurückgegeben.
Während dies ein sehr hoher Überblick über den Prozess ist, ist dies im Grunde genommen passiert. Jetzt haben wir ein Antwortobjekt, was bedeutet, dass der Kernel seinen Kernel -Response -Ereignis entsenden kann. Danach kann der Front-End-Controller die Antwort direkt an den Benutzer zurücksenden und den Prozess beenden.
Schlussfolgerung
In diesem Artikel haben wir Drupal 8 (und Symfony2) intern untersucht, indem wir Antworten von Benutzeranfragen zu Server -Rückgaben verfolgen. Wir haben gesehen, wie Drupal 8 HTTPKernel- und Httpfoundation Symfony2 -Komponenten nutzt und wie es im Grunde auf diesen Komponenten sitzt. Darüber hinaus sehen wir, wie der Klebstoff zwischen ihnen aus Ereignissen besteht, die von Kernels versandt werden, die Drupal für alle seine Funktionen abonniert. Schließlich haben wir gesehen, wie man HTML -Seiten mit Hilfe der Rendering -Pipeline an den Benutzer erstellt und zurückgibt.
Ich glaube, dass das Verständnis, was hinter den Kulissen der Drupal 8 -Anwendung vor sich geht, eine großartige Anwendung erstellen kann, indem Sie genau wissen, wo Sie zu diesem Prozess gelangen können. Ich glaube, wenn Sie nur eines aus diesem Artikel wegnehmen, sollte es das Wort Flexibilität sein. Denn die Flexibilität, das zu bauen, was wir in Drupal 8 brauchen, ist in Drupal 7 weit mehr als alles andere. Es ist in der Tat modern geworden.
FAQs über die interne Struktur von Drupal 8 (FAQ)
Drupal 8 führt im Vergleich zu Drupal 7 mehrere Hauptveränderungen ein. Es hat eine neue Themenmotor namens Twig, die sicherer und flexibler ist. Drupal 8 ist auch mobilfreundlicher und umfasst mehr integrierte Felder. Es unterstützt mehrsprachige Websites mit verbessertem Sprachmanagement und Übersetzungsunterstützung. Darüber hinaus integriert sich Drupal 8 aufgrund der weit verbreiteten Verwendung von Symfony-Komponenten besser in Plattformen von Drittanbietern.
Drupal 8 Verwenden Sie die Symfony Httpkernel -Komponente, um Anforderungen und Antworten zu verarbeiten. Wenn eine Anfrage gestellt wird, erstellt Drupal 8 ein Anforderungsobjekt und gibt es an das httpkernel weiter. Httpkernel verwendet dann das Routing -System, um zu bestimmen, welcher Controller die Anforderung verarbeiten soll. Der Controller verarbeitet die Anforderung und gibt ein Antwortobjekt zurück, das HTTPKernel an den Client zurücksendet.
Das Routing -System in Drupal 8 ist für die Zuordnung der URL an einen bestimmten Controller verantwortlich. Es verwendet die vom Modul bereitgestellte Routing -Definition, um zu bestimmen, welcher Controller die angegebene Anforderung verarbeiten soll. Das Routing -System unterstützt auch dynamisches Routing, das gemäß dem Status des Systems geändert werden kann.
Drupal 8 verwendet Twig, eine flexible und sichere Vorlagemotor. Das Thema in Drupal 8 besteht aus einer .Info.yml -Datei (die Metadaten zum Thema bereitstellt) und einer Twig -Vorlagendatei (Definieren von HTML -Ausgabe). Das Themensystem unterstützt auch die Vorlageerbschaft und ermöglicht Themen, Vorlagen aus anderen Themen oder Modulen zu erweitern und zu überschreiben.
Entwicklung eines benutzerdefinierten Moduls in Drupal 8 beinhaltet das Erstellen einer .Info.YML -Datei, um Metadaten über das Modul bereitzustellen, und eine .moduldatei, um den PHP -Code des Moduls zu enthalten. Das Modul kann auch andere Dateien enthalten, z. B. Routing -Dateien, die Routen und Dienstdateien definieren, die Dienste definieren. Drupal 8 verwendet objektorientierte Programmier- und Symfony-Komponenten, um das Schreiben wiederverwendbarer und überprüfbarer Code zu vereinfachen.
Drupal 8 bietet viele Vorteile für die Webentwicklung. Es verwendet Symfony -Komponenten, um es leistungsfähiger und flexibler zu machen. Es unterstützt reaktionsschnelles Design außerhalb der Box und erleichtert es, eine mobilfreundliche Website zu erstellen. Drupal 8 verbessert auch die mehrsprachige Unterstützung, bessere SEO-Funktionen und eine benutzerfreundlichere Verwaltungsoberfläche.
Drupal 8 verwendet die Datenbank -API, um Datenbankinteraktionen zu verarbeiten. Die Datenbank -API bietet eine Abstraktionsschicht über SQL, mit der Entwickler Datenbankabfragen schreiben können, ohne die Details der zugrunde liegenden Datenbank -Engine verstehen zu müssen. Es unterstützt auch dynamische Abfrage-, Transaktions- und Schema -Management.
Der Event -Scheduler in Drupal 8 wird zum Verwalten von Ereignissen und Ereignishörern verwendet. Wenn ein Ereignis auftritt, benachrichtigt der Veranstaltungsplaner alle registrierten Zuhörer, die dann Maßnahmen ergreifen können. Auf diese Weise können Module entkoppelt miteinander interagieren.
Drupal 8 verfügt über ein komplexes Cache -System, mit dem die Leistung verbessert wird. Es unterstützt mehrere zwischengespeicherte Backends, einschließlich Datenbank-, Datei- und Speicher-basierte Backends. Drupal 8 verfügt auch über ein Cache-Tagging-System, das feinkörnigem Ausfall von zwischengespeicherten Daten ermöglicht.
Die Funktionalität von Drupal 8 kann durch Module und Themen erweitert werden. Module fügen neue Funktionen hinzu oder ändern vorhandene Funktionen, während Themen das Erscheinungsbild der Website steuern. Drupal 8 unterstützt auch Plug-Ins, die den Austausch von Funktionen sowie Dienste ermöglichen und wiederverwendbare Funktionen bereitstellen, die in andere Teile des Systems injiziert werden können.
Diese überarbeitete Ausgabe behält die ursprüngliche Bedeutung bei, während die Sätze und Absätze umformulieren und das direkte Kopieren vermeiden.
Das obige ist der detaillierte Inhalt vonVon der Anfrage zur Antwort: Eine Reise in Drupal 8 Interna. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!