Die MetaGer-Suchmaschine benutzt das PHP-Framework Laravel, welches auf dem MVC-Pattern basiert. Für weitere Informationen zum Framework siehe https://laravel.com/docs/5.4/
Zu Beginn sollten die anderen Artikel des Wikis vollständig durchgelesen werden, sowie die [Schritte zum Aufsetzen einer MetaGer-Entwicklungsumgebung] (https://gitlab.metager3.de/open-source/MetaGer/wikis/aufsetzen-einer-metager-entwicklungsumgebung) vollständig ausgeführt werden.
Wie im wiki zu lesen ist, bietet die Datei /app/routes/web.php
einen guten Einstiegspunkt, um nachzuvollziehen, was beim Aufruf einer bestimmten URL passiert. An dieser Stelle kümmert sich das Laravel-Framework darum, dass HTTP-Anfragen an entsprechende PHP-Methoden in den Controller-Klassen unter app/http/controllers weitergeleitet werden.
Diese Controller-Klassen müssen Unterklassen des Laravel-Controllers sein.
Hier wird die Anfrage dann bearbeitet und je nach Aufgabe des Controllers beispielsweise die nächste HTML-Seite generiert, auf welche der Benutzer weitergeleitet werden soll.
Die in der web.php angegebenen Controller-Methoden erhalten dabei jeweils die eingehende HTTP-Anfrage als Request-Objekt $request, und verwenden dieses um bspw. Benutzereingaben zu verarbeiten. Außerdem können hier weitere (optionale) Parameter angegeben werden.
Mehr zum (Laravel-)Routing gibt es hier.
Beispiel 1
Einträge in der 'web.php' sehen beispielsweise so aus:
Route::get('zitat-suche', 'ZitatController@zitatSuche');
Gibt ein Nutzer nun die URL http://metager.de/zitat-suche in die Adressleiste seines Browsers ein, so wird eine HTTP-GET Anfrage an die MetaGer-Server versendet, wo diese dann an die Methode zitatSuche
in der Klasse ZitatController
weitergeleitet wird.
Diese überprüft, ob bereits vom Benutzer eine Zitatsuchanfrage gesendet worden ist. Falls nein, bekommt der Nutzer die Zitatsuchmaske angezeigt.
Andernfalls wird mit der eingegebenen Suchphrase nach entsprechenden Ergebnissen gesucht und eine HTML-Seite mit den Suchergebnissen generiert und zurückgegeben.
Dafür werden die vom Laravel-Framework stammenden Blade-Templates verwendet. Blade-Templates sind Dateien, welche zu einem großen Teil aus Standard-HTML bestehen und darüber hinaus die Möglichkeit bieten, mit PHP-Anweisungen Informationen dynamisch darzustellen.
Im obigen Beispiel vervollständigt die Methode zitatSuche
das Blade-Template /resources/views/zitatsuche.blade.php
zu einer HTML-Datei, indem die einzusetzenden
Variablen von der Methode weitergereicht werden.
Im Template ist die Zeile
<h3>Ergebnisse für die Suche "{{$q}}":</h3>
vorhanden. In den geschweiften Klammern befindet sich der PHP-Code, welcher ausgeführt wird, bevor der Nutzer die Seite zu Gesicht bekommt. Außerdem sorgen die geschweiften Klammern dafür, dass der Inhalt der Klammern vorher von der PHP-eigenen htmlspecialchars
Funktion verarbeitet wird, um keine Sicherheitslücke für Angriffe zu bieten.
Die Rückgabe der zitatSuche
-Methode des ZitatController
würde also in diesem Fall die Variable $q
(die Suchanfrage) an das Template weitergeben. Laravel kümmert sich dann darum,
dass diese an der richtigen Stelle eingesetzt wird. Die Rückgabe der Methode sieht dabei so aus:
return view('zitatsuche')
->with('title', 'Zitatsuche MetaGer')
->with('navbarFocus', 'dienste')
->with('results', $validResults)
->with('q', $request->input('q', ''));
Insbesondere die letzte Zeile ist für dieses Beispiel interessant. Dabei wird an view('zitatsuche')
(dem Template) mit der Anweisung
->with('q', $request->input('q', '')
die Suchanfrage aus der vorherigen HTTP-Anfrage ausgelesen und in die HTML-Datei eingefügt.
Beispiel 2
Eintrag in der web.php
Route::get('kontakt', function () {
return view('kontakt.kontakt')
->with('title', trans('titles.kontakt'))
->with('navbarFocus', 'kontakt');
});
Sobald der Nutzer die Seite http://metager.de/kontakt aufruft, trifft eine HTTP-GET Anfrage bei den MetaGer-Servern ein.
Im Gegensatz zum ersten Beispiel wird hier keine Methode einer Controller-Klasse angegeben. Stattdessen ist die Funktion, welche ausgeführt werden soll
direkt im Argument dieses Route::get
-Aufrufs angegeben. Dabei wird das Blade-Template /resources/views/kontakt/kontakt.blade.php
mit den Informationen im return
ergänzt und zurückgegeben.
Sollte der Nutzer nun eine Kontaktanfrage versenden, so geht diese in Form einer HTTP-POST Anfrage bei den MetaGer-Servern ein.
Der dazugehörige Eintrag in der web.php
lautet
Route::post('kontakt', 'MailController@contactMail');
Diese Anfrage beinhaltet die vom Benutzer eingegebenen Informationen, wie etwa seine E-Mail-Adresse und die eigentliche Nachricht.
In der Klasse MailController
wird die Anrage von der Methode contactMail
verarbeitet und der Benutzer auf eine Seite weitergeleitet, welche je nach Inhalt der Nachricht den Versand bestätigt bzw. den Benutzer um die richtige Eingabe der Daten bittet:
if (!$request->has('message')) {
$messageType = "error";
$returnMessage = "Tut uns leid, aber leider haben wir mit Ihrer Kontaktanfrage keine Daten erhalten. Die Email wurde nicht versand";
} else { /* Versand der E-Mail sowie setzen des Bestätigungsstrings */}
return view('kontakt.kontakt')
->with('title', 'Kontakt')
->with('js', ['openpgp.min.js', 'kontakt.js'])
->with($messageType, $returnMessage);
Hier klicken für mehr Informationen zu Blade-Templates.
Diese Einführung wurde erstellt von Aria Givi. Bei weiteren Fragen einfach eine E-Mail an aria@suma-ev.de senden.