Einführung
Wenn Sie ein Werkzeug in der „realen Welt” einsetzen, können Sie es umso selbstbewusster verwenden, je besser Sie verstehen, wie es funktioniert. In der Anwendungsentwicklung gilt dasselbe: Wenn Sie verstehen, wie Ihre Entwicklungswerkzeuge arbeiten, entwickeln Sie souveräner und komfortabler. Diese Seite gibt Ihnen einen Überblick auf hoher Ebene, wie das Laravel-Framework arbeitet. Wenn Sie das Framework als Ganzes gut verstehen, wirkt nichts mehr wie „Magie” und Ihr Vertrauen in den eigenen Entwicklungsprozess wächst.Lebenszyklus einer HTTP-Anfrage
Gesamter Ablauf
Erste Schritte
Der Einstiegspunkt jeder Anfrage an eine Laravel-Anwendung ist die Dateipublic/index.php. Alle Anfragen werden über die Konfiguration Ihres Webservers (Apache/Nginx) an diese Datei weitergeleitet. Die index.php-Datei selbst enthält kaum Code. Sie ist der Ausgangspunkt zum Laden des restlichen Frameworks.
Die Datei index.php lädt die vom Composer erzeugte Autoloader-Definition und holt eine Instanz der Laravel-Anwendung aus bootstrap/app.php. Der erste Schritt von Laravel besteht darin, eine Instanz der Anwendung bzw. des Service Containers zu erzeugen.
HTTP-Kernel
Anschließend wird die eingegangene Anfrage an den HTTP-Kernel (Illuminate\Foundation\Http\Kernel) übergeben und über die handleRequest-Methode der Anwendungsinstanz verarbeitet.
Der HTTP-Kernel definiert ein Array von Bootstrappern, die vor der Ausführung der Anfrage laufen. Diese Bootstrapper übernehmen folgende Aufgaben:
- Fehlerbehandlung konfigurieren
- Logging konfigurieren
- Anwendungsumgebung erkennen
- Weitere Aufgaben, die vor der Request-Verarbeitung nötig sind
handle-Methode des HTTP-Kernels ist simpel: Sie erhält einen Request und liefert einen Response. Stellen Sie sich den Kernel als große Blackbox vor, die Ihre gesamte Anwendung repräsentiert: HTTP-Anfrage rein, HTTP-Antwort raus.
Service Provider
Eine der wichtigsten Aufgaben beim Bootstrapping des Kernels ist das Laden der Service Provider der Anwendung. Service Provider sind dafür verantwortlich, die verschiedenen Komponenten des Frameworks wie Datenbank, Queue, Validierung oder Routing zu initialisieren. Laravel iteriert durch die Liste der Provider und instanziiert jeden von ihnen. Nach der Instanziierung wird dieregister-Methode jedes Providers aufgerufen. Sobald alle Provider registriert sind, wird die boot-Methode jedes Providers aufgerufen. Zum Zeitpunkt der boot-Methode sind daher bereits alle Container-Bindings registriert und einsatzbereit.
Selbst geschriebene oder Drittanbieter-Provider registrieren Sie in der Datei
bootstrap/providers.php.Routing
Sobald die Anwendung gebootstrappt und alle Service Provider registriert sind, wird derRequest an den Router übergeben und dispatched. Der Router leitet die Anfrage an eine Route oder einen Controller weiter und führt zudem die routenspezifische Middleware aus.
Middleware bietet einen praktischen Mechanismus, um eingehende HTTP-Anfragen zu filtern oder zu prüfen. Laravel enthält zum Beispiel eine Middleware, die prüft, ob der Nutzer authentifiziert ist. Ist er es nicht, leitet die Middleware zum Login-Bildschirm um. Ist er authentifiziert, wird die Anfrage in die Anwendung weitergegeben.
Wenn die Anfrage alle der zugeordneten Route zugewiesenen Middlewares durchlaufen hat, wird die Route- oder Controller-Methode ausgeführt und eine Antwort erzeugt.
Antwort zurücksenden
Sobald die Route oder Controller-Methode eine Antwort zurückgibt, durchläuft die Antwort die Middleware der Route in umgekehrter Reihenfolge nach außen. So können die Middlewares die von der Anwendung zurückgegebene Antwort noch verändern oder prüfen. Wenn die Antwort schließlich die Middleware verlassen hat, gibt diehandle-Methode des HTTP-Kernels das Response-Objekt an handleRequest der Anwendungsinstanz zurück, welche die send-Methode der Antwort aufruft. Die send-Methode überträgt den Inhalt der Antwort an den Browser des Benutzers. Damit ist die gesamte Reise durch den Laravel-Request-Lebenszyklus abgeschlossen.
Lebenszyklus eines Konsolenbefehls
Gesamter Ablauf
Einstiegspunkt artisan
Der Einstiegspunkt für Konsolenbefehle ist die Dateiartisan im Projekt-Root. Analog zur HTTP-Anfrage werden der Composer-Autoloader und eine Instanz der Laravel-Anwendung erzeugt.
Anschließend wird die Verarbeitung über die handleCommand-Methode der Anwendungsinstanz an den Konsolen-Kernel übergeben.
Konsolen-Kernel und Ausführung des Befehls
Auch der Konsolen-Kernel lädt Service Provider, genau wie der HTTP-Kernel. Nachdem alle Provider registriert und gestartet wurden, werden die Befehle aus dem Verzeichnisapp/Console/Commands geladen und der angegebene Befehl ausgeführt.
- Die Datei
artisanlädt den Composer-Autoloader. - Aus
bootstrap/app.phpwird eine Anwendungsinstanz erzeugt. - Der Konsolen-Kernel lädt die Service Provider.
- Der Befehl
make:controllerwird gesucht und ausgeführt. - Der Exit-Code wird zurückgegeben.
Der Fokus auf Service Provider
Service Provider sind der eigentliche Schlüssel zum Bootstrapping einer Laravel-Anwendung. Die Anwendungsinstanz wird erzeugt, die Service Provider werden registriert und die Anfrage wird an die gebootstrappte Anwendung übergeben. Mehr ist es nicht. Es lohnt sich enorm, wirklich zu verstehen, wie eine Laravel-Anwendung mithilfe von Service Providern aufgebaut und gebootstrappt wird. Ihre eigenen Service Provider werden im Verzeichnisapp/Providers abgelegt.
Der Standard-
AppServiceProvider ist fast leer. Er eignet sich hervorragend, um anwendungsspezifisches Bootstrapping und Bindings für den Service Container hinzuzufügen. In großen Anwendungen empfiehlt es sich, mehrere Service Provider zu erstellen, in denen jeweils fein abgegrenzte Dienste bereitgestellt werden.Der Unterschied zwischen register und boot
Service Provider haben zwei zentrale Methoden.| Methode | Zeitpunkt | Zweck |
|---|---|---|
register | Wird nach der Instanziierung aller Provider für alle aufgerufen | Ausschließlich Bindings im Service Container registrieren |
boot | Wird nach Abschluss aller register-Aufrufe für alle Provider aufgerufen | View Composer, Event Listener und weitere Initialisierungen |
Nächste Schritte
Service Container
Verstehen Sie Dependency Injection und die Funktionsweise des Service Containers.
Service Provider
Lernen Sie, wie Sie Ihre Anwendung mit Service Providern bootstrappen.