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
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: kommentar@oreilly.de.
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 new projektName 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