Eigene Wege Laravel bietet PHP-Entwicklern einige interessante Features.

Laravel bietet PHP-Entwicklern einige interessante Features.
Ursprünglich wurde das PHP-Framework Laravel 2011 als eine Alternative zu CodeIgniter entwickelt, inzwischen beschreitet es aber eigene Wege. Die aktuelle Version 5.3 benötigt mindestens die PHP-Version 5.6.4 und versteht sich auch gut mit PHP 7 (Bild 1).

Das Framework erfreut sich einer recht großen Beliebtheit. Die aktive Community betreut inzwischen Teile der ursprünglichen Laravel-Kernkomponenten. Die Dokumentation ist gut, außerdem steht eine Menge anderer Informationsquellen zur Verfügung. An erster Stelle ist hier sicher Laracasts (https://laracasts.com) zu nennen: eine Plattform, auf der Sie eine Vielzahl von Screencasts finden können, die Ihnen einen schnellen Einstieg ermöglichen (Bild 2).

Laravel steht unter der MIT-Lizenz und stellt inzwischen auch einen Long-Term Support (LTS) zur Verfügung, sodass man auch bei größeren Projekten keine Angst haben muss, dass es plötzlich keine Bugfixes mehr gibt.

Zu guter Letzt soll nicht unerwähnt bleiben, dass es auch Erweiterungen für Entwicklungsumgebungen wie PhpStorm gibt.

Installationsvarianten

Für die Installation von Laravel gibt es verschiedene Möglichkeiten. Bevor ich zu der bevorzugten Variante komme, möchte ich kurz auf Homestead eingehen. Bei Laravel Homestead handelt es sich um eine virtuelle Maschine, die alles mitbringt, was man für die Arbeit mit Laravel benötigt - ein sehr
C i https://laracasts.com M<a © =
LARAOSTS SIGN UP SIGN IN
It's Kinda Like Netflix for Your Career!
Learn practical, modern web development, through expert screencasts. Most video tutorials are boring. These aren't. Ready to binge?
1 GET STARTED | | BROWSE NOW |
r 1 * i  m
B
LARAVEL PHP TESTING JAVASCRIPT TOOLING

auf Laracasts finden Sie viele hilfreiche Screencasts (Bild 2)
spannendes Konzept. Homestead basiert auf Ubuntu Linux (aktuell in der Version 16.04) und setzt voraus, dass Sie Vagrant und Virtual Box 5.1, VMware oder Parallels installiert haben. Nutzen Sie noch keine Virtualisierungsumgebung, dann sollten Sie vielleicht einen Blick auf Virtual Box werfen.

Wie gesagt bringt Homestead alles (PHP, NGINX, Datenbanken et cetera) mit, was Sie für die Entwicklung mit Lara-vel benötigen, und hat den großen Vorteil, dass es auf Linux basiert. Somit können Sie weiter mit Ihrem bevorzugten Betriebssystem arbeiten, aber Ihre Anwendung trotzdem auf Linux entwickeln und testen.

Installation ohne Homestead

Nun aber zurück zur Installation ohne Homestead. Um Lara-vel zu installieren, benötigen Sie zunächst den Composer, den Sie unter https://getcomposer.org herunterladen können. Sobald der Composer verfügbar ist, können Sie den Laravel Installer mit

composer global require "laravel/installer"

installieren. Beachten Sie, dass Sie eventuell in Abhängigkeit von Ihrem Betriebssystem den Composer mit php composer. phar aufrufen müssen.

Nachdem der Installer heruntergeladen wurde, können Sie entweder über den Befehl laravel new oder über composer create-project ein neues Projekt anlegen. Oft ist es einfa- 

cher, mit dem Composer zu arbeiten, weil im diesem Fall unter Umständen noch Pfade gesetzt werden müssen. Mit dem Befehl

composer create-project --prefer-dist laravel/laravel shop

legen Sie ein neues Projekt im Ordner shop an. Anstelle von shop können Sie natürlich auch einen kompletten Pfad angeben.

Eine der Besonderheiten von Laravel ist der Kommandozeilenbefehl artisan. Der Befehl bietet einige spannende Features - zum Beispiel dieses: Wenn Sie in das Verzeichnis wechseln, in dem Sie das Projekt angelegt haben, und php artisan serve auf der Kommandozeile eingeben, dann wird ein Webserver gestartet. Der Server ist zudem so konfiguriert, dass er weiß, dass er auf den Ordner public zugreifen soll. Bei diesem Ordner handelt es sich um das Document-Root-Ver-zeichnis der Anwendung.

Die Startseite der Anwendung kann nun über http://local host:8000 aufgerufen werden (Bild 3). Mit Hilfe dieses kleinen Servers kann man eine ganze Menge machen. Trotzdem werde ich im Verlauf des Artikels dann doch auf einen ApacheServer umsteigen, weil eben doch nicht alle Möglichkeiten eines großen Servers zur Verfügung stehen.

Model-View- Controller

Auch Laravel setzt, wie die meisten Frameworks, auf das Model-View-Controller-Entwurfsmuster (MVC).

Grob gesagt ist dabei die View für die Darstellung von Daten beziehungsweise Webseiten zuständig.

Das Model ist für die Verwaltung der Daten verantwortlich, und oft ist hier auch die Applikationslogik zu finden. Der dritte im Bunde, der Controller, ist dann derjenige, der das Zusammenspiel der beiden koordiniert.

Eine tiefergehende Erläuterung würde hier leider den Rahmen sprengen, aber bei Wikipedia oder auf anderen Webseiten finden Sie ausführliche Erläuterungen zum Thema MVC.

Nun aber zurück zum Code. Wie jedes Framework gibt auch Laravel eine Verzeichnisstruktur vor. Und um die Besonderheit vorwegzunehmen: Es gibt kein Unterverzeichnis, das models heißt. Bleiben wir erst einmal bei den Verzeichnissen, die vorhanden sind.

Zunächst ist da das Verzeichnis public, das öffentlich zugängliche Verzeichnis der Anwendung, also der Document-Root. Der Code für die Views beziehungsweise die Templates für die Darstellung im Browser sind in resources/views zu finden.

Die meisten Dateien, die zu Ihrer Applikation gehören, werden im Verzeichnis app abgelegt. Die Controller finden Sie unterhalb von Http wieder. Im Verzeichnis app werden
üblicherweise auch die Models abgelegt. Dass es kein eigenes Verzeichnis für Models gibt, begründet das Laravel-Team damit, dass es oft unklar ist, was ein Model eigentlich zu leisten hat. Sprich, ist das Model nur für die Datenhaltung beziehungsweise Kommunikation mit der Datenbank zuständig oder enthält das Model auch die Applikationslogik?

Zugegebenermaßen ist dieses Thema öfter Gegenstand von Diskussionen, daher finde ich den Ansatz gar nicht so schlecht. Ein Model im Sinne von Laravel dient nur dem Zugriff auf die Datenbank. Die Konfigurationsdaten sind im Ordner config zu finden.

Wichtig ist noch der Ordner routes. Hier finden Sie die Routen, also die URLs, unter denen Ihre Anwendung angesprochen werden kann.

Konfiguration der Anwendung

Wie gerade schon erwähnt, liegt die Konfiguration der Anwendung im Ordner config. Grundsätzlich ist das auch richtig, allerdings gibt es hier eine Besonderheit. Laravel setzt im Hintergrund die Bibliothek PHP dotenv ein. Sie sorgt dafür, dass eine Datei namens .env, die sich im Installationsverzeichnis Ihrer Anwendung befindet, geladen wird. Diese enthält ebenfalls eine Konfiguration.

Die Idee hinter den .env-Dateien (es können mehrere sein), ist, dass Sie auf Ihrem lokalen System sicher eine andere Konfiguration benötigen als auf dem Live-System. Daher können Sie dort die lokale Konfiguration speichern, während die Dateien im config-Ord-ner dann die Konfiguration für das Live-System beinhalten. Wir werden hier auf die .env-Dateien verzichten. Bevor Sie sie aber löschen, sollten Sie noch eines erledigen: Die Datei .env enthält eine Zeile mit einem APP_KEY, die in etwa so aussieht:
APP_KEY=base64:p1AY+hEeQ5ttfndoP+ 0PyL4APavyVcGRNhxo27xi+FY=

Kopieren Sie alles nach dem Gleichheitszeichen und fügen Sie den Key in die Datei config/app. php ein. Dort ergänzen Sie die Zeile

'key' => env('APP_KEY')

einfach um den Key. Danach können Sie die Datei .env bedenkenlos löschen oder umbenennen. Sollten Sie später noch Probleme der Art haben, dass plötzlich alte Usernamen beim Zugriff auf die Datenbank auftauchen oder Ähnliches, dann kann es helfen, wenn Sie auf der Kommandozeile php artisan cache:clear eingeben.

Routing

Im Ordner routes liegen drei Dateien, wobei die Datei web. php dafür zuständig ist, die Routen für eine Webanwendung zu registrieren. Hier wird definiert, welche Programmteile
Homepage der Anwendung auf dem lokalen Server (Bild 3)

ausgeführt werden, wenn ein bestimmter URL aufgerufen wird. Andere Frameworks bestimmen Controller, Action und View meist direkt aus dem URL. Laravel ist hier flexibler und ermöglicht es Ihnen, beliebige Controller und Actions anzusprechen. Die grundsätzliche Syntax lautet folgendermaßen:

Route::get('foo/bar', function () {

// Code der ausgeführt werden soll });

Hier wird eine Route für einen GET-Request registriert. Dass es sich um einen GET-Request handelt, wird dadurch festgelegt, dass die Methode get() genutzt wird. Für andere Request-Typen stehen noch die Methoden post(), put(), patch(), delete() und options() zur Verfügung.

Aufruf der Startseite

Jede der Methoden bekommt als ersten Parameter den URL übergeben, der registriert werden soll. Das obige Beispiel legt also fest, was passieren soll, wenn http://server/foo/bar aufgerufen wird. Mit dem Parameter / könnte an dieser Stelle der Aufruf der Startseite definiert werden. Bevor ich auf den zweiten Parameter eingehe, die Funktion, möchte ich Ihnen noch eine kleine Erweiterung vorstellen.

In den meisten Frameworks wird ja erst innerhalb der aufgerufenen Methode geprüft, ob Parameter gültig sind. Lara-vel kann das automatisch für Sie erledigen. Dabei stellt sich natürlich erst einmal die Frage, wie innerhalb des URL Parameter deklariert werden. Dazu sind Strings in geschweiften Klammern vorgesehen:

Route::get('user/{userId}/confirm/{token}' function()

{});

Hier werden die Parameter userId und token deklariert, so-dass dieser URL also beispielsweise mit user/123/token/abc aufgerufen werden kann.

Üblicherweise müssten Sie jetzt in der Methode, die ausgeführt wird, testen, ob die übergebenen Daten plausibel sind.

Laravel unterstützt Sie hier aber und sieht die Methode where() vor, die diese Prüfung direkt durchführen kann. Ihr können Sie ein Array übergeben, das die Namen der Parameter und reguläre Ausdrücke enthält. Entspricht der überge-
Q shop.local.net/user/22/corfin x <- -> C D http://localhost:8000/user/22/confirm/12
Sorry, the page you are looking for could not be found.
1j1 N otF oundHtt^Exception in RouteCollection.php lii
1. in RouteCollection.php line 161

2. at Ro uteCo I lection ->match{oö/ecf( Request)) in Router.php line 766
Ausgabe bei fehlerhaften Parametern, mit Debug-Info (Bild 4)
bene Parameter nicht dem regulären Ausdruck, dann matcht die Route nicht und es wird ein 404-Fehler generiert:

Route::get('user/{userId}/confirm/{token}', function()

{}

)->

where(['userId' => '\d+', 'token' => '[a-z]+']);

Diese Route kann nur dann aufgerufen werden, wenn der Parameter userId nur aus Ziffern besteht und token nur aus Kleinbuchstaben (Bild 4).

Nun aber zurück zum zweiten Parameter, den ich eben übersprungen habe. Dabei handelt es sich in diesen Beispielen um eine Funktion, die ausgeführt wird, wenn der URL aufgerufen wird. Hier habe ich die Funktion direkt im Code anonym implementiert. Um die beiden Parameter aus dem obigen Beispiel an die Funktion zu übergeben, deklarieren Sie die Funktion einfach als function($userId, $token){}.

Alternativ können Sie hier auch den Namen eines Controllers, gefolgt vom Namen einer Methode beziehungsweise Action angeben. Um die Methode show() aus dem Comment-Controller aufzurufen, würden Sie beispielsweise den String 'CommentController@show'. Angeben. Auch in diesem Fall können Sie die Parameter aus dem URL als Parameter an die Methode übergeben.

Hello World

Nun wissen Sie zwar, wie das Routing funktioniert, aber wir brauchen natürlich noch einen Controller und eine View für eine erste kleine Anwendung. Den Controller legen Sie am einfachsten über artisan an. Mit php artisan make:controller DataController wird ein Controller namens DataController im Verzeichnis app/Http/ Controllers angelegt. Den generierten Controller habe ich hier schon um eine Methode beziehungsweise Action namens input() ergänzt:

namespace App\Http\Controllers; use Illuminate\Http\Request; class DataController extends Controller {

public function input() {

return view ('input' , ['what' => 'Welt']);

}

}

Um die Action mit einer View zu verknüpfen, liefert die Methode den Rückgabewert des View-Helpers zurück. Der Parameter ’input’ referenziert dabei den Namen der View. Mit dem Array, das hier als zweiter Parameter genutzt wird, können Daten an die View übergeben werden. Bevor ich weiter auf das Template eingehe, hier noch schnell die Route, die ich in der Datei web.php ergänzt habe:

Route::get('data/input' , 'DataController@input');

Dadurch, dass ich input an den View-Helper übergeben habe, erwartet Laravel ein Template namens input.blade.php 

im Verzeichnis resources/views.

Das Suffix blade resultiert daraus, dass Laravel eine Templa-te-Engine namens Blade nutzt.

Noch vor einigen Jahren haben deutlich mehr Frameworks Template-Engines genutzt als heute. Inzwischen wird in den Templates meist direkt auf PHP gesetzt. Die Nutzung von Engines bieten allerdings einige Vorteile:

Die Templates können kompiliert und gecacht werden.

Template-Designer müssen kein PHP lernen, sondern können mit der Template-Sprache arbeiten.

Die Template-Sprache ist auf die Ausgabe von Daten spezialisiert.

Ein einfaches Template kann beispielsweise folgendermaßen aussehen:

<html>

<head>

<title>Eingabe</title>

</head>

<body>

Hallo {{ $what }}

</body>

</html>

Wie Sie sehen, handelt es sich um einfaches HTML, das um das {{ $what }} ergänzt wurde. Mit Hilfe von doppelten geschweiften Klammern können Sie also eine Variable, die genau wie in PHP mit einem Dollar-Zeichen deklariert wird, ausgeben lassen. Um Probleme bei der Nutzung von JavaScript in Templates zu vermeiden, können Sie die Funktionalität der geschweiften Klammen mit einem vorangestellten @-Zeichen unterdrücken.

Das @-Zeichen dient übrigens auch dazu, die meisten anderen Befehle, die in Blade bekannt sind, einzuleiten. Leider kann ich hier nicht die komplette Syntax vorstellen, aber in den meisten Fällen können Sie einfach die alternative PHP-Syntax mit einem vorangestellten @ nutzen (@if - @endif / @ for - @endfor et cetera) (Bild 5).

Umfangreiche Informationen - gerade auch zum Aufbau von Layouts - finden Sie im Laravel-Manual unter https://la ravel.com/docs/5.3/blade.

Erstellen von Formularen

Bei fast allen Webanwendungen müssen Daten eingegeben werden, wozu Sie ein Formular benötigen. Da konventionelle HTML-Formulare in der heutigen Zeit aber immer weniger genutzt werden, wurden die Klassen zum Erstellen von Formularen aus dem Laravel-Kern entfernt. Im Umkehrschluss heißt das, dass Sie die benötigten Komponenten nachinstallieren müssen, was mit composer require "laravelcollective/ html":"A5.3.0" geschieht. Zusätzlich müssen Sie noch in der Datei app.php, die im Verzeichnis config liegt, zwei Ergän-
zungen vornehmen. Zuerst müssen Sie im Abschnitt providers die folgende Zeile ergänzen:

Collective\Html\ HtmlServiceProvider::class

Des Weiteren müssen Sie den Abschnitt aliases um die folgenden Zeilen ergänzen:

'Form' => Collective\Html\FormFacade::class,

'Html' => Collective\Html\HtmlFacade::class,

Wenn Sie das erledigt haben, können Sie innerhalb der View auf {!! Form:: ... !!} zugreifen. Die Deklaration des Formulars erfolgt direkt im Template über den Aufruf statischer Methoden. Für jedes Formular-Element, das Sie aus HTML kennen, gibt es dabei eine eigene Methode.

Formular-Elemente

Die Methoden für die Formular-Elemente bekommen dabei zuerst den Wert für das name-Attribut übergeben. Danach folgt zunächst der Wert für das value-Attribut, wenn das Element dieses unterstützt. Als dritten Parameter können Sie ein optionales Array angeben, mit dem Sie beliebige Attribute wie CSS-Klassen et cetera festlegen können. Ein einfaches Formular zur Erfassung von Namen, Geburtstag, Telefon und Land könnte demnach wie in Listing 1 aufgebaut sein. Ich denke, dass die meisten Einträge hier selbsterklärend sind. Beim Geburtsdatum gilt, dass der Wert, der dort angezeigt werden

Listing 1: Formular

{!! Form::open(['action' => 'DataController@input', 'method' => 'post']) !!}

{!! Form::label('name', 'Name') !!}

{!! Form::text('name', '', ['id' => 'name']) !!}

<br>

{!! Form::label('birthday', 'Geburtstag') !!}

{!! Form::date('birthday', \Carbon\Carbon::now())

!!}

<br>

{!! Form::label('phone', 'Telefon') !!}

{!! Form::text('phone', '', ['id' => 'phone']) !!}

<br>

{!! Form::label('country', 'Land') !!}

{!! Form::select('country', $countries, 0) !!}

<br>

{!! Form::submit('Speichern') !!}

{!! Form::close() !!}
■ Q Eingabe X \\ \__0

4" C I © localhost:8000/dats/input ft] Cg Hallo Welt
Die erste Ausgabe der eigenen Applikation (Bild 5)

soll, mit Hilfe der Klasse Carbon übergeben werden muss, die Laravel mitbringt.

Eine Dokumentation zu Carbon finden Sie unter der Adresse http://carbon.nes bot.com.

Erwähnenswert ist auch die Optionsliste, die als vorletztes Element hinzugefügt wird. Die Optionen werden hierbei als zweiter Parameter in Form eines Arrays übergeben. Die Variable $countries habe ich dabei nach dem bereits bekannten Schema aus dem Controller übergeben. Der dritte Wert legt in diesem Fall fest, welches Array-Element als Default-Wert dargestellt werden soll.

In Bild 6 und Bild 7 sehen Sie die Darstellung des Formulars in Google Chrome und Firefox unter macOS.

In Chrome wird ein schickes Datumsfeld mit Date-Picker dargestellt, was in Firefox leider nicht funktioniert. Das liegt daran, dass Laravel kein JavaScript einbindet, um das Feld zu generieren, sondern einfach auf HTML5-Elemente setzt.

Die komplette Dokumentation zum Umgang mit Formularen in Laravel finden Sie auf https://laravelcollective.com/ docs/5.3/html.

Ab in die Datenbank

Schicken Sie das Formular jetzt ab, erhalten Sie eine Fehlermeldung, weil die Route nicht existiert. Bisher habe ich nämlich nur eine Route für die GET-Methode angelegt. Zwar würde der URL der neuen Route dem URL der bestehenden Route entsprechen, aber es handelt sich um einen POST-Request. Natürlich wäre es auch möglich, beide Methoden mit derselben Route zu behandeln, aber dann müsste ich in der Methode unterscheiden, ob das Formular ausgegeben werden soll oder die Daten gespeichert werden sollen. Zunächst ergänze ich also die folgende Route:

Route::post('data/input' , 'DataController@save');
Werfen wir zunächst einen Blick auf die Arbeit mit Eloquent. Um das Grundgerüst des Models generieren zu lassen können Sie php artisan make:model KundenModel auf der Kommandozeile eintippen.

Nachfolgend sehen Sie den generierten Code, den ich schon um den Namen der Datenbanktabelle ergänzt habe:

namespace App; use

Illuminate\Database\Eloquent\Model; class KundenModel extends Model {

protected $table = 'kunden';

}

Zusätzlich könnten Sie hier noch einen Primärschlüssel mit Hilfe der Eigenschaft $primaryKey festlegen. In diesem Fall geht Eloquent davon aus, dass die Spalte id der Primärschlüssel ist. Die Tabelle, die ich nutze, ist in Listing 2 deklariert. Falls Sie sich gerade über die beiden Spalten created_at und updated_at wundern: Die beiden werden standardmäßig automatisch von Eloquent befüllt, sodass Sie sich nicht darum kümmern müssen, zu protokollieren, wann Daten gespeichert oder geändert wurden. Sagt Ihnen dieses Feature nicht zu, dann können Sie im Model die folgende Zeile hinzufügen, um es abzuschalten:

public $timestamps = false;

Die Methode, die ich im Controller ergänzt habe, ist sehr simpel aufgebaut. Sie liest einfach nur die Daten aus und übergibt sie an das Model, das sie dann speichert (Listing 3).

Die Methode bekommt das Request-Objekt übergeben. Somit kann ich die Daten direkt auslesen und dem Model zuweisen. Die View, die ich am Schluss nutze, ist einfach nur eine statische HTML-Datei.
Das Formular in Google Chrome (Bild 6)
Das Formular im Firefox-Browser (Bild 7)
Wie Sie hier sehen können, wird bei Aufruf dieser Route eine andere Methode aufgerufen.

Bevor ich nun aber zum Controller komme, stellt sich noch die Frage, wie Sie überhaupt auf die Datenbank zugreifen können. Dazu bietet Laravel mehrere Ansätze. Mit Eloquent steht Ihnen ein ORM-Layer zur Verfügung. Damit können Sie für jede Datenbanktabelle ein eigenes Model erstellen, über das Sie mit der Tabelle kommunizieren.

Alternativ können Sie den Query Builder einsetzen, und zu guter Letzt können Sie auch direkt mit SQL-Code arbeiten, was gerade bei komplexeren Abfragen oft die einfachere Variante ist. Die Konfigurationsdaten für den Zugriff auf die Datenbank werden in der Datei config/database.php hinterlegt. Überarbeiten Sie das dort vorhandene Array einfach so, dass es Ihren Anforderungen entspricht.
^ Listing 2: Beispieltabelle

CREATE TABLE 'kunden'

(

'id' int(11) NOT NULL AUTO_INCREMENT,

'name' varchar(200) NOT NULL DEFAULT '', 'birthday' date NOT NULL DEFAULT '1981-1-1', 'phone' varchar(200) NOT NULL DEFAULT '', 'country' int(11) NOT NULL DEFAULT '0', 'created_at' datetime DEFAULT NULL, 'updated_at' datetime DEFAULT NULL,

PRIMARY KEY ('id')


Die einfachste Variante, um alle Daten auszulesen, ist die statische Methode all(), die in allen Eloquent-Mo-dels bekannt ist. Ohne Parameter liefert sie Ihnen den kompletten Inhalt der Tabelle zurück:

public function show() {

$data = KundenModel::all(); return view ('show', ['data' => $data]);
}
In der View können Sie die Daten nun mit einer @foreach-Schleife ausgeben lassen. Nachfolgend sehen Sie den relevanten Teil der View (Bild 8):

<body>

<table>

<tr>

<td>Name</td>

<td>Geburtstag</td>

<td>Telefon</td>

</tr>

@foreach($data as $set)

<tr>

<td>{{ $set->name }}</td>

<td>{{ $set->birthday }}</td>

<td>{{ $set->phone }}</td>

</tr>

@endforeach

</table>

</body>

Damit sind Sie mit den Grundlagen von Laravel vertraut. Aber Laravel kennt natürlich noch einige Besonderheiten. Ei-
Der Query Builder

Alternativ möchte ich Ihnen noch kurz die Nutzung des Query Builders vorstellen. Das Auslesen der Daten aus dem Request-Objekt funktioniert natürlich genauso, weswegen ich hier auf diesen Teil der Methode verzichtet habe:

public function save(Request $request) {

// Wie vorher DB::table('kunden')->insert(

['name' => $name,

'birthday' => $birthday,

'phone' => $phone,

'country' => $country]

);

return view ('save');

}
So erfolgt die Ausgabe der Daten der Anwendung (Bild 8)
Zusätzlich muss noch die folgende use-Anweisung ergänzt werden:

use Illuminate\Support\Facades\DB;

Im Unterschied zu Eloquent füllt der Query Builder nicht die beiden Spalten mit den Zeitstempeln aus. Sollte das für Sie wichtig sein, dann müssen Sie es manuell implementieren. Um sicherzustellen, dass es beim Speichern der Werte nicht zu Problemen kommt, arbeitet der Query Builder mit Prepared Statements.

Natürlich können Sie die Daten mit diesen Mitteln auch wieder auslesen. Sobald die neue Route angelegt ist, können Sie im Controller eine neue Methode zum Auslesen und Anzeigen der Daten implementieren.
^ Listing 3: Daten auslesen

public function save(Request $request) {

$name = $request->input('name', ''); $birthday = $request->input('birthday', ''); $phone = $request->input('phone', ''); $country = $request->input('country', '');

// Daten zuweisen

$tabelle = new KundenModel();

$tabelle->name = $name;

$tabelle->birthday = $birthday; $tabelle->phone = $phone;

$tabelle->country = $country;

// Daten speichern $tabelle->save(); return view ('save');

}
Links zum Thema

Allgemeine Beschreibung des MVC-Musters https://de.wikipedia.org/wiki/Model_View_Controller

Laravel-Homepage www.laravel.com

Vagrant zum Konvertieren von virtuellen Maschinen https://www.vagrantup.com

Virtual Box https://www.virtualbox.org

VMware www.vmware.com

Parallels https://www.parallels.com

Composer https://getcomposer.org

ne davon ist die Möglichkeit, mit Middleware zu arbeiten. Eine Middleware bei Laravel ist ein Software-Layer, der vor beziehungsweise nach dem Controller ausgeführt werden kann. Es handelt sich also nicht um eine Middleware im Sinne des PSR-7-Standards, der ja momentan in aller Munde ist.

Wozu aber ein Software Layer, der vor oder nach dem Controller ausgeführt wird? Die Idee ist recht einfach. Stellen Sie sich beispielsweise vor, dass Sie einen geschützten Bereich haben, auf den nur authentifizierte User zugreifen dürfen. Bei den meisten Frameworks müssen Sie dann im Controller eine Methode implementieren, die immer aufgerufen wird, um die Authentifizierung zu prüfen.

Das macht den Code aber nicht unbedingt besser lesbar und man vergisst es auch schnell einmal, die Methode aufzurufen. Alternativ kann man eine solche Methode natürlich auch in den Konstruktor oder eine Basisklasse auslagern. Aber auch das ist auch nicht immer ideal.

Middleware

Eine Middleware schafft da Abhilfe. Sie ist komplett autonom und bekommt das Request-Objekt übergeben, bevor es an den Controller weitergegeben wird. Eine Middleware wird bei der Deklaration der Route mit angegeben. Somit ist auch ein hohes Maß an Transparenz gewährleistet.

Eine komplette Benutzerverwaltung würde leider den Rahmen des Artikels sprengen. Daher möchte ich hier nur eine kleine Middleware implementieren, die das Speichern von Daten nur zulässt, wenn die IP des Users der 127.0.0.1 entspricht. Natürlich können Sie die Middleware auch manuell anlegen, aber es ist einfacher, artisan zu nutzen:

php artisan make:middleware IpCheck

Die neue Klasse legt artisan dann in app/Http/Middleware ab, und sie sieht so aus:
Auf die richtige Version achten

Wie schon erwähnt, benötigt Laravel 5.3 mindestens PHP 5.6.4. Sollte Ihr PHP-CLI in einer vorhergehenden Version vorliegen, dann installiert der Installer Version 5.2 von Laravel. Bitte prüfen Sie also vor der Installation mit php -u, welche Version Ihr CLI hat, oder achten Sie bei der Installation darauf, welche Version installiert wird.
namespace App\Http\Middleware; use Closure; class IpCheck {

public function handle($request, Closure $next)

{

return $next($request);

}

}

Die Methode handle() bekommt das Request-Objekt und den Pointer auf die nächste Funktion beziehungsweise Methode übergeben. Durch das return $next($request) ist sichergestellt, dass die Referenz auf die nächste Methode ($next), also typischerweise die Methode des Controllers, aufgerufen wird und das Request-Objekt weitergegeben wird.

Dadurch, dass die Methode das komplette Objekt übergeben bekommt, können natürlich auch Werte aus Formularen gefiltert oder validiert werden. Um die IP-Adresse des Clients zu prüfen, habe ich die Methode handle() um ein paar Zeilen ergänzt:

public function handle($request, Closure $next)

{

if ($request->getClientIp() != '127.0.0.1' && // IPv4 $request->getClientIp() != '::1') // IPv6

{

return redirect()->action('DataController@input');

}

return $next($request);

}

In der if-Abfrage wird in der IPv4- und IPv6-Variante geprüft, ob der Aufruf vom localhost stammt. Ist das nicht der Fall, dann erfolgt eine Weiterleitung auf die Methode input() des DataControllers. Diese Vorgehensweise ist für eine echte Anwendung zwar nicht zu empfehlen, hier aber ausreichend.

Nun muss die Middleware noch angemeldet werden. Dazu wird sie zunächst in der Datei app/Http/Kernel.php registriert. Das geschieht dadurch, dass Sie im Array $routeMidd-leware noch die Zeile

'ip.check' => \App\Http\Middleware\IpCheck::class,

ergänzen. Damit kennt die Anwendung den Shortcut ip. check, der die Middleware referenziert. Nun muss sie nur noch der Route zugewiesen werden:

Route::post('data/input' , 'DataController@save')-> middleware('ip.check');

Sobald das geschehen ist, prüft die Middleware vor jedem Speichern der Daten die IP des Clients.

Ein wirklich einfaches, gutes System, wie ich finde. Sie können der Methode middleware() übrigens auch mehrere Middlewares übergeben, die dann nacheinander abgear- ►
1. bash
X bash sei x # 962
Carstens -MBP-3:laravel carstenS php artisan route:list
1 Domin 1 Method [ URI I Name Action Middleware 1
1  1  1  1 1 GET1 HEAD 1 GET1 HEAD 1 POST 1 GET1 HEAD I api/user I I data/input I I data/input I I data/show I Closure  App\Http\Controllers\DataController@i nput App\Http\Control lers\DataCorrtroll eiiPsave App\Http\ControllersXDataController@show api,auth:api 1 web 1 web,ip.check 1 web 1
Carstens -MBP-3: laravel carstenS [|

Übersicht über die bekannten Routen (Bild 9)


beitet werden. Und bevor ich es vergesse: Eine Middleware kann auch nach dem Ausführen einer Methode noch eine Aufgabe übernehmen. Wollen Sie also beispielsweise nach jeder Aktion, die ausgeführt wurde, temporäre Daten löschen oder Ähnliches, dann können Sie das auf diesem Weg machen. In dem Fall müsste die Methode handle() nur etwas anders aussehen:

public function handle($request, Closure $next)

{

$response = $next($request);

// Vorhergenden Code ausführen // Temporäre Dateien löschen return $response;

}
Die Anwendung im Wartungsmodus (Bild 11)
Carstens-MBP-3:laravel carstenS php artisan inspire

Simplicity is the ultimate sophistication. - Leonardo da Vinci Carstens-MBP-3:laravel carstenS php artisan inspire Very little is needed to make a happy life. - Marcus Antoninus Carstens-MBP-3:laravel carstenS php artisan inspire Simplicity is an acquired taste. - Katharine Gerould Carstens-MBP-3:laravel carstenS php artisan inspire When there is no desire, all things are at peace. - Laozi Carstens-MBP-3:laravel carstenS []
Ein paar Zitate von artisan inspire (Bild 10)
Zu guter Letzt möchte ich noch auf ein Problem eingehen, das immer wieder auftaucht. Wenn Ihre Anwendung regelmäßig bestimmte Aufgaben erfüllen soll, dann können Sie das mit Hilfe eines Cron-Jobs erledigen. Sind Sie aber nicht der Server-Administrator, dann sind Sie ständig darauf angewiesen, dass er Ihren Cron-Job einträgt oder ändert. Abhilfe schafft da php artisan schedule:run. Diesen Befehl gibt man eigentlich nicht direkt auf der Kommandozeile ein. Er wird üblicherweise als Cron-Job ausgeführt, indem die folgende Zeile in der crontab ergänzt wird:

* * * * * php /pfad/artisan schedule:run >> /dev/null 2>&1
Sehr praktisch, wie ich finde - und sollten Sie Sorge haben, dass die web.php irgendwann zu undurchschaubar wird, können Sie sich mit php artisan route:list eine Übersicht der bekannten Routen ausgeben lassen, ohne den Code analysieren zu müssen (Bild 9).

Maintenance Mode mit artisan

Den Befehl artisan haben Sie ja nun schon in einigen Zusammenhängen getroffen. Der Befehl kennt aber noch eine ganze Menge mehr Möglichkeiten, die ich hier nicht komplett vorstellen kann. Auf ein paar Kleinigkeiten möchte ich aber noch eingehen.

Kommen Sie bei der Entwicklung Ihrer Applikation einmal gerade nicht weiter, dann ist php artisan inspire vielleicht hilfreich. Damit wird ein inspirierendes Zitat ausgegeben. Sicher nicht unbedingt das wichtigste Feature eines Frameworks, aber mal ganz nett (Bild 10).

Vielleicht kennen Sie das auch: Sie wollen bei einer Anwendung, die live ist, ein Update einspielen. Dummerweise hat aber niemand daran gedacht, einen Wartungsmodus zu implementieren, damit die Applikation auch einmal offline geschaltet werden kann.

Also versucht man mitten in der Nacht oder am Wochenende sein Glück und hofft, dass kein User verprellt wird. Laravel bringt hier schon von Haus aus eine Lösung mit: php artisan down schaltet die Anwendung in einen Maintenance Mode, und dem User wird eine entsprechende Meldung ausgegeben (Bild 11).

Für eine Änderung der ausgegebenen Meldung ist übrigens nicht der Parameter --message zuständig. Der legt nur fest, welche Information im Logfile gespeichert wird. Möchten Sie die Meldung für die Nutzer ändern, dann müssen Sie das Template 503.blade.php in resources/views/errors überarbeiten. Mit php artisan up schalten Sie die Anwendung übrigens wieder live.
Damit wird Laravels Scheduler jede Minute ausgeführt. In Ihrer Applikation können Sie nun Aufgaben registrieren, die mit einer bestimmten Regelmäßigkeit ausgeführt werden. Dazu sieht Laravel ein recht einfaches Interface vor, das Methoden wie daily(), weekly() oder monthly() bereitstellt. Auf diesem Weg können Sie Ihre Cron-Jobs aus der Anwendung heraus verwalten und müssen nicht jedes Mal den Server-Administrator bemühen. Weitere Informationen zum Scheduler finden Sie unter https://laravel.com/docs/5.3/scheduling.

Fazit

In einem solchen Artikel kann ein so mächtiges Framework natürlich nicht komplett vorgestellt werden, und daher musste ich eine ganze Menge Dinge unterschlagen. So schreibt Laravel automatisch ein Log, kennt einen Debug-Modus, bringt eine fertige User-Authentifizierung mit, hat vue.js als JavaScript-Bibliothek an Bord und vieles mehr.

Laravel ist an vielen Stellen erfrischend anders als die Konkurrenten. Die Entwickler hinterfragen Dinge, die von anderen Frameworks als Dogma übernommen werden, und machen sie anders und meiner Ansicht nach oft besser. Laravel ist schnell zu erlernen, klar strukturiert und lösungsorientiert. Besonders positiv finde ich, dass Laravel im Vergleich zu anderen Frameworks einfach ein Stück weit bodenständiger und nicht so akademisch abgehoben ist.
Carsten Möhrke

arbeitet seit 15 Jahren professionell im EDV-Um-feld. Er ist Inhaber der netviser Internet Beratung e.K. und als Internet-Programmierer, Dozent sowie Consultant tätig.  



You may also like

Keine Kommentare:

Blog-Archiv

Powered by Blogger.