image

image

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

Laravel
Die umfassende Einführung

Das Framework für moderne PHP-Entwicklung

Matt Stauffer

Deutsche Übersetzung von
Jens Olaf Koch

image

Matt Stauffer

Lektorat: Ariane Hesse

Bibliografische Information der Deutschen Nationalbibliothek

1. Auflage 2020

Authorized German translation of the English edition of titled Laravel: Up & Running, 2E

Dieses Buch erscheint in Kooperation mit O’Reilly Media, Inc. unter dem Imprint »O’REILLY«.

Hinweis:

image

Schreiben Sie uns:

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.

Inhalt

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

E-Mail

»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

E-Mail

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

Vorwort

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.

Worum es in diesem Buch geht

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.

Für wen dieses Buch gedacht ist

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.

Wie dieses Buch aufgebaut ist

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.

Über die zweite Ausgabe

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.

Vorbemerkung zur deutschen Ausgabe

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).

Konventionen, die in diesem Buch verwendet werden

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.

image

Dieses Element weist auf einen Tipp oder Vorschlag hin.

image

Dieses Element kennzeichnet einen allgemeinen Hinweis.

image

Dieses Element weist auf eine Warnung hin.

O’Reilly Online-Lernen

image

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.

Englischsprachige Website zu diesem Buch

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.

Danksagung für die erste Ausgabe

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.

Danksagung für die zweite Ausgabe

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.

KAPITEL 1

Warum Laravel?

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?

Warum ein Framework verwenden?

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.

»Ich baue es einfach selbst«

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?

Konsistenz und Flexibilität

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.

Eine kurze Geschichte der Web- und PHP-Frameworks

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.

Ruby on Rails

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.

Eine Welle von PHP-Frameworks

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.

Das Gute und das Schlechte an CodeIgniter

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.

Laravel 1, 2 und 3

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.

Laravel 4

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