Laravel Anfänger Tutorial #01 zum mitmachen für dich
Hallo und herzlich Willkommen zu meinem Laravel Anfänger Tutorial. Das Tutorial ist in knapp drei Tagen entstanden. Ich kenne mich mit einigen PHP Frameworks aus, aber Laravel ist auch für mich neu. Daher finde ich es toll, dass wir gemeinsam die ersten Schritte mit Laravel machen können.
Inhaltsverzeichnis
Für wen ist dieses Tutorial?
Fall du dich schon einige Zeit mit PHP beschäftigst und vielleicht auch schon die eine oder andere kleine Anwendung entwickelt hast, dann ist das Tutorial genau richtig für dich. Ich werde nicht mehr auf die PHP Grundlagen eingehen und auch Objektorientierte Entwicklung sollte für dich kein Fremdwort sein.
Falls du eine Einführung in PHP benötigst, dann empfehle ich dir die Codecademy oder PHP Tutorial.
Die Projekt Dateien habe ich für dich in ein Github Projekt geladen. Hier kannst du dann den Code nachvollziehen. Laravel Tutorial Github Projekt.
Update 26.07.2015
Einige Teile habe ich mittlerweile überarbeitet. Der HomeController wurde in PageController umbenannt. Die Einbindung der Service Provider für das Zusatzpaket der Form Tags hat sich geändert.
Update 13.02.2015
Ich habe das Tutorial heute auf Laravel 5 angepasst. Da die Tutorial Serie noch relativ jung ist, ist es jetzt genau richtig umzuschwenken auf die aktuellste Version.
Über einen Kommentar am Ende des Tutorials würde ich mich wirklich freuen. Sowohl Kritik als auch Lob ist gerne gesehen. So kann ich das Tutorial auch immer weiter verbessern.
Aber genug der langen Rede. Jetzt viel Spaß!
Download und Installation von Laravel
Den Download übernimmt das Tool Composer für dich. Hast du es noch nicht installiert, dann folge mir einfach. Bei mir fehlt es in der Umgebung in der ich jetzt entwickle auch noch. Daher könnten wir das kurz zusammen machen.
Falls der Befehl composer
bei dir auf der Konsole bereits funktioniert kannst du die Composer Installation einfach überspringen.
Composer Installation für Mac OS
Am besten installierst du Composer global damit es überall aufrufbar ist. Dazu einfach den Download in irgendeinem Verzeichnis durchführen. Das kann auch ein Temp Verzeichnis sein.
Mit curl -sS https://getcomposer.org/installer | php
auf der Konsole lädst du Composer in das Verzeichnis. Danach mit mv composer.phar /usr/local/bin/composer
global verfügbar machen.
Kurz noch composer
in der Konsole ausführen und die Ausgabe überprüfen. Siehst du jetzt die verfügbaren Composer Befehle, dann läuft Composer bei dir. Prima.
Composer Installation für Windows
Unter Windows ist die Installation entsprechend einfach. Lade dir einfach die Composer-Setup.exe runter und starte mit einem Doppelklick. Die Installation ist relativ schnell durch. Danach ist der Befehl composer von überall aus aufrufbar.
Um die wirklich aktuellste Composer Version zu bekommen rufe kurz composer self-update
auf. Nun ist alles top aktuell.
Da du Composer jetzt installiert hast und die Installation unter Mac OS und Windows sehr einfach ist, brauchst du nur noch Laravel mit Composer runterladen und installieren.
Dazu gehst du in der Konsole in das Verzeichnis in dem das neue Projekt initialisiert werden soll. Du brauchst vorher kein Verzeichnis anzulegen. Das macht Composer für dich.
Auf der Konsole gibst du einfach composer create-project laravel/laravel demolaravel --prefer-dist
ein und es wird für dich ein neues Verzeichnis demolaravel erstellt. Dort sind jetzt die Laravel Projektdateien drin. Du kannst das Verzeichnis natürlich auch anders benennen.
Nach der Laravel Installation erscheint am Ende eine Meldung wie Application key [GxEpG8NNYbHIGNSVNwvQmiJf4nFJ2M1p] set successfully. Wenn du das siehst, dann scheint alles funktioniert zu haben. Toll!
Das Laravel Kommando Tool Artisan kann den ab PHP 5.4 integrierten Webserver nutzen. Dazu gehst du in das Laravel Projekt Verzeichnis demolaravel. Jetzt kannst du mit php artisan serve
den Webserver starten.
Aufruf der Demo Seite
Wenn du jetzt im Browser die angegebene Adresse eingibst, in der Regel wird das Laravel http://localhost:8000 sein, dann hast du die Installation erfolgreich überstanden.
Bis zu diesem Punkt unterscheiden sich Laravel 4 und Laravel 5 nicht. Die Installation mit Composer ist exakt die gleiche.
Bekommst du beim Aufruf einen Fehler, dann kann das an fehlenden Dateirechten liegen. Dazu einfach die Verzeichnisse storage/logs und storage/framework mit Schreibrechten versehen.
Layout mit Twitter Bootstrap erstellen
Der Master Branch von Laravel auf Github unterscheidet sich in einigen Teilen von der Release Version. Daher ist es mir in der ersten Version des Tutorials passiert, dass ich eine app.blade.php beschrieben habe, die aber gar nicht vorhanden ist. Auch habe ich in einer Version Teile von Twitter Bootstrap gesehen. Auch dies ist in dem Release, welches wir über den Composer ziehen, nicht vorhanden.
Auf jeden Fall setze ich in diesem Tutorial auf Twitter Bootstrap als Framework für das Layout. Mit Twitter Bootstrap ist es sehr einfach ein Responsive Layout zu erstellen ohne viel rumfummeln zu müssen. Später kannst du auch dein eigenes HTML verwenden oder ein anderes HTML / CSS Framework. Twitter Bootstrap bietet aber auch eine gute Grundlage für eigene Designs.
Wir brauchen für unser Grundlayout aber noch eine Datei aus dem Live Twitter Bootstrap Projekt. Dazu lädst du Bootstrap am besten von der offiziellen Seite runter. Klick hier den Button „Download Source“ an. Die Source Version enthält alle Beispieldateien, die du gleich noch brauchen wirst für das Grundlayout.
Im Ordner docs/examples von Twitter Bootstrap sind die Beispiel Layouts. Später kannst du diese Layouts als Startlayout für dein eigenes benutzen. Da wir das Tutorial zusammen durcharbeiten, nehmen wir das Layout aus dem Ordner sticky-footer-navbar. Das ist ein ganz ansprechendes Layout und für unsere Zwecke ausreichend.
Kopiere die sticky-footer-navbar.css aus dem Ordner in dein Laravel Projekt und lege sie dort unter /public/css ab. Jetzt benenne sie noch in style.css um.
In Laravel 5 ist bereits alles auf die Nutzung der Template Engine Blade ausgerichtet. Blade ist auch in älteren Laravel Versionen vorhanden. Die Beispiel Anwendung, die man direkt nach der Installation sieht, ist erst seit Laravel 5 mit der Blade Engine erstellt worden.
Damit erspart uns Laravel einiges an Arbeit, die mit der Version 4 noch notwendig war.
Unsere Layout Datei liegt in /resources/views und heißt /resources/views/welcome.blade.php. Wenn du Laravel 4 kennst, dann wirst du hier bereits einen Unterschied merken. Die Views lagen in älteren Versionen unter /app/views. Dies hat man jetzt voneinander entkoppelt.
In dem Ordner /resources/views lege ich die Datei app.blade.php an. Das ist das Grundlayout. Diese Abtrennung ist vor allem sinnvoll, wenn ich später noch weitere Layouts habe. Zum Beispiel wäre ein eigenes Layout für die Administration eine gute Idee.
Den Inhalt der /resources/welcome.blade.php lösche ich und füge in die erste Zeile
@extends('app')
ein. Damit weiß die View, dass es eine Layout Datei gibt. Danach kopiere ich den Inhalt der index.html aus dem Bootstrap Ordner sticky-footer-navbar in die /resources/views/app.blade.php. Die Vorlange findest du in den runtergeladenen Bootstrap Dateien in /docs/sticky-footer-navbar/index.html.
Als nächstes lagere ich den individuellen Seiteninhalt aus. Dazu kopiere ich aus der /resources/views/app.blade.php den Inhalt des container DIV die /resources/views/welcome.blade.php. Aber nur den Inhalt des DIV und nicht das DIV selbst.
Vor dem gerade kopierten Inhalt füge ich in die /resources/views/welcome.blade.php noch
@section('content')
. Nach dem Inhalt füge ich
@yield('content')
einfügen und zwar in das container DIV, aus dem wir den Inhalt ja verschoben haben.
Was jetzt noch fehlt, sind die Twitter Bootstrap CSS, JS und Font Dateien. Die findest du im Download Ordner unter /docs/dist. Damit ich die Bootstrap Sachen von dem Rest getrennt habe, erstelle ich einen Ordner /public/bootstrap. Dort kopiere ich den kompletten dist Ordner rein. In einem späteren Tutorial werde ich auch noch auf das Arbeiten mit Less eingehen, aber für den Anfang reicht das jetzt hier mal aus.
Damit unsere Anwendung die Dateien auch findet, sind ein paar Anpassungen in der /resources/views/app.blade.php notwendig. Und zwar ersetzen wir dort alle Vorkommen von ../../dist/ mit /bootstrap/dist/.
Als letzten Schritt, bevor wir uns unsere Seite mal wieder anschauen, muss ich noch mein eigenes CSS einbinden. Ich hatte ja am Anfang die sticky-footer-navbar.css als style.css gespeichert. Hier sind noch ein paar Informationen drin, die noch eingebunden werden müssen. Dazu öffen ich die /resources/views/app.blade.php und füge direkt nach Anweisung zum Einbinden des Bootstrap CSS, die Anweisung für unsere style.css ein.
Jetzt können wir endlich mal wieder unsere Webseite betrachten und neu laden. Jetzt solltest du die Änderungen ohne Fehlermeldungen sehen können. Was noch fehlt, ist
Beginnen wir mit den Vorbereitungen auf mehr Inhalt. Dazu fügen wir unseren ersten eigenen Controller hinzu. Dazu lege ich die Datei /app/Http/Controllers/PageController.php an. Der Inhalt sieht folgendermaßen aus:
Ich habe jetzt die Methode, die eine View aufruft. Damit dies geschehen kann, muss ich noch das Routing entsprechend ändern. Dazu öffne ich /app/Http/routes.php.
Hier existiert bereits eine Route für die Startseite. Hier wird bisher nur die View welcome aufgerufen. Diese Route lösche ich und füge die eine neue Route ein.
Route::get('/', 'PageController@index');
Der Umbau des ersten Teils dieses Tutorials auf Laravel 5 ging sehr einfach von der Hand. Da sich die Ordnerstruktur etwas geändert hat, musste ich etwas suchen. Durch die Integration von Twitter Bootstrap konnte ich einigen Text rauswerfen. Leider hatte ich zwischenzeitlich eine Master Version ausprobiert, die bereits Twitter Bootstrap integriert hatte. Dadurch wurde des Tutorial ein wenig unschlüssig. Das ist jetzt aber behoben.
Typische Seiten wie Startseite, Impressum und Kontaktseite erstellen
Bisher kannst du nur die Standard Seite von Laravel sehen. Das zeigt jetzt noch nicht ganz so viel davon was das Framework eigentlich kann. Das hättest du mit HTML viel schneller hinbekommen. Also schauen wir uns mal an wie du weiter vorgehen kannst.
Zuerst solltest du Laravel per Konfiguration mitteilen in welcher Umgebung gerade gearbeitet wird. Da du lokal entwickelst, ist local die richtige Umgebung. Durch setzen der richtigen Umgebung bekommst du die Möglichkeit verschiedene Einstellungen zu laden abhängig davon ob es sich um ein Entwicklungssystem, ein Test System oder ein Live System handelt. Vielleicht hast du sogar noch ein Staging System, dann hättest du insgesamt vier Umgebungen.
Nach der Installation mit Composer ist bereits local als APP_ENV eingestellt. In Laravel 5 unterscheidet sich die Erkennung grundsätzlich von den Vorgängerversionen. Hier gibt es im Root Verzeichnis des Projekts eine .env Datei in der spezifische Einstellungen drin stehen. Die Einstellungen in der .env Datei werden direkt in die Umbebungsvariablen geladen und sind somit nicht im Code vorhanden. Alle wichtigen und sensiblen Konfigurationsdaten sind in dieser einen .env Datei.
Diese Umgebungsvariablen können wir mit env('APP_DEBUG')
auslesen. Man merkt an vielen Stellen, dass sich die Entwickler sehr viele Gedanken gemacht haben und vieles sehr gut gelöst ist.
In die /config/app.php fügst da an das Ende bitte 'name' => 'Laravel Anfänger Tutorial'
Damit können wir gleich den Namen der Anwendung auf der Webseite anzeigen. Dazu gehst du in /resources/views/app.blade.php und fügst an die Stelle an der jetzt noch Project name steht <?php echo Config::get('app.name')?>
ein.
Jetzt kannst du die Webseite wieder aufrufen. Wenn alles geklappt hat, dann siehst du jetzt anstatt "Project Name" deinen vorher eingegebene Namen. Super!
Werbung

