Erhalten Sie Zugang zu diesem und mehr als 300000 Büchern ab EUR 5,99 monatlich.
Was Laravel von anderen PHP-Web-Frameworks unterscheidet? Es ist schnell, strukturiert, elegant und macht einfach Spaß. Dieses Framework für die schnelle Anwendungsentwicklung bietet ein ganzes Ökosystem an Tools, sodass Sie schon nach kurzer Zeit in der Lage sind, neue Websites und Anwendungen mit sauberem, lesbarem Code zu erstellen. Dieses Buch bietet eine umfassende Einführung in eines der derzeit beliebtesten Web-Frameworks - inklusive erprobtem Praxiswissen und tiefergehender Einblicke in die zugrunde liegenden Konzepte. Es deckt die Version Laravel 6 (mit Long Term Support) ab. Matt Stauffer, ein führender Entwickler der Laravel-Community, liefert einen Gesamtüberblick und eine Vielzahl konkreter Beispiele, sodass PHP-Web-Entwickler sofort produktiv mit dem Framework arbeiten können. Diese Aufgabe behandelt auch Laravel Dusk und Horizon und bietet Informationen über Community-Ressourcen sowie Pakete, die nicht zum Kern von Laravel gehören. Machen Sie sich vertraut mit: - Blade, Laravels mächtiger Templating-Engine - dem Sammeln, Validieren, Normalisieren und Filtern von benutzerdefinierten Daten - Eloquent, dem objektrelationalen Mapper für die Arbeit mit Anwendungsdatenbanken - dem Testen Ihres Codes mit PHPUnit, Mockery und Dusk - dem Entwurf von JSON- und RESTful-APIs - dem Zugriff auf Dateisystem, Sitzungen, Cookies, Caches und Suchfunktionen - dem Einsatz von Queues, Jobs, Events und Notifications - dem Einbinden von Frontend-Komponenten wie Vue.js, ReactVue.js oder React
Sie lesen das E-Book in den Legimi-Apps auf:
Seitenzahl: 668
Veröffentlichungsjahr: 2020
Das E-Book (TTS) können Sie hören im Abo „Legimi Premium” in Legimi-Apps auf:
Zu diesem Buch – sowie zu vielen weiteren O’Reilly-Büchern – können Sie auch das entsprechende E-Book im PDF-Format herunterladen. Werden Sie dazu einfach Mitglied bei oreilly.plus+:
www.oreilly.plus
ÜBERSETZUNG DER 2. AMERIKANISCHEN AUFLAGE
Das Framework für moderne PHP-Entwicklung
Matt Stauffer
Deutsche Übersetzung vonJens Olaf Koch
Matt Stauffer
Lektorat: Ariane Hesse
Übersetzung: Jens Olaf Koch
Fachlicher Review: Mitarbeiter von mindtwo, www.mindtwo.de
Korrektorat: Claudia Lötschert, www.richtiger-text.de
Satz: III-satz, www.drei-satz.de
Herstellung: Stefanie Weidner
Umschlaggestaltung: Michael Oreal, www.oreal.de
Bibliografische Information der Deutschen Nationalbibliothek
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.
ISBN:
978-3-96009-129-5
978-3-96010-374-5
ePub
978-3-96010-372-1
mobi
978-3-96010-373-8
1. Auflage 2020
Translation Copyright der deutschsprachigen Ausgabe © 2020 dpunkt.verlag GmbH
Wieblinger Weg 17
69123 Heidelberg
Authorized German translation of the English edition of titled Laravel: Up & Running, 2E
ISBN 9781492041214 © 2019 Matt Stauffer.
This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same.
Dieses Buch erscheint in Kooperation mit O’Reilly Media, Inc. unter dem Imprint »O’REILLY«.
O’REILLY ist ein Markenzeichen und eine eingetragene Marke von O’Reilly Media, Inc. und wird mit Einwilligung des Eigentümers verwendet.
Hinweis:
Dieses Buch wurde auf PEFC-zertifiziertem Papier aus nachhaltiger Waldwirtschaft gedruckt. Der Umwelt zuliebe verzichten wir zusätzlich auf die Einschweißfolie.
Schreiben Sie uns:
Falls Sie Anregungen, Wünsche und Kommentare haben, lassen Sie es uns wissen: [email protected].
Die vorliegende Publikation ist urheberrechtlich geschützt. Alle Rechte vorbehalten. Die Verwendung der Texte und Abbildungen, auch auszugsweise, ist ohne die schriftliche Zustimmung des Verlags urheberrechtswidrig und daher strafbar. Dies gilt insbesondere für die Vervielfältigung, Übersetzung oder die Verwendung in elektronischen Systemen.
Es wird darauf hingewiesen, dass die im Buch verwendeten Soft- und Hardware-Bezeichnungen sowie Markennamen und Produktbezeichnungen der jeweiligen Firmen im Allgemeinen warenzeichen-, marken- oder patentrechtlichem Schutz unterliegen.
Alle Angaben und Programme in diesem Buch wurden mit größter Sorgfalt kontrolliert. Weder Autor noch Verlag noch Übersetzer können jedoch für Schäden haftbar gemacht werden, die in Zusammenhang mit der Verwendung dieses Buches stehen.
5 4 3 2 1 0
Dieses Buch ist meiner Familie gewidmet.Mia, meiner kleinen Prinzessin, diesem Bündel voller Freude und Energie.Malachi, meinem kleinen Prinzen, Abenteurer und Empathen.Tereva, meiner Inspiration, Ermutigerin, Upgraderin, Motivatorin, Rippe.
Vorwort
1Warum Laravel?
Warum ein Framework verwenden?
»Ich baue es einfach selbst«
Konsistenz und Flexibilität
Eine kurze Geschichte der Web- und PHP-Frameworks
Ruby on Rails
Eine Welle von PHP-Frameworks
Das Gute und das Schlechte an CodeIgniter
Laravel 1, 2 und 3
Laravel 4
Laravel 5
Laravel 6
Was ist so besonders an Laravel?
Die Philosophie von Laravel
Wie sich Laravel um die Zufriedenheit des Entwicklers verdient macht
Die Laravel-Community
Wie es funktioniert
Warum also Laravel?
2Eine Laravel-Entwicklungsumgebung einrichten
Systemanforderungen
Composer
Lokale Entwicklungsumgebungen
Laravel Valet
Laravel Homestead
Ein neues Laravel-Projekt erstellen
Installation von Laravel mit dem Laravel-Installationsprogramm
Installation von Laravel mit dem create-project-Feature von Composer
Das Helfer-Paket installieren
Lambo: »laravel new« mit Düsenantrieb
Die Verzeichnisstruktur von Laravel
Die Ordner
Die Dateien
Konfiguration
Die .env-Datei
Achtung, fertig, los!
Testen
TL;DR
3Routing und Controller
Eine kurze Einführung in MVC, HTTP-Verben und REST
Was ist MVC?
Die HTTP-Verben
Was ist REST?
Routendefinitionen
Routing-Verben
Routen-Handling
Routenparameter
Benannte Routen
Routen gruppieren
Middleware
Pfad-Präfixe
Fallback-Routen
Subdomain-Routing
Namensraum-Präfixe
Namenspräfixe
Signierte Routen
Eine Route signieren
Signierte Links zulassen
Views
Einfache Routen direkt mit Route::view() zurückgeben
Verwendung von View Composern, um Variablen für alle Views bereitzustellen
Controller
Benutzereingaben
Abhängigkeiten in Controller einfügen
Ressourcen-Controller
API-Ressourcen-Controller
Controller für eine einzelne Aktion
Routen-Modell-Bindung
Implizite Routen-Modell-Bindung
Benutzerdefinierte Routen-Modell-Bindung
Routen-Caching
Methoden-Spoofing für Formulare
HTTP-Verben in Laravel
HTTP-Methoden-Spoofing
CSRF-Schutz
Umleitungen
redirect()->to()
redirect()->route()
redirect()->back()
Andere Umleitungsmethoden
redirect()->with()
Einen Request abbrechen
Gebräuchliche Response-Typen
response()->make()
response()->json() und ->jsonp()
response()->download(), ->streamDownload() und ->file()
Testen
TL;DR
4Vorlagen erstellen mit Blade
Daten ausgeben
Kontrollstrukturen
Bedingungen
Schleifen
Vorlagen-Vererbung
Definieren von Abschnitten mit @section/@show und @yield
Einbinden von Teilansichten
Verwendung von Stacks
Verwendung von Komponenten und Slots
View Composer und Service Injection
Daten mit View Composern an Views binden
Service Injection
Benutzerdefinierte Blade-Direktiven
Parameter in benutzerdefinierten Blade-Direktiven
Beispiel: Verwendung benutzerdefinierter Blade-Direktiven für eine mandantenfähige Anwendung
Einfachere benutzerdefinierte Direktiven für »if«-Anweisungen
Testen
TL;DR
5Datenbanken und Eloquent
Konfiguration
Datenbankverbindungen
Weitere Optionen zur Konfiguration von Datenbanken
Migrationen
Migrationen definieren
Migrationen ausführen
Seeding
Eine Seeder-Klasse anlegen
Modellfabriken
Der Query Builder
Grundlegender Einsatz der DB-Fassade
Direktes SQL
Verkettung mit dem Query Builder
Transaktionen
Einführung in Eloquent
Erstellen und Definieren von Eloquent-Modellen
Abrufen von Daten mit Eloquent
Inserts und Updates mit Eloquent
Löschen mit Eloquent
Geltungsbereiche
Anpassen von Feldinteraktionen durch Akzessoren, Mutatoren und Attribut-Casting
Eloquent-Collections
Serialisierung mit Eloquent
Beziehungen mit Eloquent
Aktualisierung von Zeitstempeln durch verknüpfte Datensätze
Ereignisse in Eloquent
Testen
TL;DR
6Frontend-Komponenten
Laravel Mix
Verzeichnisstruktur von Mix
Mix ausführen
Was bietet Mix?
Frontend-Frameworks und Auth-Scaffolding
laravel/ui
Frontend-Presets
Auth-Scaffolding
Paginierung
Paginieren von Datenbank-Ergebnissen
Paginatoren manuell erstellen
Message Bags
Benannte Error Bags
Hilfsfunktionen für Strings, Pluralisierung und Lokalisierung
Zeichenketten-Helfer und Pluralisierung
Lokalisierung
Testen
Message und Error Bags testen
Übersetzung und Lokalisierung
TL;DR
7Benutzereingaben erfassen und verarbeiten
Injizieren eines Anforderungsobjekts
$request->all()
$request->except() und $request->only()
$request->has()
$request->input()
$request->method() und ->isMethod()
Benutzereingaben in Array-Form
JSON-Input (und $request->json())
Routendaten
Daten aus dem Request-Objekt extrahieren
Daten aus Routenparametern
Hochgeladene Dateien
Validierung
validate() auf das Anforderungsobjekt anwenden
Manuelle Validierung
Benutzerdefinierte Regeln
Fehlermeldungen der Validierung anzeigen
Form Requests
Erstellen eines Form Requests
Verwendung eines Form Requests
Eloquent-Modelle und Massenzuweisung
{{ und {!!
Testen
TL;DR
8Artisan und Tinker
Eine Einführung in Artisan
Grundlegende Artisan-Befehle
Optionen
Befehle nach Gruppen
Benutzerdefinierte Artisan-Befehle
Ein Beispielbefehl
Argumente und Optionen
Benutzereingaben verwenden
Eingabeaufforderungen
Ausgaben
Schreiben von Closure-basierten Befehlen
Aufruf von Artisan-Befehlen in normalem Anwendungscode
Tinker
Laravels Dump-Server
Testen
TL;DR
9Authentifizierung und Autorisierung
User-Modell und -Migration
Verwendung des globalen auth()-Helfers und der Auth-Fassade
Die Auth-Controller
RegisterController
LoginController
ResetPasswordController
ForgotPasswordController
VerificationController
ConfirmPasswordController
Auth::routes()
Das Auth-Gerüst
»Remember Me«: Die Erinnerungsfunktion
Manuelle Authentifizierung von Benutzern
Manuelles Abmelden eines Benutzers
Invalidierung von Sitzungen auf anderen Geräten
Auth-Middleware
E-Mail-Verifizierung
Blade-Direktiven zur Authentifizierung
Guards
Ändern des Standard-Wächters
Verwendung anderer Guards ohne Änderung des Standards
Hinzufügen eines neuen Guards
Closure Request Guards
Erstellen eines benutzerdefinierter Providers
Benutzerdefinierte Provider für nicht-relationale Datenbanken
Authentifizierungs-Ereignisse
Autorisierung (ACL) und Rollen
Berechtigungsregeln definieren
Die Gate-Fassade (und wie man Gate injiziert)
Gate für Ressourcen
Die Authorize-Middleware
Autorisierung per Controller
Überprüfen einer Instanz des User-Modells
Überprüfungen mit Blade
Abfangen von Prüfungen
Richtlinien
Testen
TL;DR
10Request, Response und Middleware
Der Lebenszyklus des Request-Objekts
Bootstrapping der Anwendung
Service Provider
Das Request-Objekt
Zugriff auf das Request-Objekt in Laravel
Informationen aus einem Request erhalten
Das Response-Objekt
Response-Objekte in Controllern erzeugen und verwenden
Spezialisierte Antworttypen
Laravel und Middleware
Eine Einführung in Middleware
Benutzerdefinierte Middleware erstellen
Middleware binden
Parameter an die Middleware übergeben
Vertrauenswürdige Proxys
Testen
TL;DR
11Der Container
Eine kurze Einführung in die Injektion von Abhängigkeiten
Abhängigkeitsinjektion und Laravel
Der globale Helfer app()
Wie ist der Container verdrahtet?
Klassen an den Container binden
Bindung mittels Closure
Bindung von Singletons, Aliasen und Instanzen
Binden einer konkreten Instanz an ein Interface
Kontextuelle Bindung
Konstruktor-Injektion in Laravel-Framework-Dateien
Methoden-Injektion
Fassaden und Container
Wie Fassaden funktionieren
Echtzeit-Fassaden
Service Provider
Testen
TL;DR
12Testen
Grundlagen des Testens
Tests benennen
Die Testumgebung
Vier spezielle Traits beim Testen
RefreshDatabase
WithoutMiddleware
DatabaseMigrations
DatabaseTransactions
Einfache Unit-Tests
Anwendungstests: So funktionieren sie
Die TestCase-Klasse
HTTP-Tests
Testen von Standardseiten mit $this->get() und anderen HTTP-Aufrufen
Testen von JSON-APIs mit $this->getJson() und anderen JSON-HTTP-Aufrufen
Behauptungen bezüglich $response
Authentifizierung von Antworten
Weitere Anpassungen für HTTP-Tests
Behandlung von Ausnahmen in Anwendungstests
Datenbank-Tests
Verwendung von Modellfabriken
Seeding in Tests
Testen anderer Laravel-Features
Ereignisse faken
Bus- und Warteschlangen-Fakes
Mails faken
Benachrichtigungen faken
Dateioperationen faken
Mocking
Eine kurze Einführung ins Mocken
Eine kurze Einführung in Mockery
Andere Fassaden faken
Artisan-Befehle testen
Behauptungen bezüglich der Artisan-Befehlssyntax
Browser-Tests
Auswahl des Werkzeugs
Testen mit Dusk
TL;DR
13APIs schreiben
Die Grundlagen REST-ähnlicher JSON-APIs
Controller-Organisation und JSON-Antworten
Header lesen und senden
Response-Header senden
Request-Header lesen
Paginierung
Sortieren und Filtern
Sortieren der API-Ergebnisse
Filtern der API-Ergebnisse
Ergebnisse transformieren
Schreiben eines eigenen Transformators
Verschachtelung und Beziehungen mit benutzerdefinierten Transformatoren
API-Ressourcen
Erstellen einer Ressourcen-Klasse
Ressourcen-Collections
Verschachtelte Beziehungen
Paginierung in API-Ressourcen verwenden
Bedingtes Anwenden von Attributen
Weitere Anpassungen für API-Ressourcen
API-Authentifizierung mit Laravel Passport
Eine kurze Einführung in OAuth 2.0
Passport installieren
Die Passport-API
Passports Grant-Typen
Clients und Tokens mit der Passport-API und Vue-Komponenten verwalten
Passport-Scopes
Bereitstellen von Passport
API-Token-Authentifizierung
Benutzerdefinierte 404-Antworten
Triggern der Fallback-Route
Testen
Passport testen
TL;DR
14Daten speichern und abrufen
Lokale und Cloud-basierte Datei-Manager
Konfiguration des Dateizugriffs
Verwendung der Storage-Fassade
Zusätzliche Flysystem-Provider hinzufügen
Grundlagen von Datei-Uploads und -Handhabung
Einfache Datei-Downloads
Sessions
Zugriff auf die Session
Methoden, die für Session-Instanzen verfügbar sind
Flash-Sitzungsspeicher
Cache
Zugriff auf den Cache
Methoden, die für Cache-Instanzen verfügbar sind
Cookies
Cookies in Laravel
Auf Cookies zugreifen
Logging
Wann und warum man Logs verwenden sollte
In Logs schreiben
Log-Kanäle
Volltextsuche mit Laravel Scout
Scout installieren
Ein Modell für die Indexierung kennzeichnen
Einen Index durchsuchen
Warteschlangen und Scout
Operationen ohne Indizierung durchführen
Bedingt ausgeführte Indizierung
Manuelles Auslösen der Indizierung im Code
Manuelles Auslösen der Indizierung über die Kommandozeile
Testen
Dateien speichern
Session
Cache
Cookies
Logging
Scout
TL;DR
15E-Mail und Benachrichtigungen
»Klassische« E-Mail
E-Mails als »Mailable«
E-Mail-Vorlagen
In build() verfügbare Methoden
Anhänge und Inline-Bilder
Markdown-Mailables
Darstellung von Mailables im Browser
Warteschlangen
Lokale Entwicklung
Benachrichtigungen
Definieren der via()-Methode für die zu benachrichtigenden Empfänger
Senden von Benachrichtigungen
Benachrichtigungen in Warteschlangen stellen
Laravels integrierte Benachrichtigungstypen
Testen
Benachrichtigungen
TL;DR
16Queues, Jobs, Events, Broadcasting und der Scheduler
Warteschlangen
Warum Warteschlangen?
Grundlegende Warteschlangen-Konfiguration
Warteschlangen-Jobs
Ausführen eines Queue-Workers
Fehlerbehandlung
Kontrolle der Warteschlange
Warteschlange für andere Funktionen
Laravel Horizon
Ereignisse
Ein Ereignis auslösen
Nach einem Ereignis »lauschen«
Broadcasting von Ereignissen über WebSockets und Laravel Echo
Konfiguration und Einrichtung
Übertragung eines Ereignisses
Empfang der Nachricht
Fortgeschrittene Broadcasting-Werkzeuge
Laravel Echo (die JavaScript-Seite)
Scheduler
Verfügbare Aufgabentypen
Verfügbare Zeitangaben
Definieren von Zeitzonen für geplante Befehle
Blockierung und Überlappung
Output von Aufgaben handhaben
Aufgaben-Hooks
Testen
TL;DR
17Helfer und Collections
Helfer
Arrays
Zeichenketten
Anwendungspfade
URLs
Verschiedenes
Collections
Die Grundlagen
Ein paar Methoden
TL;DR
18Das Laravel-Ökosystem
Tools, die in diesem Buch behandelt werden
Valet
Homestead
Der Laravel-Installer
Mix
Dusk
Passport
Horizon
Echo
Tools, die in diesem Buch nicht behandelt werden
Forge
Envoyer
Cashier
Socialite
Nova
Spark
Lumen
Envoy
Telescope
Vapor
Weitere Ressourcen
Glossar
Index
Der Weg, der mich zu Laravel geführt hat, ist ganz typisch: Ich hatte jahrelang in PHP programmiert, war aber bereits dabei, mich davon zu verabschieden und mich den Möglichkeiten von Rails und anderen modernen Web-Frameworks zu widmen. Insbesondere Rails besaß eine lebendige Community und bot eine perfekte Kombination aus meinungsstarken Vorgaben und Flexibilität sowie das Potenzial von Ruby Gems, vorgefertige Packages mit Programmen und Bibliotheken zu nutzen.
Aber etwas hielt mich noch davon ab, PHP endgültig hinter mir zu lassen, und ich war froh darüber, als ich auf Laravel stieß. Laravel bot alles, was mich an Rails anzog, aber es war mehr als bloß ein Rails-Klon. Es war ein innovatives Framework mit unglaublich guter Dokumentation, einer einladenden Community und deutlichen Einflüssen verschiedener Sprachen und Frameworks.
Seitdem habe ich in Blogs, Podcasts und Vorträgen auf Konferenzen geteilt, was ich auf meiner Reise mit Laravel gelernt habe; ich habe Dutzende von Laravel-Apps für Arbeits- und Nebenprojekte geschrieben; und ich habe Tausende von Laravel-Entwicklern online und persönlich getroffen. Es gibt viele Tools in meinem Entwicklungs-Werkzeugkasten, aber ich bin ehrlich gesagt am glücklichsten, wenn ich mich vor eine Kommandozeile setzen und laravel newprojektName eingeben kann.
Dies ist nicht das erste Buch über Laravel, und es wird nicht das letzte sein. Es soll kein Buch sein, das jede Zeile Code oder jedes mögliche Implementierungsmuster abdeckt. Und es soll kein Buch sein, das automatisch veraltet ist, sobald eine neue Version von Laravel veröffentlicht wird. Stattdessen geht es in erster Linie darum, Entwicklern einen wirklichen Überblick und konkrete Beispiele zu geben, damit sie wissen, was sie benötigen, um in allen Laravel-Releases mit jedem einzelnen Feature und Subsystem arbeiten zu können. Anstatt einfach die Dokumentation nachzuerzählen, möchte ich Ihnen helfen, die grundlegenden Konzepte zu verstehen, auf denen Laravel aufbaut.
Laravel ist ein leistungsfähiges und flexibles PHP-Framework. Es gibt eine florierende Community und ein umfassendes Ökosystem an Werkzeugen, was dazu beiträgt, dass Laravels Attraktivität und Reichweite ständig wachsen. Dieses Buch richtet sich an Entwickler, die bereits wissen, wie man Websites und Anwendungen erstellt, und die jetzt lernen wollen, wie man genau das erfolgreich auch mit Laravel macht.
Die Laravel-Dokumentation ist umfassend und ausgezeichnet. Wenn Sie feststellen, dass ich ein bestimmtes Thema Ihrem Geschmack zufolge nicht gründlich genug abdecke, empfehle ich Ihnen, die Onlinedokumentation (https://laravel.com/docs) zu besuchen und tiefer in dieses spezielle Thema einzutauchen.
In diesem Buch erwartet Sie eine angenehme Balance zwischen einer Einführung auf hohem Niveau und konkreter Anwendung, und am Ende werden Sie sich hoffentlich dabei wohlfühlen, wenn Sie eine komplette Anwendung in Laravel von Grund auf neu schreiben. Und wenn ich meinen Job gut gemacht habe, werden Sie auch heiß darauf sein.
Dieses Buch setzt Kenntnisse grundlegender objektorientierter Programmierpraktiken, PHP (oder zumindest der allgemeinen Syntax der Sprachen der C-Familie), grundlegender Konzepte des Entwurfsmusters »Model-View-Controller« (MVC, auf Deutsch »Modell-Präsentation-Steuerung«) und der Arbeit mit Template Engines voraus. Wenn Sie zuvor noch nie selbst eine Website entworfen haben, wird es vielleicht etwas zu anspruchsvoll sein. Aber solange Sie über Programmiererfahrung verfügen, müssen Sie vor der Lektüre dieses Buchs kein Vorwissen zu Laravel haben – wir decken alles ab, was Sie wissen müssen, angefangen beim einfachsten »Hallo, Welt!«.
Laravel kann mit jedem Betriebssystem eingesetzt werden, aber es wird einige Kommandozeilen-Befehle im Buch geben, die am einfachsten unter Linux/macOS ausgeführt werden können. Windows-Benutzer werden es mit diesen Befehlen und mit moderner PHP-Entwicklung möglicherweise etwas schwerer haben, aber wenn Sie Homestead (eine virtuelle Linux-Maschine) zum Laufen bringen, können Sie alle Befehle von dort aus ausführen.
Dieses Buch ist in gewisser Weise chronologisch gegliedert: Wenn Sie Ihre erste Webanwendung mit Laravel erstellen, decken die ersten Kapitel die grundlegenden Komponenten ab, die Sie zum Einstieg benötigen, während die späteren Kapitel weniger grundlegende bzw. etwas ausgefallenere Funktionen behandeln.
Jeder Abschnitt des Buchs kann für sich allein gelesen werden, aber für alle, die dieses PHP-Framework zum ersten Mal einsetzen, habe ich versucht, die Kapitel so zu strukturieren, dass es sinnvoll ist, alles in der vorgegebenen Reihenfolge zu lesen.
Wenn es passt, schließt ein Kapitel mit zwei speziellen Abschnitten: »Testen« und »TL;DR.« Falls Sie es nicht kennen: »TL;DR« steht für »too long; didn’t read«, also »zu lang, nicht gelesen«. Diese letzten Abschnitte zeigen, wie Sie Tests für die im Kapitel behandelten Funktionen schreiben können, und fassen sehr kompakt zusammen, um was es im betreffenden Kapitel geht.
Dieses Buch ist für Laravel 6 geschrieben, deckt aber in der Regel Funktionen und Syntaxänderungen von Laravel 5.1 an ab – auch um die permanente Weiterentwicklung des Frameworks lebendig darzustellen.
Die erste Ausgabe von Laravel: Up & Running erschien im November 2016 und umfasste die Laravel-Versionen 5.1 bis 5.3. Diese zweite Ausgabe deckt die Versionen 5.4 bis 6.6 sowie Laravel Dusk und Horizon ab, zudem ist ein 18. Kapitel über Community-Ressourcen und andere Laravel-Pakete hinzugekommen, die nicht zum Kern des Frameworks gehören und in den ersten 17 Kapiteln nicht behandelt wurden.
Laravel gibt es nur in einer englischsprachigen Version, und das gilt auch für nahezu alle zusätzlichen Module, Programmpakete und Dienstleistungsangebote des gesamten Laravel-Ökosystems.
Wir haben deshalb bei der Übersetzung dieses Buchs versucht, eine angenehme Balance zwischen englischen Originalbegriffen und deutschen Fachausdrücken zu erreichen. Zumal es für viele der in Programmierung und Anwendungsentwicklung benutzten Begrifflichkeiten gar keine deutsche Entsprechung gibt. Deshalb benutzen wir mal die englischen, mal die deutschen Begriffe, mit einer Tendenz zum Englischen. Da Sie sich als angehender Laravel-Entwickler überwiegend im englischsprachigen Umfeld bewegen werden, wäre es eher kontraproduktiv, würden wir zu viele Begriffe oder Teile von Programmlistings eindeutschen.
Dazu kommt, dass Laravel von sich aus einige Funktionen mitbringt, die selbstständig Pluralformen (zum Beispiel von Modell-Namen) erstellen. Dabei wird standardmäßig ein »s« benutzt und angehängt. Obwohl man dieses Verhalten individuell übersteuern kann, liest sich der Code insgesamt geschmeidiger, und man hat weniger Arbeit, wenn man Laravel seinen »Willen« lässt.
Der Schöpfer von Laravel, Taylor Otwell, gibt sich extrem viel Mühe, den Code so lesbar und so nah an natürlicher Sprache zu halten, wie es nur geht. Und es liest sich natürlich besser, wenn eine Datenbank-Migration create_customers_table heißt und nicht create_kundens_table (ohne Übersteuerung des Standardverhaltens) oder create_kunden_table (mit angepasster Pluralform).
Die folgenden typografischen Konventionen werden in diesem Buch verwendet:
Kursiv
Zeigt neue Begriffe, URLs, E-Mail-Adressen, Dateinamen und Dateierweiterungen an.
Nichtproportional
Wird für Programm-Listings verwendet, aber auch innerhalb von Absätzen, um dort auf Programmelemente wie Variablen- oder Funktionsnamen, Datenbanken, Datentypen, Umgebungsvariablen, Anweisungen und Schlüsselwörter zu verweisen.
Nichtproportional fett
Zeigt Befehle oder anderen Text an, der vom Benutzer wortgetreu eingegeben werden muss.
Nichtproportional kursiv
Zeigt Programmcode an, der durch Benutzereingaben oder durch kontextabhängige Werte ersetzt werden soll.
{Kursiv in Klammern}
Zeigt Dateinamen oder Dateipfade an, die durch Benutzereingaben oder durch kontextabhängige Werte ersetzt werden sollen.
Dieses Element weist auf einen Tipp oder Vorschlag hin.
Dieses Element kennzeichnet einen allgemeinen Hinweis.
Dieses Element weist auf eine Warnung hin.
Seit fast 40 Jahren bietet O’Reilly Media Technologie- und Business-Training, Wissen und Einsichten, um Unternehmen zum Erfolg zu verhelfen.
Unser einzigartiges Netzwerk von Experten und Innovatoren teilt sein Wissen und seine Expertise in Büchern, Artikeln, Konferenzen und auf unserer Online-Lernplattform. Die Online-Lernplattform von O’Reilly bietet Ihnen On-Demand-Zugriff auf Live-Schulungen, detaillierte Lernpfade, interaktive Codierumgebungen und eine umfangreiche Sammlung von Texten und Videos von O’Reilly und über 200 anderen Verlagen. Für weitere Informationen besuchen Sie bitte https://www.oreilly.com.
Es gibt eine englischsprachige Website zu diesem Buch, auf der wir Errata, Beispiele und alle weiteren Informationen aufführen. Sie können diese Seite unter https://bit.ly/laravel-up-and-running-2e aufrufen.
Dieses Buch wäre ohne die verständnisvolle Unterstützung meiner wunderbaren Frau Tereva und meines Sohnes Malachi (»Papa schreibt, Buddy!«) nicht möglich gewesen. Und obwohl sie es selbst nicht wirklich bewusst miterlebt hat, war meine Tochter Mia fast über die gesamte Zeit der Entstehung des Buchs dabei, sodass dieses Buch der ganzen Familie gewidmet ist. Es gab viele lange Abendstunden und Arbeitsbesuche bei Starbucks am Wochenende, sodass ich oft nicht bei meiner Familie war, und ich könnte nicht dankbarer sein für ihre Unterstützung und vor allem für ihr Da-Sein, das mein Leben einfach bereichert.
Darüber hinaus hat mich die gesamte Tighten-Familie während des Schreibens des Buchs unterstützt und ermutigt, und mehrere meiner Kollegen haben Codebeispiele bearbeitet (Keith Damiani, »Editor Extraordinaire«) und mir bei schwierigen Projekten geholfen (Adam Wathan, König der Collection-Pipeline). Dan Sheetz, mein Partner bei Tighten, war so freundlich, mir viele Stunden nachzusehen, die ich mit der Arbeit an diesem Buch verbracht habe, und war dabei immer eine Stütze und Ermutigung; und Dave Hicking, unser Betriebsleiter, half mir, meine Zeiteinteilung und Verantwortlichkeiten rund um meine Schreibzeiten zu organisieren.
Taylor Otwell verdient Dank und Anerkennung als Schöpfer von Laravel – und damit auch für die Schaffung vieler Jobs und dafür, dass so viele Entwickler ihr Leben noch mehr lieben. Er verdient Anerkennung dafür, wie sehr er sich auf die Zufriedenheit der Entwickler konzentriert und wie hart er gearbeitet hat, um mit Empathie für uns Entwickler eine positive und ermutigende Community aufzubauen. Aber ich möchte ihm auch dafür danken, dass er ein liebenswürdiger, unterstützender und anregender Freund ist. Taylor, du bist ein Held.
Vielen Dank an Jeffrey Way, der einer der besten Lehrer im Internet ist. Er hat mich mit Laravel bekannt gemacht und bringt Laravel heute noch jeden Tag vielen Menschen näher. Er ist auch, wenig überraschend, ein fantastischer Mensch, den ich gerne Freund nenne.
Vielen Dank an Jess D’Amico, Shawn McCool, Ian Landsman und Taylor, die mich schon früh als Konferenzsprecher geschätzt haben und mir eine Plattform bieten, von der aus ich wirken kann. Vielen Dank an Dayle Rees, der in den frühen Tagen von Laravel so vielen Menschen dabei geholfen hat, es zu erlernen.
Vielen Dank an alle Menschen, die ihre Zeit und Mühe dem Schreiben von Blog-Posts über Laravel gewidmet haben, besonders in den Kindertagen von Laravel: Eric Barnes, Chris Fidao, Matt Machuga, Jason Lewis, Ryan Tablada, Dries Vints, Maks Surguy und viele mehr.
Und vielen Dank an die gesamte Community von Freunden auf Twitter, IRC und Slack, die über die Jahre mit mir kommuniziert haben. Ich wünschte, ich könnte jeden Namen nennen, aber ich würde einige vergessen und mich dann dafür schämen. Ihr seid alle brillant, und ich fühle mich geehrt, regelmäßig mit euch in Kontakt zu stehen.
Vielen Dank an meine O’Reilly-Lektorin, Ally MacDonald, und alle meine technischen Redakteure: Keith Damiani, Michael Dyrynda, Adam Fairholm und Myles Hyson.
Und natürlich danke an den Rest meiner Familie und meine Freunde, die mich direkt oder indirekt unterstützt haben – meine Eltern und Geschwister, die Gainesville-Community, Geschäftspartner und Autoren, andere Konferenzredner und die einzigartige DCB. Ich muss aufhören, weiter zu schreiben, bevor ich noch meinen Starbucks-Baristas danke.
Die zweite Ausgabe ist der ersten sehr ähnlich, sodass alle vorherigen Danksagungen noch gültig sind. Aber ich habe diesmal Hilfe von ein paar weiteren Personen bekommen. Meine technischen Korrekturleser waren Tate Peñaranda, Andy Swick, Mohamed Said und Samantha Geitz, und meine neue O’Reilly-Lektorin war Alicia Young, die mich im letzten Jahr über viele Veränderungen in meinem Leben und innerhalb der Laravel-Community hinweg bei der Arbeit gehalten hat. Matt Hacker vom Atlas-Team beantwortete alle meine dummen AsciiDoc-Formatierungsfragen, auch zur überraschend schwierigen Formatierung der __()-Methode.
Und ohne die Hilfe meines Assistenten Wilbur Powery hätte ich es nicht geschafft, diese zweite Ausgabe zu schreiben. Wilbur war bereit, die Changelogs, Pull-Requests und Ankündigungen der letzten Jahre zu durchsuchen und jedes Feature der aktuellen Struktur des Buchs zuzuordnen, und testete tatsächlich jedes einzelne Codebeispiel, damit ich meine begrenzte Zeit und Energie auf das Schreiben der neuen und aktualisierten Abschnitte konzentrieren konnte.
Außerdem hat meine Tochter Mia jetzt den Weg aus dem Bauch ihrer Mutter gefunden. Also lassen Sie mich einfach noch ihre Freude und Energie und Liebe und Niedlichkeit und ihren Abenteuergeist der Liste meiner Inspirationsquellen hinzufügen.
In den frühen Tagen des dynamischen World Wide Web sah das Schreiben einer Anwendung ganz anders aus als heute. Die Entwickler waren damals nicht nur dafür verantwortlich, den Code für die jeweils spezielle Anwendungslogik zu schreiben, sondern auch für all jene Komponenten, die immer wieder für Websites benötigt werden: für die Authentifizierung von Benutzern, die Validierung von Eingaben, Datenbankzugriffe, die Erstellung von Vorlagen und vieles mehr.
Heutzutage gibt es Dutzende von Frameworks für die Anwendungsentwicklung und Tausende von Komponenten und Bibliotheken, die allen Programmierern leicht zugänglich sind. Es ist gängige Rede unter Entwicklern, dass, kaum habe man ein Framework gelernt, es bereits drei neuere (und angeblich bessere) Frameworks gebe, die es gerne ersetzen möchten.
»Weil er halt existiert«, mag eine sinnvolle Rechtfertigung dafür sein, einen Berg zu besteigen. Aber es gibt bessere Gründe als »Weil es halt existiert«, um sich für ein bestimmtes Framework zu entscheiden – oder überhaupt eines zu verwenden. Stellen wir uns also die berechtigte Frage: Wozu sind Frameworks eigentlich gut? Genauer gesagt: Wozu ist Laravel gut?
Es ist leicht nachzuvollziehen, warum es hilfreich ist, die einzelnen Komponenten und Pakete zu verwenden, die es für PHP-Entwickler gibt. Bei Packages ist jemand anderes für die Entwicklung und Wartung eines isolierten Stücks Programmcode verantwortlich, mit dem eine bestimmte Aufgabe gelöst wird, und theoretisch sollte diese Person ein tieferes Verständnis für diese einzelne Komponente besitzen, als Sie sich selbst in angemessener Zeit aneignen können.
Frameworks wie Laravel – und Symfony, Lumen und Slim – versammeln eine Reihe Komponenten von Drittanbietern und bündeln diese mit Framework-eigenem »Klebstoff« wie Konfigurationsdateien, Service Providern, vordefinierten Verzeichnisstrukturen und Anwendungs-Bootstraps. Ganz allgemein besteht der Vorteil, ein Framework zu verwenden, darin, dass jemand für Sie nicht nur bereits über einzelne Komponenten entschieden hat, sondern auch darüber, wie diese Komponenten zusammenarbeiten sollen.
Nehmen wir an, Sie beginnen mit einer neuen Webapplikation, ohne die Vorteile eines Frameworks zu nutzen. Womit fangen Sie an? Ziemlich sicher müssen HTTP-Requests geroutet werden, sodass Sie sich alle verfügbaren HTTP-Request- und Response-Bibliotheken anschauen und danach eine auswählen müssen. Dann brauchen Sie einen Router. Und wahrscheinlich benötigen Sie auch irgendeine Art Konfigurationsdatei für die Routen. Welche Syntax soll dabei verwendet werden? An welcher Stelle soll die Konfigurationsdatei abgelegt werden? Und was ist mit Controllern? Wo sollen die liegen und wie sollen sie geladen werden? Wahrscheinlich benötigen Sie einen Dependency Injection Container, um die Controller und ihre Abhängigkeiten aufzulösen. Aber welchen?
Wenn Sie sich die Zeit nehmen, all diese Fragen zu beantworten und Ihre Anwendung erfolgreich zu erstellen, was bedeutet das dann für einen möglichen späteren Entwickler? Und was machen Sie, wenn Sie beispielsweise vier dieser Anwendungen mit solch einem Framework Marke Eigenbau programmiert haben – oder gar ein ganzes Dutzend – und Sie sich jeweils daran erinnern müssen, wo sich die Controller befinden oder wie genau die Routing-Syntax lautet?
Frameworks lösen dieses Problem, indem sie eine sorgfältig durchdachte Antwort auf die Frage »Welche Komponente sollen wir verwenden?« geben und zudem sicherstellen, dass die jeweils gewählten Komponenten auch gut zusammenarbeiten. Darüber hinaus bieten Frameworks feste Konventionen, die die Menge an Code reduzieren, die ein Entwickler, der neu zu einem Projekt stößt, verstehen muss: Sobald Sie begriffen haben, wie Routing in einem Laravel-Projekt funktioniert, wissen Sie sofort, wie es in allen Laravel-Projekten funktioniert.
Wenn jemand vorschreibt, dass sein eigenes Framework für jedes neue Projekt benutzt werden muss, dann geht es letztlich darum, zu kontrollieren, was in die Grundlage seiner Applikation einfließt und was nicht. Das bedeutet, dass Ihnen die besten Frameworks nicht nur ein solides Fundament bieten, sondern auch die Freiheit geben, praktisch alles Ihren eigenen Wünschen entsprechend anzupassen. Und genau das ist es, was Laravel so besonders macht und was ich Ihnen im weiteren Verlauf dieses Buchs zeigen möchte.
Will man die Frage »Warum Laravel?« beantworten, muss man seine Geschichte kennen – und seine Vorläufer. Bevor Laravel populär wurde, gab es bereits eine Vielzahl von Frameworks und anderer Entwicklungen in PHP und verwandten Bereichen.
David Heinemeier Hansson veröffentlichte 2004 die erste Version von Ruby on Rails, und seitdem ist fast jedes Web Application Framework in irgendeiner Weise von Rails beeinflusst.
Rails popularisierte MVC, das Model-View-Controler-Paradigma, aber auch RESTful JSON APIs, die Regel »Konvention vor Konfiguration«, ActiveRecord und viele weitere Tools und Konventionen, die einen großen Einfluss auf die Art und Weise hatten, wie Webentwickler an ihre Anwendungen herangingen – insbesondere im Hinblick auf die schnelle Anwendungsentwicklung.
Es war den meisten Entwicklern klar, dass Rails und ähnliche Frameworks die Zukunft darstellten, und schnell erschienen PHP-Frameworks auf der Bildfläche, einschließlich derjenigen, die zugegebenermaßen Rails imitierten.
CakePHP war im Jahr 2005 das erste, und es folgten bald Symfony, CodeIgniter, Zend Framework und Kohana (ein CodeIgniter-Fork). 2008 kam Yii, und 2010 erschienen Aura und Slim. 2011 sah dann die Geburt von FuelPHP und Laravel, die beide als CodeIgniter-Alternativen vorgeschlagen wurden.
Einige dieser Frameworks orientierten sich eher an Rails und konzentrierten sich auf objektrelationale Abbildung (Object-relational mapper, ORM), MVC-Strukturen und andere Tools für eine rapide Entwicklung. Andere – wie Symfony und Zend – konzentrierten sich mehr auf Enterprise Design Patterns und E-Commerce.
CakePHP und CodeIgniter waren die beiden frühen PHP-Frameworks, bei denen klar kommuniziert wurde, wie sehr sie von Ruby on Rails inspiriert waren. CodeIgniter wurde schnell bekannt und war 2010 wohl das beliebteste der unabhängigen PHP-Frameworks.
CodeIgniter war simpel, einfach zu bedienen, besaß eine erstaunlich gute Dokumentation und wurde von einer starken Community gestützt. Aber der Einsatz moderner Technologien und Entwurfsmuster schritt nur langsam voran. Als die Framework-Welt wuchs und die PHP-Tools weiterentwickelt wurden, begann CodeIgniter sowohl in Bezug auf den technologischen Fortschritt als auch auf die Funktionen, die es out of the box mitbrachte, ins Hintertreffen zu geraten. Im Gegensatz zu vielen anderen Frameworks wurde CodeIgniter von einem Unternehmen verwaltet, und es dauerte einige Zeit, bis man die neueren Features von PHP 5.3 wie Namespaces, die Nutzung von GitHub und später Composer aufgriff. Im Jahr 2010 war Taylor Otwell, Laravels Schöpfer, schließlich so unzufrieden mit CodeIgniter, dass er begann, sein eigenes Framework zu schreiben.
Die erste Beta von Laravel 1 wurde im Juni 2011 veröffentlicht und war eine komplette Neuentwicklung. Sie beinhaltete einen eigenen objektrelationalen Mapper namens Eloquent, ein Closure-basiertes Routing (inspiriert von Ruby Sinatra), ein modulares Erweiterungssystem und Hilfsfunktionen für Formulare, Validierung, Authentifizierung und vieles mehr.
Die frühe Entwicklung von Laravel ging schnell voran, und Laravel 2 und 3 wurden bereits im November 2011 bzw. Februar 2012 veröffentlicht. In diesen Versionen wurden Controller, Modul-Tests, ein Befehlszeilen-Tool, ein Container mit Inversion of Control (Steuerungsumkehr), Relationen zwischen Eloquent-Modellen sowie Migrationen eingeführt.
Für Laravel 4 hat Taylor Otwell das gesamte Framework noch einmal von Grund auf neu geschrieben. Zu diesem Zeitpunkt war Composer, der inzwischen allgegenwärtige Paketmanager von PHP, bereits auf dem Weg dazu, sich zu einem Industriestandard zu entwickeln, und Taylor sah einen großen Mehrwert darin, das Framework als eine Sammlung von Komponenten zu konzipieren, die von Composer verteilt und zu einem Ganzen gebündelt wurden.
Er entwickelte eine Reihe von Komponenten unter dem Codenamen Illuminate und brachte im Mai 2013 Laravel 4 heraus, das eine völlig neue Struktur besaß. Anstatt das Framework als einen großen Download anzubieten, zieht sich Laravel nun die meisten seiner Komponenten per Composer aus Symfony, einem anderen PHP-Framework, das seine Module zur Verwendung durch andere freigegeben hat, und kombiniert diese mit den eigenen Illuminate-Komponenten.
Laravel 4 führte auch erstmals Warteschlangen, eine Mail-Komponente, Fassaden und Datenbank-Seedings ein. Und da Laravel nun auf Symfony-Komponenten setzte, wurde angekündigt, dass Laravel den halbjährlichen Release-Terminplan von Symfony widerspiegeln würde (nicht exakt, aber zeitnah).
Laravel 4.3 sollte im November 2014 veröffentlicht werden, aber im Laufe der Entwicklung wurde deutlich, dass den Änderungen eine größere Bedeutung zukam und damit ein Versionssprung nahelag, und so wurde es im Februar 2015 als Laravel 5 herausgebracht.
Für Laravel 5 wurden die Verzeichnisstruktur überarbeitet, die Formular- und HTML-Helper entfernt sowie Contract Interfaces, eine Flut neuer Views, Socialite für eine Social-Media-Authentifizierung, Elixir für die Zusammenstellung von Assets, Scheduler zur Vereinfachung von Cron, Dotenv für vereinfachtes Umgebungsmanagement, Verbesserungen bei der Validierung von Formulareingaben und eine brandneue REPL (Read-Evaluate-Print-Loop) eingeführt. Seitdem ist die Funktionalität von Laravel weiter ausgereift, aber es gab keine größeren Änderungen mehr wie in früheren Versionen.
Laravel 6 erschien im September 2019. Die sichtbarste Veränderung bestand darin, dass bei der Versionsbenennung auf Semantic Versioning (https://semver.org/lang/de/) umgestellt wurde.
Vor Laravel 6 lag zwischen zwei sogenannten Major Releases ungefähr eine Zeitspanne von sechs Monaten, beispielsweise zwischen den Versionen 5.4 und 5.5. Die neue semantische Versionierung bedeutet, dass jedes Mal, wenn ein neues rückwärtskompatibles Feature zum Framework hinzugefügt wird, die zweite Ziffer der Versionsnummer erhöht wird. Deshalb folgen seit Version 6.0 in schneller Folge 6.1, 6.2 usw. Das ist allerdings nur eine optische Beschleunigung, die inhaltliche Fortentwicklung von Laravel geht weiterhin im gleichen Rhythmus vonstatten.
Neben der semantischen Versionierung brachte Version 6 unter anderem eine deutlich verbesserte Fehlerseite namens Ignition, die neue Job-Middleware, Lazy Collections, Verbesserungen bei Eloquent-Subqueries und die Separierung des Frontend-Scaffoldings in ein separates Paket.
Zudem wurde das Laravel-Ökosystem durch Laravel Vapor bereichert, eine serverlose Deployment-Plattform, die als Infrastruktur Amazons AWS Lambda nutzt.
Was genau ist es letztlich, was Laravel so außergewöhnlich macht? Wozu soll es gut sein, dass es mehr als ein PHP-Framework gibt? Alle Frameworks verwenden doch sowieso Komponenten von Symfony, oder nicht? Lassen Sie uns also ein wenig darüber reden, was Laravel ausmacht.
Schon wenn man das Marketingmaterial zu Laravel und die Readme-Dateien liest, bekommt man einen Eindruck von den »inneren Werten« des Frameworks. Taylor verwendet Wörter wie »Illuminate« (dt. Erleuchtung) und »Spark« (dt. Funke), die sich um das Thema »Licht« drehen. Und dann gibt es noch diese Begriffe: »Artisan« »Elegant« Und diese: »Frische Luft zum Atmen« »Neuanfang« Und schließlich: »Schnell« »Warp-Geschwindigkeit«.
Die beiden am stärksten kommunizierten Werte des Frameworks liegen in der beabsichtigten Steigerung der Entwicklungsgeschwindigkeit und der Entwicklerzufriedenheit. Die Sprache »Artisan« (dt. Handwerker) beschreibt Taylor Otwell als bewusst in Kontrast stehend zu eher funktionalen Werten. Die Anfänge dieses Denkens kann man in einem seiner Postings auf StackExchange (https://bit.ly/2dT5kmS) sehen, in dem er sagte: »Manchmal verbringe ich geradezu lächerlich viel und quälende Zeit damit, Code ›hübsch aussehen zu lassen‹« – nur damit es sich besser anfühlt, wenn man den Code als solchen betrachtet. Und er hat oft über den Wert gesprochen, der darin liegt, es Entwicklern leichter zu machen, ihre Ideen zu verwirklichen, und unnötige Hindernisse für die Entwicklung großartiger Produkte zu beseitigen.
Bei Laravel geht es im Kern darum, Entwickler für ihre Arbeit besser auszustatten und zu befähigen. Taylors Ziel ist es, klaren, einfachen und schönen Code bereitzustellen sowie Features, die Entwicklern helfen, schnell zu lernen, loszulegen und zu entwickeln und Code zu produzieren, der einfach, klar und dauerhaft nutzbar ist.
Das Konzept, die Entwickler in den Fokus zu stellen, wird in allen Materialien deutlich, die es zu Laravel gibt. »Zufriedene Entwickler schreiben den besten Code« steht in der Dokumentation. »Entwicklerzufriedenheit vom Download bis zum Deployment« (»Developer happiness from download to deploy«) war eine Zeit lang der inoffizielle Slogan. Natürlich wird jedes Tool oder Framework mit dem Anspruch vermarktet, dass die Zufriedenheit von Entwicklern im Mittelpunkt steht. Aber dass die Zufriedenheit der Entwickler als primäres und nicht nur als sekundäres Anliegen derart proklamiert wurde, hatte einen großen Einfluss auf den gesamten Stil von Laravel und die Art und Weise, wie Entscheidungen getroffen wurden. Während andere Frameworks in erster Linie die architektonische Reinheit oder die Kompatibilität mit den Wünschen und Anforderungen von Entwicklungsteams größerer Unternehmen anstreben, liegt das Hauptaugenmerk von Laravel auf der Unterstützung des einzelnen Entwicklers. Das bedeutet nicht, dass Sie in Laravel keine architektonisch reinen oder unternehmenstauglichen Anwendungen schreiben können, aber das muss nicht auf Kosten der Lesbarkeit und Verständlichkeit Ihrer Codebasis gehen.
Zu sagen, dass man Entwickler glücklich und zufrieden machen will, ist eine Sache. Es tatsächlich auch zu tun, ist etwas anderes. Und man muss sich dazu fragen, was in einem Framework Entwickler am ehesten unzufrieden und was sie zufrieden macht. Es gibt einige Ansätze, das Leben von Entwicklern zu erleichtern.
Erstens ist Laravel ein Framework für eine rapide Anwendungsentwicklung. Die Lernkurve ist relativ flach, und es wird versucht, mit möglichst wenigen Schritten von der ersten Einrichtung einer Anwendung zu ihrer Veröffentlichung zu kommen. Alle typischen Aufgaben beim Erstellen von Webanwendungen, von den Interaktionen mit Datenbanken über Authentifizierung, Warteschlangen, E-Mails bis hin zum Caching, werden durch die von Laravel bereitgestellten Komponenten vereinfacht. Aber die Komponenten von Laravel sind nicht nur für sich jeweils allein betrachtet exzellent, sie bieten auch eine konsistente API und vorhersehbare Strukturen im gesamten Framework. Wenn Sie in Laravel etwas Neues ausprobieren, werden Sie am Ende wahrscheinlich sagen können: »… und es funktioniert einfach.«
Dieser Ansatz geht zudem über das Framework selbst hinaus. Um Laravel herum existiert ein ganzes Ökosystem von Tools für die Erstellung und Veröffentlichung von Anwendungen. Da gibt es Homestead und Valet für die lokale Entwicklung, Forge für die Serververwaltung und Envoyer für eine fortgeschrittene Softwareverteilung. Zudem gibt es eine Reihe von Add-on-Paketen: Cashier für Zahlungen und Abonnements, Echo für WebSockets, Scout für die Suche, Passport für API-Authentifizierung, Dusk für Frontend-Tests, Socialite für Social Login, Horizon für die Überwachung von Warteschlangen, Nova für den Aufbau von Admin-Panels und Spark für Software-as-a-Service-Angebote. Laravel versucht, uns Entwicklern repetitive Arbeit zu ersparen, damit wir mit der eingesparten Zeit etwas Sinnvolleres anfangen können.
Außerdem gilt in Laravel die Regel »Konvention vor Konfiguration«. Das bedeutet, dass es in Laravel viel einfacher als in anderen Frameworks ist, die Standardwerte zu verwenden, weil man dort oft sogar die empfohlenen Einstellungen explizit deklarieren muss. Projekte, die mit Laravel realisiert werden, sind damit schneller umzusetzen als mit den meisten anderen PHP-Frameworks.
Laravel legt zudem großen Wert auf Einfachheit. Natürlich kann man Dependency Injection und Mocking und Data-Mapping und Repositories und Command Query Responsibility Segregation und alle Arten von anderen komplexeren Architekturmustern mit Laravel verwenden, wenn man will. Aber während andere Frameworks die Verwendung dieser Tools und Strukturen für jedes Projekt vorschlagen, tendieren Laravel und seine Dokumentation und Community dazu, mit der einfachsten möglichen Implementierung zu beginnen – einer globalen Funktion hier, einer Fassade dort, ActiveRecord bei Bedarf. Damit können Entwickler mit der für die gewünschte Lösung einfachsten Anwendung beginnen, ohne in komplexen Umgebungen bei der späteren Erweiterung eingeschränkt zu sein.
Laravel unterscheidet sich von anderen PHP-Frameworks auch dadurch, dass sein Schöpfer und die Community als Ganze eher mit Ruby und Rails und funktionalen Programmiersprachen verbunden und von diesen inspiriert sind als von Java. Im modernen PHP gibt es eine starke Strömung, die eher der Ausführlichkeit und Komplexität zuneigt und damit die eher Java-ähnlichen Aspekte von PHP betont und ausbauen möchte. Laravel steht dagegen eher auf der anderen Seite und stellt ausdrucksstarke, dynamische und einfache Codierungspraktiken und Sprachmerkmale in den Vordergrund.
Wenn dieses Buch Ihre erste Begegnung mit der Laravel-Community sein sollte, dann freuen Sie sich auf etwas Besonderes. Sie macht einen wesentlichen Unterschied und ist eines der Elemente, die zum Wachstum und Erfolg von Laravel beigetragen haben: die einladende, unterstützende Gemeinschaft all derer, die das Framework nutzen. Von Jeffrey Ways Video-Tutorials auf Laracasts (https://laracasts.com/) über die Laravel News (https://laravel-news.com/) zu Slack und IRC und Discord-Kanälen, von Twitter-Freunden über Blogger zu Podcasts und den Laracon-Konferenzen – Laravel besitzt eine große und lebendige Gemeinschaft voller Menschen, die oft seit dem ersten Tag dabei sind, und solchen, die gerade erst ihren eigenen »Tag 1« mit Laravel erleben. Und das ist kein Zufall:
Von Anfang an hatte ich die Vorstellung, dass alle Menschen gerne das Gefühl haben, Teil von etwas zu sein. Es ist ein natürlicher menschlicher Instinkt, zu einer Gruppe anderer gleichgesinnter Menschen gehören und akzeptiert werden zu wollen. Indem man also Persönlichkeit in ein Web-Framework einbringt und wirklich aktiv mit der Community interagiert, kann diese Art von Gefühl in der Community wachsen.
– Taylor Otwell, Zitat aus einem Interview der Website »Product and Support«
Taylor verstand von Anfang an, dass für ein erfolgreiches Open-Source-Projekt zwei Dinge nötig sind: eine gute Dokumentation und eine einladende Community. Und diese beiden Zutaten sind heute Markenzeichen von Laravel.
Bis jetzt war alles ziemlich abstrakt, zugegeben. Wie wäre es mit ein bisschen Code, fragen Sie vielleicht? Lassen Sie uns in eine einfache Anwendung einsteigen (Beispiel 1-1), damit Sie sehen können, wie die tägliche Arbeit mit Laravel wirklich aussieht.
Beispiel 1-1: »Hello, World« in routes/web.php
<?php
Route::get('/', function () {
return 'Hello, World!';
});
Die einfachste Aktion, die Sie in einer Laravel-Anwendung durchführen können, besteht darin, eine Route zu definieren und ein Ergebnis zurückzugeben, wenn jemand diese Route aufruft. Wenn Sie eine brandneue Laravel-Anwendung auf Ihrem Computer initialisieren, die Route so definieren wie im Beispiel 1-1 angegeben und dann die Website aus dem Verzeichnis public bedienen, haben Sie ein voll funktionsfähiges »Hallo, Welt«-Beispiel (siehe Abbildung 1-1).
Hello, World!
Abbildung 1-1: »Hello, World!« mit Laravel ausgeben
Mit Controllern sieht es ziemlich ähnlich aus, wie Sie in Beispiel 1-2 sehen können.
Beispiel 1-2: »Hello, World« mit Controllern
// Datei: routes/web.php
<?php
Route::get('/', 'WelcomeController@index');
// Datei: app/Http/Controllers/WelcomeController.php
<?php
namespace App\Http\Controllers;
class WelcomeController extends Controller
{
public function index()
{
return 'Hello, World!';
}
}
Und wenn Sie Ihre Grüße an die Welt in einer Datenbank speichern, wird es ebenfalls ziemlich ähnlich aussehen (siehe Beispiel 1-3).
Beispiel 1-3: Mehrfach-Gruß »Hello, World« mit Datenbankzugriff
Falls Ihnen Beispiel 1-3 im Moment noch ein wenig kompliziert vorkommt, überspringen Sie es einfach. In den weiteren Kapiteln wird nach und nach alles erklärt, aber Sie können hier bereits sehen, dass Sie mit nur wenigen Programmzeilen Datenbankmigrationen und -modelle einrichten und Datensätze abfragen können. Einfach einfach!
Weil Laravel Ihnen hilft, Ihre Ideen in die Welt zu bringen, ohne überflüssigen Code produzieren zu müssen, indem Sie moderne Programmierstandards verwenden, unterstützt von einer lebendigen Community und einem leistungsfähigen Ökosystem mit hilfreichen Tools.
Und weil Sie, lieber Entwickler, es verdienen, glücklich und zufrieden zu sein.
Ein Teil des Erfolgs von PHP liegt darin begründet, dass man praktisch keinen Webserver findet, der kein PHP ausführen kann. Allerdings haben moderne PHP-Tools strengere Anforderungen als in der Vergangenheit. Wenn man für Laravel entwickelt, ist es am besten, eine konsistente lokale und entfernte Serverumgebung zu gewährleisten – zum Glück bietet das Laravel-Ökosystem für diesen Zweck ein paar Tools an, die dabei helfen können.
Alles, was wir in diesem Kapitel behandeln werden, kann man auch unter Windows einrichten, aber oft muss man dazu leider Dutzende von Seiten mit zusätzlichen Anweisungen und Einschränkungen lesen. Damit wir uns aufs Wesentliche beschränken können, konzentriere ich mich in den Beispielen hier und im Rest des Buchs auf den Einsatz unter Unix/Linux/macOS.
Unabhängig davon, ob Sie PHP und die anderen Tools auf Ihrem lokalen Computer installieren oder die Entwicklungsumgebung in einer virtuellen Maschine über Vagrant oder Docker betreiben oder sich auf ein Tool wie MAMP/WAMP/XAMPP oder Laragon verlassen, müssen in Ihrer Entwicklungsumgebung die folgenden Komponenten installiert sein, damit Laravel-Websites betrieben werden können:
PHP >= 7.2.0 für Laravel 6.x, PHP >= 7.1.3 für Laravel-Versionen 5.6 bis 5.8, PHP >= 7.0.0 für Version 5.5, PHP >= 5.6.4 für Version 5.4, PHP zwischen 5.6.4 und 7.1.* für Version 5.3, PHP >= 5.5.9 für Versionen 5.2 und 5.1
OpenSSL (PHP-Erweiterung)
PDO (PHP-Erweiterung)
Mbstring (PHP-Erweiterung)
Tokenizer (PHP-Erweiterung)
XML (PHP-Erweiterung) für Laravel 5.3 und höher
Ctype (PHP-Erweiterung) für Laravel 5.6 und höher
JSON (PHP-Erweiterung) für Laravel 5.6 und höher
BCMath (PHP-Erweiterung) für Laravel 5.7 und höher
Egal, auf welchem Rechner auch immer Sie entwickeln, dort muss Composer (https://getcomposer.org/) global installiert sein. Falls Sie mit Composer nicht vertraut sind: Es ist ein Werkzeug, das die Grundlage für den Großteil moderner PHP-Entwicklung bildet. Composer ist ein Abhängigkeitsmanager für PHP, ähnlich wie NPM für Node oder RubyGems für Ruby. Aber wie NPM bildet Composer auch die Basis für den überwiegenden Teil unserer Anwendungstests, das Laden lokaler Skripte, Installationsskripte und vieles andere. Sie benötigen Composer, um Laravel zu installieren, es zu aktualisieren und Abhängigkeiten von externen Paketen bzw. Bibliotheken aufzulösen.
Für viele Projekte reicht es aus, Ihre Entwicklungsumgebung mithilfe eines eher einfachen Toolsets zu hosten. Wenn Sie bereits MAMP oder WAMP oder XAMPP oder Laragon auf Ihrem System installiert haben, sollte das normalerweise schon ausreichen, um mit Laravel arbeiten zu können. Sie können Laravel auch einfach mit dem integrierten Webserver von PHP ausführen, vorausgesetzt, die auf Ihrem System installierte PHP-Version ist die richtige.
Alles, was Sie wirklich brauchen, ist die Möglichkeit, PHP auszuführen. Alles, was darüber hinausgehen soll, liegt ganz bei Ihnen.
Laravel bietet jedoch zwei Instrumente für die lokale Entwicklung, Valet und Homestead, und diese beide schauen wir uns kurz an. Wenn Sie sich nicht sicher sind, welches Sie verwenden sollen, empfehle ich Ihnen, Valet – auf Deutsch etwa Kammerdiener – zu benutzen und sich nur kurz mit Homestead – Eigenheim oder Heimstätte – vertraut zu machen; beide Werkzeuge sind jedoch wertvoll und nützlich.
Wenn Sie den integrierten Webserver von PHP verwenden möchten, ist es am einfachsten, eine Website über eine localhost-URL aufzurufen. Wenn Sie php -S localhost:8000 -t public im Stammordner Ihrer Laravel-Site ausführen, wird der eingebaute Webserver von PHP Ihre Website unter [http://localhost:8000/] anzeigen. Sie können auch den Kommandozeilen-Befehl php artisan serve benutzen, nachdem Sie Ihre Anwendung eingerichtet haben, und damit einen gleichwertigen Server starten.
Wenn Sie jedoch Ihre Sites an eine bestimmte Entwicklungsdomain binden möchten, müssen Sie sich mit der Hosts-Datei Ihres Betriebssystems vertraut machen und ein Tool wie dnsmasq (https://bit.ly/2eNPJ5T) verwenden. Lassen Sie uns stattdessen etwas Einfacheres versuchen.
Wenn Sie macOS als Betriebssystem nutzen, kann Ihnen Laravel Valet die Arbeit abnehmen und Ihre Domains mit den Anwendungsordnern verbinden. (Es gibt auch inoffizielle Valet-Forks für Windows und Linux.) Valet installiert dnsmasq und eine Reihe von PHP-Skripten, sodass es danach reicht, laravel new myapp && open myapp.test einzugeben, damit alles funktioniert. Sie müssen dann mit Homebrew noch ein paar Tools installieren, aber es sind nur einige wenige, einfache Schritte von der Erstinstallation bis zur Funktionsfähigkeit einer Anwendung.
Installieren Sie Valet – siehe die Dokumentation (https://bit.ly/2U7uy7b) für die neuesten Installationsanweisungen – und teilen Sie Valet mit, in welchen Verzeichnissen es nach Ihren Anwendungen suchen soll. Ich führe dazu beispielsweise valet park aus meinem Verzeichnis ~/Sites aus, in dem ich alle meine Anwendungen verwalte, die sich gerade in der Entwicklung befinden. Jetzt können Sie einfach .test an das Ende des Verzeichnisnamens anhängen und die URL in Ihrem Browser aufrufen.
Valet bieten verschiedene Optionen: Man kann einfach den Befehl valet park benutzen, um auf alle Unterordner eines bestimmten Hauptordners mit {Ordnername}.test zuzugreifen; oder man richtet nur einen einzigen Ordner mit valet link ein; oder man öffnet eine von Valet verwaltete Domain für einen Ordner mit valet open; oder man nutzt für eine Valet-Site HTTPS mit valet secure oder öffnet einen ngrok-Tunnel, um die Website mit anderen über valet share teilen zu können.
Homestead ist ein weiteres Werkzeug, mit dem Sie eine lokale Entwicklungsumgebung einrichten können. Es ist ein Konfigurationstool, das auf Vagrant aufsetzt (ein Werkzeug zur Verwaltung virtueller Maschinen) und ein vorkonfiguriertes Virtual-Machine-Image bereitstellt, das perfekt für die Laravel-Entwicklung eingerichtet ist und die gängige Produktionsumgebung widerspiegelt, auf der viele Laravel-Sites laufen. Homestead ist wahrscheinlich auch die beste lokale Entwicklungsumgebung für Entwickler, die unter Windows arbeiten.
Die Homestead-Dokumentation (https://bit.ly/2FwQ7EZ) ist solide und wird ständig auf den neuesten Stand gebracht, deshalb möchte ich Sie dorthin verweisen, wenn Sie wissen möchten, wie Homestead funktioniert und wie Sie es einrichten können.
Vessel
Vessel (https://vessel.shippingdocker.com/) ist kein offizielles Laravel-Projekt, aber Chris Fidao von Servers for Hackers (https://serversforhackers.com/) und Shipping Docker (https://shippingdocker.com/) hat ein einfaches Tool geschrieben, mit dem man Docker-Umgebungen für die Laravel-Entwicklung einrichten kann. Werfen Sie einen Blick in die Dokumentation von Vessel, um mehr zu erfahren.
Es gibt zwei Möglichkeiten, ein neues Laravel-Projekt zu erstellen – bei beiden geht man über die Befehlszeile. Die erste Option ist die globale Installation des Laravel-Installationsprogramms (mit Composer), die zweite ist die Verwendung der Funktion create-project von Composer.
Sie können sich in der Dokumentation der Laravel-Installation (https://bit.ly/2HFzBFY) ausführlicher über beide Optionen informieren, aber ich würde das Laravel-Installationsprogramm empfehlen.
Wenn Sie Composer global installiert haben, reicht für die Einrichtung des Laravel-Installationsprogramms die Ausführung des folgenden Befehls:
composer global require "laravel/installer"
Jetzt muss nur noch das Verzeichnis vendor/bin der neuen globalen Composer-Installation der Umgebungsvariablen $PATH hinzugefügt werden. Dieses Verzeichnis befindet sich je nach Betriebssystem an verschiedenen Orten, in der Regel finden Sie es hier:
// macOS und GNU/Linux-Distributionen:
$HOME/.composer/vendor/bin
// Windows:
%USERPROFILE%\AppData\Roaming\Composer\Vendor\bin
Sobald Sie das Laravel-Installationsprogramm eingerichtet haben, ist es sehr leicht, ein neues Laravel-Projekt zu beginnen. Führen Sie einfach diesen Befehl von der Kommandozeile aus:
laravel new projectName
Dadurch wird ein neues Unterverzeichnis des aktuellen Verzeichnisses namens {projectName} erstellt und darin ein »nacktes« Laravel-Projekt initialisiert.
Composer bietet eine Funktion namens create-project, mit der man ebenfalls ein neues Projekt mit der vorgegebenen Grundstruktur einrichten kann. Um auf diese Weise ein neues Laravel-Projekt zu erstellen, geben Sie den folgenden Befehl ein:
composer create-project laravel/laravel projectName
Genau wie beim Installer-Tool wird auch jetzt ein Unterverzeichnis des aktuellen Verzeichnisses namens {projectName} angelegt, das ein »Skelett« eines Laravel-Projekts enthält, das sofort zur weiteren Bearbeitung bereit ist.
In Laravel gibt es eine große Anzahl von globalen Hilfsfunktionen, die oft auch kurz als Helfer bezeichnet werden. Zwei Gruppen dieser Helfer, die mit Zeichenketten und Arrays arbeiten und bis auf wenige Ausnahmen an den Präfixen str_ und array_ erkannt werden können, wurden in Version 6 in das neue Composer-Paket laravel/helpers verschoben und aus dem Framework entfernt. Stattdessen können diese Hilfsfunktionen jetzt als Methoden der Klassen Illuminate\Support\Str und Illuminate\Support\Arr aufgerufen werden.
Damit der in diesem Buch gezeigte Beispielcode auch mit früheren Versionen funktioniert, verwende ich vorerst noch die bisherigen Varianten. Installieren Sie deshalb bitte auch das Helfer-Paket:
composer require laravel/helpers
Mehr zu Hilfsfunktionen finden Sie in Kapitel 17.
Da ich oft eine Reihe gleicher Schritte ausführen möchte, nachdem ich ein neues Laravel-Projekt erstellt habe, habe ich ein einfaches Skript namens Lambo (https://bit.ly/2TCcQo8) geschrieben, um diese Vorgänge zu automatisieren.
Lambo führt laravel new aus und überträgt dann Ihren Code an Git, richtet Ihre .env-Konfiguration mit vernünftigen Voreinstellungen ein, öffnet das Projekt in einem Browser und (optional) in Ihrem Editor und führt zudem einige weitere hilfreiche Build-Schritte durch.
Sie können Lambo mit dem Composer-Befehl global require installieren:
composer global require tightenco/lambo
Und Sie können es genauso benutzen wie laravel new:
cd Sites
lambo my-new-project
Wenn Sie ein Verzeichnis öffnen, das das Grundgerüst einer Laravel-Anwendung enthält, sehen Sie die folgenden Dateien und Verzeichnisse:
app/
bootstrap/
config/
database/
public/
resources/
routes/
storage/
tests/
vendor/
.editorconfig
.env
.env.example
.gitattributes
.gitignore
artisan
composer.json
composer.lock
package.json
phpunit.xml
README.md
server.php
webpack.mix.js
Verschiedene Build-Tools in Laravel-Versionen vor 5.4
In Projekten, die vor Laravel 5.4 erstellt wurden, werden Sie wahrscheinlich eine Datei gulpfile.js anstelle von webpack.mix.js sehen; dies zeigt, dass das Projekt Laravel Elixir (https://bit.ly/2s5aKVm) anstelle von Laravel Mix (https://bit.ly/2OTXZGc) verwendet.
Lassen Sie uns alles nacheinander durchgehen, um uns damit vertraut zu machen.
Das Stammverzeichnis enthält standardmäßig die folgenden Ordner:
app
Wird den Großteil der eigentlichen Anwendung enthalten. Modelle, Controller, Befehle und der überwiegende Teil des anwendungsspezifischen PHP-Codes residieren hier.
bootstrap
Enthält die Dateien, die das Laravel-Framework beim Booten nutzt, wenn es gestartet wird.
config
Hier befinden sich alle Konfigurationsdateien.
database
Hier befinden sich die Datenbankmigrationen, Seed-Dateien und Fabriken (Factories).
public
Das Verzeichnis, auf das der Server zugreift, wenn er die Website ausliefert. Hier liegt auch index.php, der Front-Controller, der den Bootstrapping-Prozess startet und alle Anfragen entsprechend weiterleitet. Hier befinden sich auch alle öffentlich zugänglichen Dateien wie Bilder, Stylesheets, Skripte oder Downloads.
resources
Hier befinden sich Dateien, die von anderen Skripten benötigt werden. Ansichten (Views), Sprachdateien und (optional) Sass/Less/Quell-CSS- und Quell-JavaScript-Dateien.
routes
Hier befinden sich die Routendefinitionen, sowohl für HTTP-Routen als auch für »Konsolenrouten« oder Artisan-Befehle.
storage
Die Heimat von Caches, Protokollen und kompilierten Systemdateien.
tests
Hier residieren die Modul- und Integrationstests.
vendor
Hier installiert Composer seine »Abhängigkeiten«, also die Module bzw. Pakete, die von anderen Teilen der Anwendung benötigt werden. Der Ordner wird von Git ignoriert, d.h., der Inhalt wird vom Versionskontrollsystem ausgeschlossen, weil davon ausgegangen wird, dass im Rahmen der späteren Bereitstellung der Anwendung auf Remote-Servern ebenfalls Composer ausgeführt wird und dieser sich auch dort alle benötigten Pakete »zieht«.
Das Stammverzeichnis enthält außerdem die folgenden Dateien:
.editorconfig
Gibt Ihrem IDE- bzw. Texteditor Anweisungen zu Laravels Codierungsstandards (z.B. zur Größe von Einrückungen, zum Zeichensatz und ob Leerzeichen am Ende einer Zeile entfernt werden sollen). Diese Datei existiert in allen Laravel-Anwendungen ab Version 5.5.
.env und .env.example
In diesen Dateien werden die Umgebungsvariablen festgelegt (Variablen, die in jeder Umgebung unterschiedlich sein sollen und daher nicht der Versionskontrolle unterliegen). .env.example ist eine Vorlage, anhand derer in jeder neuen Umgebung eine eigene .env-Datei erstellt werden kann, die dann als »Git-ignored« vermerkt werden sollte.
.gitignore und .gitattributes
Die Git-Konfigurationsdateien.
artisan
Erlaubt Ihnen, Artisan-Befehle von der Kommandozeile aus auszuführen (siehe Kapitel 8).
composer.json und composer.lock
Konfigurationsdateien für Composer; composer.json ist benutzerdefiniert und composer.lock nicht. Diese Dateien enthalten einige grundlegende Informationen über das Projekt und die Definitionen der PHP-Abhängigkeiten.
package.json und package-lock.json
Wie composer.json und composer.lock, aber für Frontend-Assets und Abhängigkeiten des Build-Systems; es weist NPM an, welche JavaScript-basierten Abhängigkeiten einzubeziehen sind.
phpunit.xml
Eine Konfigurationsdatei für PHPUnit, das Tool, das Laravel zum Testen verwendet.
README.md
Eine Datei im Markdown-Format, die eine grundlegende Einführung in Laravel bietet. Diese Datei entfällt, wenn Sie den Laravel-Installer verwenden.
server.php
Ein Backup-Server, der versucht, Servern mit geringerer Funktionalität dennoch eine Vorschau der Laravel-Anwendung zu ermöglichen.
webpack.mix.js
Die (optionale) Konfigurationsdatei für Mix. Wenn Sie Elixir verwenden, gibt es stattdessen die Datei gulpfile.js. Diese Dateien dienen dazu, Ihrem Build-System Anweisungen zur Kompilierung und Verarbeitung Ihrer Front-end-Assets zu geben.
Die zentralen Einstellungen Ihrer Laravel-Anwendung – zu Datenbankverbindungen, Warteschlangen und zur E-Mail-Konfiguration u.v.m. – werden in Dateien im Ordner config gespeichert. Jede dieser Dateien gibt ein PHP-Array zurück, und jeder Wert in einem solchen Array ist über einen Konfigurationsschlüssel zugänglich, der sich aus dem Dateinamen und den untergeordneten Schlüsseln zusammensetzt, getrennt durch Punkte (.).
Wenn Sie also beispielsweise in der Datei config/services.php folgenden Eintrag hätten …
// config/services.php
<?php
return [
'third_party_service' => [
'secret' => 'abcdefg',
],
];
… könnten Sie auf diese Konfigurationsvariable mit config('services.third_party_service.secret') zugreifen.
Konfigurationsvariablen, die sich je nach Umgebung – z.B. in Entwicklung und Produktion – unterscheiden (und daher nicht der Versionsverwaltung unterliegen sollten) werden stattdessen in einer .env-Datei definiert. Nehmen wir an, Sie möchten für jede Umgebung einen eigenen Bugsnag-API-Schlüssel verwenden. Dann würden Sie es in der Konfigurationsdatei so formulieren, damit dieser Schlüssel aus .env eingelesen wird:
// config/services.php
<?php
return [
'bugsnag' => [
'api_key' => env('BUGSNAG_API_KEY'),
],
];
Die env()-Helferfunktion liest einen Wert aus der aktuellen .env-Datei, der zum angegebenen Schlüssel gehört. Fügen Sie also jetzt diesen Schlüssel mit Wert Ihrer .env-Datei hinzu (also den Einstellungen für die aktuelle Umgebung) und ebenso der .env.example-Datei (der Vorlage für alle Umgebungen), hier aber ohne Wert:
# In .env
BUGSNAG_API_KEY=oinfp9813410942
# In .env.example
BUGSNAG_API_KEY=
Ihre .env-Datei enthält bereits einige umgebungsspezifische Variablen, die vom Framework benötigt werden, z.B. die Angabe, welcher Mail-Treiber verwendet werden soll und welche grundlegenden Datenbankeinstellungen es gibt.
Lassen Sie uns jetzt einen kurzen Blick auf den Standardinhalt der Datei .env werfen. Die genauen Schlüssel variieren je nach verwendeter Version von Laravel, aber in Beispiel 2-1 sehen Sie die Schlüssel, wie sie in Version 6.6 aussehen.
Beispiel 2-1: Standardwerte der Umgebungsvariablen in Laravel 6.6
APP_NAME=Laravel
APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_URL=http://localhost
LOG_CHANNEL=stack
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=homestead
DB_USERNAME=homestead
DB_PASSWORD=secret
BROADCAST_DRIVER=log
CACHE_DRIVER=file
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120
REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=
PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
Ich werde nicht auf alle eingehen, denn viele davon sind reine Authentifizierungsinformationen für verschiedene Dienste (Pusher, Redis, Datenbank, E-Mail). Hier folgen jedoch zwei wichtige Umgebungsvariablen, die Sie kennen sollten:
APP_KEY
Eine zufällig generierte Zeichenkette, die zur Verschlüsselung von Daten verwendet wird. Wenn dieser Schlüssel leer ist, könnten Sie die Fehlermeldung »No application encryption key has been specified.« (»Es wurde kein Anwendungsverschlüsselungscode angegeben.«) erhalten. In diesem Fall führen Sie einfach den Befehl php artisan key:generate aus, und Laravel wird einen solchen Schlüssel für Sie generieren.
APP_DEBUG
Ein boolescher Wert, der festlegt, ob Benutzer Ihrer Anwendung Debug-Meldungen sehen sollen – wunderbar geeignet in lokalen und Staging-, katastrophal in Produktionsumgebungen.
Der Rest der Einstellungen, der keinen Authentifizierungszwecken dient (BROADCAST_DRIVER, QUEUE_CONNECTION usw.), enthält Standardwerte, die mit möglichst wenig Abhängigkeit von externen Services arbeiten, was zu Beginn ideal ist.
Wenn Sie mit einer Laravel-Anwendung loslegen, ist die einzige Änderung, die Sie wahrscheinlich für die meisten Projekte vornehmen werden, eine Änderung der Datenbank-Konfigurationseinstellungen. Ich benutze Laravel Valet, also ändere ich DB_DATABASE auf den Namen meines Projekts, DB_USERNAME auf root und DB_PASSWORD auf eine leere Zeichenkette:
DB_DATABASE=myProject
DB_USERNAME=root
DB_PASSWORD=
Dann erstelle ich in meinem bevorzugten MySQL-Client eine Datenbank, die den gleichen Namen wie mein Projekt erhält, und schon bin ich startbereit.
Jetzt ist Ihre – noch »leere« – Laravel-Installation nahezu startklar. Führen Sie git init aus, committen Sie die Projektdateien mit git add . und git commit, und schon ist alles bereit, um mit der Programmierung beginnen zu können. So einfach ist das! Und falls Sie Valet verwenden, können Sie die folgenden Befehle ausführen und Ihre Website sofort live in Ihrem Browser sehen:
laravel new myProject && cd myProject && valet open
Jedes Mal, wenn ich ein neues Projekt beginne, sind dies also die Schritte, die ich ausführe:
laravel new myProject
cd myProject
git init
git add .
git commit -m "Initial commit"
Ich verwalte alle meine Websites in einem Ordner ~/Sites, den ich als mein primäres Valet-Verzeichnis eingerichtet habe, sodass ich in diesem Fall in meinem Browser sofort und ohne weitere Vorbereitung myProject.test aufrufen kann. Ich kann die .env-Datei bearbeiten und auf eine bestimmte Datenbank verweisen, diese in meinem MySQL-Client anlegen und bin bereit, mit der Programmierung zu beginnen. Und denken Sie daran: Wenn Sie Lambo verwenden, können Sie alle diese Schritte automatisiert ausführen.
In jedem der weiteren Kapitel zeige ich Ihnen zum Abschluss in einem Abschnitt »Testen«, wie Sie Tests für die beschriebenen Features anlegen können. Da dieses Kapitel aber kein testfähiges Feature behandelt, lassen Sie uns kurz grundlegend über Tests sprechen. (Um mehr über das Schreiben und Ausführen von Tests in Laravel zu erfahren, gehen Sie bitte zu Kapitel 12.)
Laravel bringt PHPUnit als installierte Abhängigkeit mit und ist so konfiguriert, dass Tests aus all jenen Dateien im Verzeichnis tests ausgeführt werden, deren Name mit Test.php endet (z.B. tests/UserTest.php).
Der einfachste Weg, Tests anzulegen, besteht also darin, eine Datei im Verzeichnis tests mit einem Namen zu erstellen, der mit Test.php endet. Und am einfachsten führt man diese Tests mit dem Befehl ./vendor/bin/phpunit von der Kommandozeile (im Rootverzeichnis des Projekts) aus.
Wenn Tests einen Datenbankzugriff erfordern, führen Sie Ihre Tests auf dem Rechner aus, auf dem auch Ihre Datenbank liegt – wenn Sie also Ihre Datenbank in Vagrant hosten, stellen Sie sicher, dass Sie per ssh auf Ihre Vagrant-Box zugreifen, um Ihre Tests von dort aus auszuführen. Auch dazu und zu weiteren Aspekten können Sie mehr in Kapitel 12 erfahren.
In einigen der folgenden Kapitel können in den Abschnitten zum Testen auch Syntaxelemente und Funktionen vorkommen, mit denen Sie noch nicht vertraut sind, wenn Sie das Buch zum ersten Mal lesen. Wenn Sie Code in einem dieser Abschnitte verwirrend finden, überspringen Sie ihn einfach und kehren noch einmal zurück, wenn Sie das Kapitel über Tests gelesen haben.
Da Laravel ein PHP-Framework ist, lässt es sich sehr einfach lokal ausführen. Laravel bietet zudem zwei Werkzeuge für die Verwaltung Ihrer lokalen Entwicklungsumgebung: ein einfacheres Tool namens Valet, das die Abhängigkeiten auf Ihrem lokalen Computer installiert, sowie ein vorkonfiguriertes Vagrant-Setup namens Homestead. Laravel basiert auf und kann von Composer installiert werden und bringt von Haus aus eine Reihe von Ordnern und Dateien mit, die sowohl die eigenen Konventionen als auch die Beziehungen zu anderen Open-Source-Tools widerspiegeln.
Die wesentliche Funktion eines Frameworks für Webanwendungen besteht darin, Anfragen eines Benutzers entgegenzunehmen und diesem Antworten zu liefern, in der Regel über HTTP(S). Deshalb muss man als Allererstes herausfinden, wie man in einer Anwendung Routen definiert, wenn man anfängt, sich mit einem Web-Framework zu beschäftigen; ohne Routen haben Sie wenig bis gar keine Möglichkeiten, überhaupt mit dem Endbenutzer zu interagieren.
In diesem Kapitel werden wir uns mit dem Routen-Handling in Laravel befassen; Sie werden erfahren, wie man Routen definiert, wie man sie mit dem auszuführenden Code verknüpft und wie man die Routing-Tools darüber hinaus verwenden kann, um eine Vielzahl weiterer Aufgaben zu erfüllen.