Nachdem wir jetzt die Minimal Konfiguration durchgegangen sind, kümmern wir uns jetzt um das Menü bzw. die Navigation.
Idealerweise lagern wir die Navigation aus und damit machen wir jetzt auch weiter.
Erstell im Verzeichnis /resources/views die navigation.blade.php. Dort fügst du alles aus der /resources/views/app.blade.php was unter dem <div> mit der id navbar steht. Also das komplette <ul>. In der app.blade.php steht dann an dieser Stelle @include('navigation'). Schau dir die Webseite an ob das Menü noch angezeigt wird. Falls ja, dann hat alles geklappt.
Jetzt können wir die navigation.blade.php ändern, damit sie auf unsere Bedürfnisse angepasst ist.
Entferne dazu alle <li> unter dem <ul>. Wir starten hier mit einer leeren Navigation, die wir jetzt befüllen.
Wenn du die Webseite jetzt aufrufst, dann müsstest du die neue Navigation sehen und auch auf die einzelnen Punkt klicken können. Dahinter liegt jetzt noch nichts, aber das ändern wir ja gleich direkt.
Du könntest jetzt für jeden Menüpunkt einen eigenen Controller einrichten. Das macht hier aber kaum Sinn bei einem so kleinen Projekt.
An dieser Stelle können wir uns entscheiden ob wir alle Methoden in den Home Controller packen oder direkt im Routing schon verarbeiten. Die Verarbeitung im Routing macht immer dort Sinn, wenn nicht zusätzliche Aufrufe zum Beispiel zu einer Datenbank notwendig sind. Ich erstelle in diesem Tutorial alle Methoden oder Actions im Home Controller.
Wir kommen in einem späteren Tutorial bestimmt wieder auf diese Vorgehensweise zu sprechen und dann gibt es noch die eine oder andere Möglichkeit, die ich vorstellen möchte.
Ok, also öffnen wir den Home Controller in /app/Http/Controllers/PageController.php. Hier siehst du bereits die index Methode. In unserem Routing haben wir für / genau diesen Controller mit dieser Methode angegeben. Die Anweisung sagt, dass hier jetzt aus dem /resources/views/ die home.blade.php gerendert werden soll. Natürlich passiert im Hintergrund noch etwas mehr, aber das soll uns jetzt erstmal reichen.
In dem Home Controller fügst du jetzt zwei weitere Actions hinzu. Und zwar impressum und kontakt. Du kannst dich dabei an der index Action orientieren.
Der komplette PageController.php sollte jetzt in etwa so aussehen
Die Kommentare habe ich entfernt. Vorsicht Klugscheisser! - Du solltest deinen Quellcode immer dokumentieren 🙂
Jetzt legen wir noch schnell die Views an. Dazu legst du unter /resources/views zwei neue Dateien an. Und zwar die impressum.blade.php und die kontakt.blade.php. Du kannst ja zur Überprüfung in die Datei jeweils etwas unterschiedliches rein schreiben.
Damit die Actions aufgerufen und die Views gerendert wird müssen wir noch das Routing erweitern. Dies machen wir in der /app/Http/routes.php. Dort fügst du einfach
Route::get('/impressum', 'PageController@impressum');
Route::get('/kontakt', 'PageController@kontakt');
ein.
Wenn du jetzt die Seite Impressum oder Kontakt aufrufst, dann wirst du sicherlich enttäuscht sein. Kein Layout und es steht nur das drin, was du selbst eingetragen hast. Das liegt daran, dass in der app.blade.php Layout Datei der Content Bereich durch @yield('content') gekennzeichnet ist. Das haben wir in den neuen Views aber noch nicht berücksichtigt.
Daher ändere den Inhalte der impressum.blade.php und kontakt.blade.php in
@extends('app')
@section('content')
Impressum
@endsection
Für die Kontaktseite dann entsprechen in Kontakt in der Content Section. Wenn du jetzt die beiden Seiten aufrufst, dann sollte der Inhalte auch angezeigt werden.
Puh. Pause gefällig? Geht mir auch so. An diesem Tutorial sitze ich jetzt etwa an zwei Abenden. Eigentlich dachte ich, dass ich schneller damit durch wäre, aber gerade im Detail dauert es etwas länger.
Update 13.02.2015
Und ich investiere noch etwas mehr Zeit, da ich jetzt alles auf Laravel 5 umbaue. Das passt aber ganz gut, weil das Release jetzt gerade erst raus ist und wir somit direkt mit dem neuen Version beginnen können.
Ich hoffe du bist noch bei mir.
An der Startseite und an der Impressum Seite machen wir jetzt nichts mehr zusammen. Diese beiden Seiten beinhalten nur Text als Inhalt. Wichtiger ist daher die Kontaktseite. Das ist auch der nächste Punkt.
Kontaktformular einbauen
Für das Kontaktformular habe ich das HTML schon vorgebaut. Dies ist auch relativ unspektakulär.
@extends('app')
@section('content')
Kontakt
@if ( $errors->count() > 0 )
Leider sind folgende Fehler aufgetreten:
@foreach( $errors->all() as $message )
- {{ $message }}
@endforeach
@endif
@if (Session::get('sendsuccess'))
Wir haben Ihre Nachricht erhalten. Vielen Dank dafür!
@endif
{!! Form::open(array('action' => 'PageController@kontakt', 'method' => 'post', 'class' => 'form-horizontal')) !!}
{!! Form::label('email', 'E-Mail Adresse', array('class' => 'col-sm-2 control-label')) !!}
{!! Form::text('email', '', array('class' => 'form-control', 'placeholder' => 'Deine E-Mail Adresse')) !!}
{!! Form::label('message', 'Nachricht', array('class' => 'col-sm-2 control-label')) !!}
{!! Form::textarea('message', '', array('class' => 'form-control', 'placeholder' => 'Deine Nachricht')) !!}
{!! Form::submit('NACHRICHT ABSENDEN', array('class' => 'btn btn-default')); !!}
{!! Form::close() !!}
@endsection
In Laravel 5 hat sich auch an der Formularerstellung einiges getan. Zum einen werden die Form Tags jetzt mit {!! gestartet und nicht mehr mit {{. Zusätzlich wurden das Paket aus dem Laravel 5 Core entfernt. Allerdings ist es noch als zusätzliches Paket erhältlich und kann mit Composer installiert werden.
Dazu einfach in der composer.json im require Bereich "illuminate/html": "~5.0" einfügen. Danach ein composer update ausführen und das Paket wird installiert. Zusätzlich müssen die neuen Provider noch in der Application registriert werden. Dies geschieht in der /config/app.php. Dort einfach in das providers Array am Ende
Illuminate\View\ViewServiceProvider::class,
Illuminate\Html\HtmlServiceProvider::class
einfügen. Und in das alias Array muss noch
'Form' => Illuminate\Html\FormFacade::class,
'HTML' => Illuminate\Html\HtmlFacade::class'
rein.
Du kannst jetzt die Seite aufrufen, deine E-Mail Adresse und einen Text eintragen und auf "NACHRICHT ABSENDEN" klicken.
Ups! Ja, ich weiss. Fehlermeldung ole.
Obwohl in der Adressleiste des Browsers /kontakt steht und das ja eigentlich funktioniert, bekommen wir eine Fehlerseite zu sehen. Das liegt daran, dass das Routing von Laravel zwischen GET und POST unterscheiden kann und es auch tut. Damit ist es möglich die Requests sauber zu trennen.
Daher musst du in der /app/Http/routes.php einen neuen Eintrag
Route::post('/kontakt', 'PageController@sendkontakt');
hinzufügen. Was jetzt noch fehlt ist die Action sendKontakt im Home Controller. Also in der /app/Http/Controllers/PageController.php eine neue Action einfügen mit dem Namen sendkontakt In dieser Action müssen wir die Verarbeitung des Formulars vornehmen.
Füge nun am Anfang der neuen Methode sendKontakt das Array mit den Validator Regeln ein
$rules = array(
'email' => 'Required|Between:3,64|Email',
'message' => 'Required'
);
Die Array Keys email und message sind die Namen aus dem Formular. Die Validator Regeln sind selbstsprechend hoffe ich.
- Required = Muss aufgefüllt werden
- Between 3,64 = Muss zwischen 3 und 64 Zeichen lang sein
- Email = hier wird der Wert darauf geprüft ob er vom Typ E-Mail ist
Als nächstes müssen wir den Validator aufrufen mit $validator = Validator::make(Input::all(), $rules);
Mit Input::all() werden alle Parameter aus dem Request geholt und mit den Regeln an den Validator übergeben.
Jetzt müssen wir noch prüfen ob die Regeln mit den übergebenen Werte übereinstimmen.
if($validator->passes()) {
echo 'hat geklappt';
} else {
echo 'hat nicht geklappt';
}
exit;
Du kannst jetzt mal die Webseite neu laden und auf die Kontakt Seite gehen. Füll zuerst nichts aus und klick trotzdem auf "NACHRICHT VERSENDEN". Jetzt noch mal mit richtigen Daten, also einer korrekten E-Mail Adresse und etwas Text. Fein, sollte funktionieren.
Viel Sinn ergibt das natürlich immer noch nicht.
Daher gehen wir erst den Fall des Scheiterns durch. Dazu entfernst du die Zeile echo 'hat nicht geklappt';
und ersetzt dies durch return Redirect::action('PageController@kontakt')->withInput()->withErrors($validator);
Damit wird ein Redirect auf die kontakt Route im Home Contorller ausgeführt und die Fehlermeldungen werden gleich mit übergeben.
Um zu sehen welche Fehler aufgetreten sind, müssen wie diese noch in die View rendern. Daher die /resources/views/kontakt.blade.php öffnen und unter die <h1>
@if ( $errors->count() > 0 )
Leider sind folgende Fehler aufgetreten:
@foreach( $errors->all() as $message )
- {{ $message }}
@endforeach
@endif
einfügen und schon erscheinen die Fehlermeldungen, wenn du das Formular abschickst mit ungültigen Eingaben.
Jetzt werden die Fehlermeldungen in Englisch ausgegeben und Laravel bringt von Haus aus auch keine deutschen Übersetzungen mit. Das sehe ich allerdings nicht als großes Problem, da auch in anderen PHP Frameworks die deutschen Übersetzungen eher gruselig sind. Auch die englischen Ausgaben sind alles andere als schön. Du als Entwickler einer neuen Anwendung solltest daher von Anfang an auf eigene Fehlerausgaben setzen.
Wir lassen die Sprache jetzt wie sie ist. Ich werde in einem späteren Tutorial oder eines Kurztipps bestimmt wieder darauf eingehen. Uns stört das jetzt nicht, denn wir haben mit dem zweiten Fall, also der erfolgreichen Validierung noch genug zu tun.
Mail Versand über das Kontaktformular
Den Fall, dass das Kontaktformular nicht richtig ausgefüllt wurde haben wir jetzt abgeschlossen. Nun kommen wir zum Erfolgsfall, also die korrekte Eingabe aller Formularfelder, Versand einer E-Mail mit den Werte aus dem Formular und Anzeige einer Erfolgsmeldung. Wenn wir das haben, dann ist das Laravel Anfänger Tutorial auch schon abgeschlossen.
In der PageController.php ersetzen wir echo 'hat geklappt';
durch
Mail::send('emails.kontakt.default', array('data' => Input::all()), function($message)
{
$message->from('info@dirk-helbert.de', 'Laravel Anfänger Tutorial');
$message->to('info@dirk-helbert.de', 'Dirk Helbert')->subject('Nur ein Test!');
});
return Redirect::action('PageController@kontakt')->with('sendsuccess',1);
Die View für die E-Mail wird mit emails.kontakt.default angegeben. Daher liegt sie unter /resources/views/emails/kontakt/default.blade.php. Der Inhalt sieht entsprechend spartanisch aus
Hallo lieber Interessent,
vielen Dank für Ihre E-Mail an uns. Wir werden diese so schnell wir möglich beantworten.
----
Das war Ihre Nachricht:
{{ $data['message'] }}
----
Mit freundlichen Grüßen,
Ihr Laravel Anfänger Tutorial Team
In die /resources/views/kontakt.blade.php fügst du jetzt direkt nach dem <h1>
@if (Session::get('sendsuccess'))
Wir haben Ihre Nachricht erhalten. Vielen Dank dafür!
@endif
ein.
Das war es fast. Du solltest in der /config/mail.php noch mail oder sendmail als driver für den E-Mail Versand setzen. Kurz noch prüfen ob die E-Mail auch wirklich ankommt, falls dein System dafür ausgelegt ist.
Wir sind durch. Juchu!
Update 13.02.2015
Das Update des Tutorials auf Laravel 5 hat auch gut funktioniert. An einigen Stellen musste ich mir die Dokumentation oder auch in den Quellcode schauen. Ich denke es lohnt sich jetzt direkt mit Laravel 5 weiterzumachen.
Vielen Dank für deine Aufmerksamkeit. Mir hat es viel Spaß gemacht durch dieses Anfänger Tutorial zu führen. Ich hoffe du konntest ein wenig davon mitnehmen. Einige Sachen wie Datenbankzugriffe, Artisan CLI und Caching habe ich bewusst raus gelassen. Ich denke aber, dass ich jetzt noch mehr Tutorials über und mit Laravel schreiben werde.
Falls du einen Fehler gefunden hast, Lob oder Kritik loswerden möchtest, dann nutze bitte die Kommentarfunktion. Vielen Dank!
Ich würde mich freuen dich auch beim nächsten Mail wieder begrüßen zu dürfen.
Hi,
erstmal – ich find es großartig, dass sich jemand die Mühe macht, für laravel Tutorials zu schreiben. Und erst Recht, dass Du das so ausführlich tust. Ich bin selbst eher PHP-Amateur und habe aus Deinen Tutorials einiges gelernt. Wenn ich zwei Bemerkungen anbringen darf:
– Hilfreich wäre ne Gliederung mit noch Zwischenüberschriften, d.h. das Du die Anfänger-Tutorials gliederst in das, was Du gerade tust. Gerade bei den Anfängertutorials kapiert man klar, was Du tust, aber selten, warum diese oder nicht eine andere Lösung gewählt wurde (z.B. benötigt man ja für die statischen Seiten wie Home, Impressum und Kontakt keine Controller, sondern könnte einfach in der routes.php eine entsprechende Zeile anlegen).
– Der zweite Punkt hängt mit dem ersten zusammen: Strukturierter Erklären wäre total hilfreich, und am Besten entlang der einzelnen Bestandteile von Laravel (also
1. was ist denn MVC (ganz kurz)
2. Laravel Konventionen (was für Folder gibts nach der Installation)
3. was ist Routing und wie geht das
4. Was ist Blade und wozu nimmt man das
5. Wie schreibt man Controller und warum
6. Was macht man mit Models und
7. Wie kriegt ich zeug in ne Datenbank (Eloquent etc)
Sorry, wenn ich Dich damit so zutexte… Wie gesagt, ich bin sehr glücklich, dass es überhaupt Laravel-Tutorials auf Deutsch gibt, und Dir sehr dankban!
Grüße!
Hi Wolf,
vielen Dank für deine konstruktive Meinung. Ich bin auf Feedback der Leser des Tutorials angewiesen und froh das du dich dazu entschlossen hast.
Ich werde mir das auf jeden Fall zu Herzen nehmen und die Tutorials anpassen, falls es nötig ist.
Gerade im Anfänger Tutorial wollte ich bewusst nicht sehr in die Tiefe gehen. Es ist auch immer schwer abzuschätzen welche Vorkenntnisse meine Leser haben werden. Diese erste Tutorial Serie ist auch für mich ein Pilotprojekt in Sachen Laravel. Am Ende dieses Tutorials wird „Oh Wunder“ ein Blog stehen. Sobald das durch ist, werde ich das komplette Tutorial überarbeiten und alle Anregungen und Fragen aufgreifen.
Einige deiner Punkte sind auch keine Laravel spezifischen Themen. Punkt 1, 3, 5 und 6 sind allgemeine Entwickler Themen, die ich aber in einem Vorab Beitrag hätte verarbeiten können und sollen.
Den zweiten Punkt hätte ich bereits im Anfänger Tutorial einfliessen lassen können und wollte ich ursprünglich auch. Aber dann habe ich mir gedacht, dass wenn jemand alle Tutorials bis zum Ende durcharbeitet so viel mitbekommen hat, dass eine Einführung in die Struktur nicht nötig ist. Zumindest war das mein Gedanke dahinter.
Zu den Themen 4 und 7 sind bereits weitere Tutorials geplant in dieser Serie. Ich habe noch so einige Themen, die ich, wenn es geht, wöchentlich jeweils Anfang der Woche live schalten werde.
Also wie du siehst, es wird sich noch was tun in nächster Zeit 🙂
Ich kann dir nur nochmals herzlich Danken, dass du den Schritt getan hast und deine Meinung zum Tutorial abgegeben hast. Das hilft mir wirklich sehr.
Viele Grüß,
Dirk
Auch von mir zunächst großes Lob für Deine Mühen, das alles so detailliert zu beschreiben. Ich selbst bin zwar kein PHP-Laie, aber als Drupal- bzw. CodeIgniter-Entwickler ein Laravel-Neuling.
Hier nun meine Anmerkungen zum Beitrag, also die konstruktive Kritik, die mir bei der parallelen Arbeit mit Laravel 5.0.16 aufgefallen ist:
Beim Einbinden der CSS-Datei aus dem Bootstrap Theme, findet sich die Zeile
<link href="/css/app.css" rel="stylesheet">
nicht mehr. Stattdessen steht da nun
<link href="{{ asset('/css/app.css') }}" rel="stylesheet">
Das lässt sich natürlich noch gut erkennen und umsetzen, wollte ich der Vollständigkeit halber aber melden.
Beim Auslagern der Navigation kopiert man die
navbar
natürlich aus /resources/views/app.blade.php und nicht aus /app/views/layouts/main.blade.php. Und@include(‘navigation’)
gehört in die app.blade.php (statt navigation.blade.php).Beim Einbau des Kontaktformulars ist dann einiges nicht ganz korrekt. Zuerst müsste es im vorbereiteten Code-Block in der ersten Zeile statt
@extends('layouts.main')
einfach@extends('app')
heißen.Danach komme ich leider erst einmal ins Stocken. Die Zeile
$validator = Validator::make(Input::all(), $rules);
führt bei mir zu einem Fehler: Class ‚WI\Http\Controllers\Validator‘ not found
Dabei ist anzumerken, dass ich mittels
php artisan app:name WI
meinen Namespace geändert hatte. Das mag daran liegen oder ein Relikt von Laravel 4 sein, das kann ich (noch) nicht beurteilen.Ich werde das Tutorial auf jeden Fall im Auge behalten, evtl. kannst Du mir sogar mit meinem Fehler weiter helfen? Bzw. wie kann ich den Namespace auf den Standard zurücksetzen, falls das die Ursache sein sollte?
Schönen Gruß
Paul
Hi Paul,
vielen Dank für das Lesen, das Lob und die Hinweise. Feedback ist immer super.
Wenn du den Namespace änderst musst du alle „App“ Namespaces ändern. Also zum Beispiel in der
HomeController.phpPageController.php (erste Zeile). Ich habe das gerade mal ausprobiert mit dem WI Namespace. Danach musste ich erst mit composer update die Autoloading Files neu generieren und die Namespace Angaben anpassen, die ich selbst geschrieben habe.Die zwei falschen Verweise habe ich in dem Beitrag korrigiert.
Das HTML für das Kontaktformular war noch in der alten Fassung drin. Das habe ich jetzt auch ausgetauscht. Das Tutorial habe ich schon getestet, aber beim Umbau auf Laravel 5 habe ich dann wohl doch nicht alle Stellen erwischt.
Vielen Dank nochmal.
Grüße,
Dirk
Hallo Dirk,
soweit erstmal ein großes Dankeschön für dieses Tutorial!
Jedoch bekomme ich sowie der Paul die Meldung :
Class ‚App\Http\Controllers\Validator‘ not found
Woran liegt das?
Danke im voraus!
Gruß
Prinz
Also ich habe mich eben nochmal schlau gelesen und man muss noch im Controler das hinzufügen:
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Redirect;
Hallo Tobias,
irgendwie scheint meine Kommentar Erinnerungsfunktion nicht zu funktionieren. Daher habe ich erst jetzt gesehen, dass du etwas geschrieben hast. Aber wie ich sehe, konntest du das Problem bereits lösen.
Viele PHP IDEs wie PHP Storm fügen den use Bereich automatisch ein, wenn man den Validator einfügt. Daher fehlt das wohl. Ich schaue mir das aber auch noch mal an und überarbeite es.
Vielen Dank für deinen Kommentar.
Viele Grüße,
Dirk
Du schreibst in deinem Tutorial, dass man sich beim Template in /resources/views die Datei app.blade.php vorfinden müsste, die das Layout enthält.
Leider kann ich diese Date nicht finden. Es gibt nur eine Datei welcome.blade.php, welche die Willkommensseite für Laravel enthält.
Hi,
entschuldige bitte, dass es so lange mit der Antwort gedauert hat. Ich hatte Urlaub und habe mich da mal völlig frei vom Internet gemacht.
Welche Version von Laravel benutzt du? Das Tutorial ist auf Laravel 5 abgestimmt. In der Version 5.0.22, die ich gerade runterladen habe, ist die app.blade.php vorhanden.
Viele Grüße,
Dirk
PS: Du hattest vorkommen Recht. Die app.blade.php ist wirklich nicht vorhanden. Ich habe die aus dem Github Repository geladen und im Composer Projekt ist sie nicht drin.
Super tutorial nur ein kleiner Fehler ist mir aufgefallen.
„Jetzt noch in die /resources/views/app.blade.php ein
yield(‚content‘)
einfügen und zwar in das container DIV, aus dem wir den Inhalt ja verschoben haben.“
da müsste bei yield(‚content‘) noch ein @ Zeihen vorstehen.
Danke für das Lob und den Hinweis. Ich habe das korrigiert. Ich arbeite gerade auch an einer neuen Tutorial Serie für Anfänger. Da gehe ich die Sache noch etwas intuitiver an.
Hallo Dirk,
zunächst einmal ein riesengroßes Dankeschön für das Tutorial. Ich habe mir meine PHP Frameworks in den letzten rund 13 Jahren meist selbstgeschrieben, wollte mir nun aber endlich mal einen Überblick darüber schaffen, inwieweit ich von einem umfangreicheren Framework profitieren könnte. Dabei bin ich unter anderem auch auf Laravel gestoßen, im nächsten Schritt dann auf Dein Tutorial.
Dein Tutorial hat mir einen guten Überblick über die Grundsätze von Laravel gegeben, noch einmal vielen Dank dafür. Composer hat bei mir die Version 5.2 heruntergeladen und installiert. Nachdem mir beim Ausprobieren Deines Tutorials immer wieder Fehler ausgespuckt wurden, habe ich herausgefunden, dass mit dem Update auf 5.2 offenbar einige Änderungen gab.
Aufgefallen sind mir diese Punkte:
1. Die $errors-Variable wird seit 5.2 offenbar nicht mehr automatisch an alle Seiten übergeben. Das Problem lässt sich lösen, wenn man alle Routen innerhalb von
Route::group([‚middleware‘ => [‚web‘]], function () {
}
schreibt. Mehr dazu: http://stackoverflow.com/questions/34420590/laravel-5-2-validation-errors
2. illuminate/html wird von Laravel 5.2 scheinbar nicht mehr unterstützt. Stattdessen funktioniert aber Laravelcollective genau so gut. Mehr dazu: https://laracasts.com/discuss/channels/laravel/call-to-undefined-method-illuminatefoundationapplicationbindshared und https://laravelcollective.com/docs/5.1/html#installation
3. Das hatte Tobias im Mai auch schon kommentiert: Man erhält die Fehlermeldung „Class ‚App\Http\Controllers\Validator‘ not found“.
Ablöse hilft entweder
use Validator, Input, Redirect, Mail;
oder ein „\“ vor den Klassennamen:
$validator = \Validator::make( \Input::all(), $rules );
etc.
Ich muss aber ehrlich sagen, mir persönlich haben diese Problemchen sogar geholfen. Bei der Recherche nach Problemlösungen auf StackOverflow und Co habe ich noch ein Stückchen mehr über Laravel und das Prinzip dahinter gelernt. Allerdings glaube ich, dass es jemanden, der noch nicht jahrelang in PHP entwickelt, schnell aus der Bahn werfen könnte.
Hallo Patrick,
vielen Dank für deine Hinweise. Manchmal würde ich mir wünschen, dass Laravel sich von Version zu Version nicht so unterscheiden würde. Das macht es sehr schwer Tutorials aktuell zu halten. Ich hatte auch schon angefangen das Tutorial komplett zu überarbeiten. Leider ist mir der Bruch meines Sprunggelenks dazwischen gekommen 😉
Sobald ich wieder einigermaßen fit bin, werde ich die Tutorials weiter überarbeiten und auch etwas besser strukturieren.
Viele Grüße,
Dirk
Danke für diese großartige Einführung in Laravel 🙂
Hallo und auch von mir herzlichen Dank für den Workshop.
Ich bin im Bereich PHP noch recht neu und tue mich daher vor allem mit der Fehlersuche/Eingrenzung noch etwas schwer.
Nach den ersten Schritten oben, bis zum kopieren und einrichten des Bootstraps hat bisher alles Funktionoert. Lediglich Pfade musste ich anpassen, damit die css Dateien geladen wurden. Nun sieht die Seite exakt so aus, wie auf dem Screenhot (3 von 3). Nur das Aufklappmenü funktioniert leider nicht. Beim Klick auf „Dropdown“ passiert schlicht gar nichts.
Hast du irgendeinen Tipp, woran es liegen kann oder wie man dem Problem auf die schliche kommen kann? Eine Fehlermeldung gibt es ja nicht. Vor dem Einbinden der css Dateien waren die Menüpunkte noch aufgelistet.
Danke im voraus.
Karsten
Hallo Karsten,
vielen Dank für deine Nachricht. An anderer Stelle habe ich es schon erwähnt, dass das Tutorial eine Überarbeitung bedarf. Daran arbeite ich gerade. Ich kann mich nur noch nicht entscheiden ob das hier auf meinem Blog geschieht oder ich dafür ein neues Projekt starte.
Zu deinem Problem: In der Regel liegt es daran, dass das Javascript nicht richtig eingebunden ist.
Wenn du Firefox oder Chrome benutzt, dann schau mal in die Developer Tools unter Console. Meistens gibt es da eine Ausgabe, dass irgendwas fehlt oder nicht aufgerufen werden konnte.
Hier am Ende ist die Einbindung der Javascript Dateien. https://github.com/dirk-helbert/laraveltutorial/blob/master/resources/views/app.blade.php
Sag mal Bescheid ob es was geholfen hat. Ansonsten kannst du mir auch gerne den Inhalt der app.blade.php per E-Mail zusenden und ich schaue es mir an: info@dirk-helbert.de
Viele Grüße,
Dirk
Es hat mir weitergeholfen, vielen Dank.
Die Fehlermeldung hat zwar nicht viel gesagt aber durch Deinen hinweisauf Java habe ich nochmal gesucht, wo das eigentlich her kommt. Das js wird in der app.blade.php ganz unten eingebunden. Dort musste ich auch noch den Pfad anpassen 😉
Hm, verstehe ich denn die anderen Posts oben so richtig, dass ein Kontaktformular auf diese weise gar nicht mehr funktionier?
Das Eintrgen von „illuminate/html“: „~5.0“ in die composer.json scheint nämlich auch nichts mehr zu bringen. Beim Update kommt zwar keine Fehlermeldung aber es wird auch nichts neues runtergeladen :/
Ja, richtig. Das Projekt wurde eingestellt. Aber es gibt was neues:
Trag mal in die composer.json
„laravelcollective/html“: „5.1.*“ ein anstatt „illuminate/html“:“~5.0″
In die Providers Sektion dann:
Collective\Html\HtmlServiceProvider::class
und
Aliases
‚Form‘ => Collective\Html\FormFacade::class,
‚Html‘ => Collective\Html\HtmlFacade::class,
Ich hoffe das hilft dir weiter. Ich muss das Tutorial dringend überarbeiten 🙂
Leider funktioniert das nicht, ein kurzer Hinweis aber noch vorab: Im Text solltest Du ziemlich am Anfang noch erwähnen, dass per CopyAndPaste an mehreren Stellen geschwungene Anführungszeichen übernommen werden. Die führen zu Problemen, muss man halt kurz korrigieren 😉
Der Composer gibt beim Update mit o.a. Zeile eine riesen Latte Fehlermeldungen aus, habe es extra nochmal ohne die Zeile versucht, dann kommt keine davon.
Ich kopiere jetzt mal alles, kannst es ja gerne später kürzen:
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
Problem 1
– Conclusion: remove laravel/framework v5.2.31
….
lg
Karsten
Da ich gerade das hervoragene Tutorial (vielen Dank dafür!) durcharbeite, bin ich auf einen Fehler durch Notepad++ gekommen.
Der PageController muss „UTF8 without BOM“ encodiert sein, sonst schmeißt der Webserver einen Error.
2 Projekte (privater Natur) habe ich schon in Aussicht, die ich mit Laravel bedienen werde und was gibt es besseres als learning by doing? 🙂
Nachdem ich nirgendwo im Internet einen Hinweis finden konnte habe ich ein bißchen rumprobiert. Die Lösung ist ganz einfach, es muss inzwischen
„laravelcollective/html“: „5.2.*“ heissen statt „5.1.*“…
Ich schaue dann mal, wie weit ich nun komme 😉
Sorry aber leider hänge ich wieder: Weder der Eintrag von
use Illuminate\Support\Facades\Validator;
use Illuminate\Support\Facades\Input;
use Illuminate\Support\Facades\Redirect;
noch „use Validator, Input, Redirect; “ ändern etwas an der Meldung „Class ‚App\Http\Controllers\Validator‘ not found“,
der Bakshlash davor bringt nur eine Meldung weiter, denn dann heisst es „Class ‚App\Http\Controllers\Input‘ not found“,
versucht man es auch da mit einem Backslash, dann kommt „Class ‚Input‘ not found“.
Braucht es vielleicht noch einen Import in der Composer.json? Ich finde nichts bis auf die use Zeilen oben, die aber nicht helfen :/
nochmal sorry, doch gefunden, in den aliases der app.php wird noch
‚Input‘ => Illuminate\Support\Facades\Input::class,
benötigt 😉
Es tut mir leid, dass hier jetzt so viel geschrieben habe aber nun verzweifele ich wieder. Ich schaffe es nicht eine Mail über starto zu versenden.
Ich habe nun diverse Kombinationen aus port und encrpytion durch. am weisten komme ich mit port 465 und ssl, es erscheint
Expected response code 250 but got code „530“, with message „530 5.7.0 User not authenticated“.
Bei den meisten anderen Kombinationen kommt stattdessen ein Timeout. Irgendwie scheint mir Strato verlang ssl und tls. Man kann aber scheinbar nur eins von beiden wählen? Die Meldung klingt aber wieder eher danach, das keine authentication durchgeführt wird, nach allem was ich finde soll das aber automatisch passieren, sobal man einen Benutzernamen und Kennwort einträgt. Ich habe jetzt fast den ganzen Tag gegooglet und ausprobiert, ich komme nicht weiter :/
Bin für jeden tipp dankbar…
Ich benutze Atom (atom.io) oder PHPStorm für die Entwicklung mit PHP. Die sind irgendwie näher dran und vieles ist einfacher.
Wenn du die Projekte umgesetzt hast, dann schreib mir mal. Würde mich sehr interessieren, wenn sie in der freien Wildbahn zu bewundern sind 🙂
Läuft das Projekt auf einem Strato Server? Das Tutorial ist darauf ausgelegt, wenn man es lokal macht. Ja, die meisten Mail Server verlangen eine sichere Verbindung.
Versuch mal in der config/mail.php folgendes einzutragen:
‚host‘ => ‚MAILHOST‘,
‚port‘ => 587,
‚encryption‘ => “,
‚username‘ => ‚EMAIL‘,
‚password‘ => ‚PASSWORD‘
YOURMAILHOST = dein Smtp Server
EMAIL = deine E-Mail Adresse
PASSWORD = das Passwort für deine E-Mail Adresse
Also mir scheint das ganze ganz schön buggy :/
Die Einträge oben habe ich so schon probiert und zig andere. Ich habe jetzt zwei verschiedene „normale“ Mailprovider durch und sogar (weil es so viele anleitungen dafür gibt) einen account bei mailgun angelegt. Nichts funktioniert. Bei Mailgun versucht larabel eine Seite aufzurufen, die es gar nicht gibt und bei smtp weigert er sich scheinbar sich beim smtp server einzuloggen, bevor er eine Mail sendet. Gibt es überhaupt noch welche, die das ohne login zulassen?
Eigentlich habe ich ein Framewortk gesucht, dass es leichter macht :/
Laravel macht es auf jeden Fall leichter 🙂 Normalerweise kann man ganz einfach „mail“ oder „sendmail“ benutzen ohne irgendwelche Einstellungen. Wenn man allerdings einen entfernten SMTP Server angeben muss, dann kann es zu Problemen kommen. Aber musst du das denn? „mail“ oder „sendmail“ als Einstellung funktionieren bei dir nicht?
Oder willst du von deinem lokalen PC aus auf den SMTP zugreifen?
Da mich das jetzt auch interessiert, werde ich im Laufe der Woche mal alle Szenarien durchspielen. Vielleicht finde ich was.
Vielleicht habe ich noch was:
Ich habe das gerade mal auf meine Windows PC ausprobiert. Auch ich habe zuerst Fehler bekommen. Dann dann funktionierte es:
.env
MAIL_DRIVER=smtp
MAIL_HOST=MAILHOST
MAIL_PORT=587
MAIL_USERNAME=EMAILUSERNAME
MAIL_PASSWORD=EMAILPASSWORD
MAIL_ENCRYPTION=tls
Immer
php artisan cache:clear
ausführen nachdem die .env geändert wurde!Ich hoffe das hilft irgendwie. Ansonsten kommunizieren wir am Wochenende per Skype, wenn du Lust hast.
Hi also ich hab denselben Fehler wie Karsten bekommen und bin auch total ratlos! ich probiere es auch über strato von einem lokalen Computer aus, windows. hab es zwar noch nicht mit anderen ausprobiert aber ich muss auch ganz gezielt diese eine Email benutzen. würde mich auch freuen wenn mir da einer helfen kann! das ganze debugging-fenster bringt einen auch nicht weiter…
Ja. Ich habe das auch mit Karsten per Remote ausprobiert und es funktionierte nicht. Bei mir ging es mit Hosteurope einwandfrei mit den genannten Einstellungen und dem
php artisan cache:clear
.Ansonsten könnt ihr ja mal bei Strato nachfragen ob die etwas wissen. Evtl. ist das ja auch schon mal Thema bei denen gewesen.
Ich glaube nicht das es an Laravel liegt, da ich das gleiche mit Hosteuropa ja auch gemacht habe. Auch dort muss vorher autorisiert werden.
Hallo,
ich sitze jetzt schon fast 2 Tage dran um folgendes Projekt am laufen zu https://codecanyon.net/item/laraship-pro-laravel-powerful-admin-user-cms-rules-memberships-settings-subscriptions/15650201
Haben Sie vielleicht eine Schritt für Schritt Anleitung wie man ein Laravel Projekt auf Strato erreichen kann?
Gerne kann ich Ihnen den kompletten Code schicken. Lokal schaff ich es auch nicht einrzurichten. Bei
php artisan migrate
sagt er mir im CMD das Access Denied.
Hallo Michele,
zu dem gekauften Skript kann ich dir leider nichts sagen, weil ich es nicht kenne. Du solltest den Author auf Codecanyon um Hilfe bitten. In den 22 Euro ist ja auch Support enthalten. 🙂
Viele Grüße
Dirk