Warum Laravel die PHP-Community im Sturm erobert

Ich muss zugeben: Irgendwann fühlte ich mich etwas in der PHP-Sprache. Eine Reihe von ergreifenden PHP-Hass-Artikeln umkreisten das Internet wie ein Virus, und einige seiner Flaggschiff-Frameworks, wie CodeIgniter, wurden schnell veraltet. Währenddessen schien Ruby on Rails hinsichtlich Innovation und Entwicklungsfreundlichkeit die Nase vorn zu haben. Mit der Zeit griff ich immer mehr nach meinem Ruby-Werkzeuggürtel.

Aber dann entdeckte ich eines Tages einen neuen, eleganten Rahmen namens Laravel. Zuerst lehnte ich es als einen weiteren Sinatra-Klon ab, der sich schnell ins Nichts verwandeln würde, da der Hauptentwickler ihn aufgab. Aber immer noch, Woche für Woche, waren meine Feeds in meinem sozialen Netzwerk in großer Aufregung und lobten die Lesbarkeit von Laravel. "Könnte es sein", dachte ich mir, "hat PHP endlich ein wirklich modernes Framework?"

Weitere Informationen über Laravel finden Sie unter http://laravel.com

Ich war nicht länger bereit, am Rande zu sitzen; Es war Zeit, sich einzumischen. Ein Jahr später bin ich einer der größten Evangelisten. Mit Laravel macht PHP eigentlich wieder Spaß! Noch besser, ich glaube nicht mehr, dass PHP für meist persönliche Websites und hässliche WordPress-Blogs zum Scheitern verurteilt ist. Nee; Es ist in der Tat der Glaube dieses Autors, dass wir dank Laravel, Composer und PHP 5.5 die nächste Renaissance der beliebtesten serverseitigen Sprache erleben werden.

Um die neueste Entwicklungsversion von Laravel (v4) zu installieren, müssen Sie zuerst Composer installieren. Dann klonen Sie einfach das Repo und installieren Sie die Abhängigkeiten. git clone git: //github.com/illuminate/app.git myApp und Komponist installieren. Du bist bereit zu gehen!


Beredt

Die meisten PHP-Entwickler beginnen ihre Reise damit, unzählige SQL-Zeilen direkt in ihr kühles, unlesbares PHP zu schachteln. Es ist unnötig zu erwähnen, dass die grundlegendsten Websites schnell zu einem unauffälligen Durcheinander führen.

Erinnern Sie sich noch daran, als Sie zum ersten Mal von ActiveRecord von Ruby on Rails gehört haben? Nun, im PHP-Ende der Welt ist Eloquent die erste Implementierung.

Benötigen Sie einige Beispiele?

// Hol alle Tasks ab $ task = Task :: all (); // Hole die Aufgabe mit einer ID von 1 $ task = Task :: find (1); // Task aktualisieren $ task = Task :: find (1); $ task-> title = 'Setzen Sie den Cookie ab!'; $ task-> save (); // Neue Aufgabe erstellen Aufgabe :: create (['title' => 'Artikel schreiben']); // Eine Aufgabe löschen Aufgabe :: find (1) -> delete ();

Leute, es ist nicht möglich mehr lesbaren Code in PHP zu schreiben! Nun wäre es eine Sache, wenn Eloquent es Ihnen nur erlaubte, grundlegende CRUD-Operationen für einen Tisch auszuführen, aber das ist sicherlich nicht der Fall.

Berücksichtigen Sie Tabellenbeziehungen, z. B. einen Benutzer und seine jeweiligen Aufgaben. In Laravel können wir, nachdem wir für jedes Modell eine schnelle Nachschlagemethode festgelegt haben, problemlos eine Eins-zu-Eins-Beziehung oder eine beliebige Verknüpfung für diese Angelegenheit behandeln. Hier sind einige Beispiele, um Ihren Appetit anzuregen.

// Erhalte alle Aufgaben vom Autor mit einer ID von 1 $ Aufgaben = User :: find (1) -> Aufgaben; // Holen Sie sich den Autor einer Aufgabe. $ Author = Task :: find (5) -> user () -> Benutzername; // Eine neue Aufgabe nach Autor einfügen $ task = new Task ([title: 'Gehe zum Laden']); Benutzer :: find (1) -> Aufgaben () -> Einfügen ($ task);

Es ist nicht schwer, Eloquent als die beste ActiveRecord-Implementierung in der PHP-Sprache zu betrachten.


Komponistenpakete

Installieren Sie Composer.

Beginnend mit Laravel 4 (derzeit in Alpha) wird das gesamte Framework modularisiert und als einzelne Composer-Pakete verfügbar sein.

Composer ist ein Verpackungssystem für PHP, das PEAR ähnelt, jedoch besser ist. Es macht den Prozess des Abhängigkeitsmanagements so einfach wie möglich.

Denken Sie an das bestehende Rahmenökosystem. Im Moment müssen Sie mit den Kernfunktionen der einzelnen Frameworks leben. Sie können Eloquent beispielsweise nicht in einer CakePHP-Anwendung verwenden. Wie Sie sich vorstellen können, hat diese Wahrheit dazu geführt, dass das Rad immer wieder neu erfunden wurde ... und immer wieder.

Sehr geehrte Damen und Herren, die Zukunft von PHP ist modular. Warum ein aufgeblähtes, massives Gerüst installieren, wenn Sie nur wenige seiner Angebote benötigen? Nun, bald musst du nicht. Benötigen Sie in einem einfachen Projekt nur Eloquent? Gut - überhaupt kein Problem! Installieren Sie es einfach über Composer und fahren Sie fort!

Wenn wir also zu einer eher paketbasierten, modularen PHP-Welt wechseln, wie passt Laravel dazu? Stellen Sie sich das als eine vorgegebene Sammlung von Paketen vor, die in einen Bogen gehüllt sind! Besser noch, falls Sie ein Update auf die neueste Version des Frameworks benötigen, ist es so einfach wie das Ausführen Komponist Update.

Als Beispiel für die Flexibilität, die dies bietet, fügen wir die beliebte Mockery-Testbibliothek einer Laravel-Anwendung hinzu. Beginnen Sie mit einem neuen Laravel 4-Projekt und bearbeiten Sie es composer.json Datei, um Spott zu fordern.

"required": "illuminate / foundation": "> = 1.0.0", "spott / spott": "dev-master", "autoload": "classmap": ["app / controller", " App / Modelle "," App / Datenbank / Migrationen "," App / Tests / TestCase.php "]

Auf Packagist.org finden Sie eine Liste der verfügbaren Composer-Pakete sowie Installationsanweisungen.

Nachdem wir Composer darüber informiert haben, dass für unsere Anwendung Mockery erforderlich ist, können wir die entsprechenden Abhängigkeiten installieren.

Komponist Update

Und das ist es! Wir können jetzt Mockery in unseren Tests verwenden. Dies ist die Kraft von Composer und Laravel 4 bei der Arbeit! Wir haben Räder. Lass uns aufhören, neue zu schaffen! Hunderte von Hunderten von Paketen sind über Packagist.org erhältlich.

   

Hunderte von Hunderten von Paketen sind über Packagist.org erhältlich.


Routen

Die meisten Anfänger von PHP-Entwicklern kennen nichts anderes als die natürlichsten Routensysteme. Erstellen Sie eine Verzeichnisstruktur, die Ihrer gewünschten URI entspricht, und fahren Sie fort. Fügen Sie beispielsweise ein index.php Datei in das folgende Verzeichnis: blog / admin /, und jetzt können Sie darauf zugreifen, indem Sie zu: localhost: 8888 / blog / admin / index.php. Einfach! Nun, vielleicht zuerst; Sie werden jedoch wahrscheinlich feststellen, dass Sie mehr Flexibilität und Kontrolle darüber benötigen, welche Route in Ihrer Anwendung ausgelöst wird.

Laravel verfolgt einen unglaublich einfachen und benutzerfreundlichen Weg beim Routing. Schreiben wir als Beispiel die Route, die erforderlich ist, um eine Ansicht für das Profil eines Benutzers anzuzeigen.

Route :: get ('users / id'), Funktion ($ id) // Finde den Benutzer $ user = User :: find ($ id); // Ansicht anzeigen und Benutzerobjekt zurückgeben: View :: make ('users.profile') -> with ('user', $ user););

Nun, wenn ein Benutzer anfordert example.com/users/1, das Benutzer / Profil.php Ansicht wird gerendert.

Alternativ können wir herkömmliche Steuerungen verwenden, um stattdessen die Logik zu handhaben.

Route :: get ('Benutzer / Id', 'Benutzer @ Show');

Jetzt, Controller / Benutzer.php ist für die Wiedergabe der Ansicht verantwortlich - insbesondere für die Show Methode.

mit ('Benutzer', $ Benutzer); 

Einfache Authentifizierung

Nahezu jede Webanwendung einer Substanz erfordert eine Art Authentifizierung. Laravel bietet eine einfache, aber einfach zu bedienende Benutzeroberfläche zur Authentifizierung von Benutzern.

Beginnen Sie mit dem Erstellen eines Benutzer Tabelle mit den erforderlichen Feldern für die Nutzername und Passwort. Denken Sie daran: Dies ist ein perfekter Anwendungsfall für eine Migration!

Laravel kann das dann Versuch um sich an einem Benutzer anzumelden - wahrscheinlich basierend auf vom Benutzer angegebenen Werten aus einem Formular.

Hier ist ein einfaches Beispiel ohne den Validierungsaspekt.

Route :: post ('login', function () $ credentials = array ('username' => Eingabe :: get ('username'), 'password' => Eingabe :: get ('password')); / / validation durchführen if (Auth :: Versuch ($ credentials)) // Anmeldeinformationen passen. Angemeldet werden! return Redirect :: to ('admin / profile');;

Beachten Sie, dass Laravel hinter den Kulissen das bereitgestellte Passwort automatisch vergleicht und es mit dem im Kennwort gespeicherten vergleicht Benutzer Tabelle.

Unter der Annahme, dass die Anmeldeinformationen des Benutzers übereinstimmen, wird die Benutzer-ID in der Sitzung gespeichert und der Benutzer wird angemeldet. Bei nachfolgenden Anforderungen können Sie den aktuell angemeldeten Benutzernamen mit folgendem Befehl abrufen:

$ user = Auth :: user () -> Benutzername;

Email schicken

Geben Sie es zu: Das Versenden von E-Mails über Ihre Anwendung ist immer komplizierter als es sein sollte. Nicht mehr in Laravel 4!

Aufbauend auf dem beliebten SwiftMailer-Paket finden Sie jetzt ein neues config / mail.php Datei in Ihrer Anwendung. Hier können Sie die erforderlichen Anmeldeinformationen für Ihren E-Mail-Anbieter angeben. Hier ist eine abgespeckte Version dessen, was Sie finden werden:

 'smtp.example.com', 'port' => 2525, 'from' => array ('address' => null, 'name' => null), 'Verschlüsselung' => 'tls', 'username' = > null, 'kennwort' => null;);

Ersetzen Sie die entsprechenden Werte einfach durch die Werte Ihres E-Mail-Servers.

Als nächstes benötigen wir eine Ansicht für die E-Mail. Lass uns einen erstellen, genannt welcome.blade.php, Wird verwendet, wenn sich ein neues Mitglied auf unserer Justin Bieber-Fanseite registriert.

  Hallo, $ $ user-> name. Nochmals vielen Dank, dass Sie sich für die neuesten Justin Bieber-News angemeldet haben! Wir freuen uns auf Sie. Danke, Management  

Wenn alles vorhanden ist, richten wir die erforderliche Beispielroute ein und senden die E-Mail.

Route :: get ('/', function () $ user = Benutzer :: find (1); $ data = ['user' => $ user]; // E-Mail-Ansicht, Daten für Ansicht, Schließung zum Senden von E-Mails Mail :: send ('emails / welcome', $ data, Funktion ($ message) use ($ user) $ message -> an ($ user-> email) -> Betreff ('Welcome Bieber Fan!') -> attach ('images / bieberPhoto.jpg');); Rückkehr 'Willkommens-E-Mail gesendet!';);

Ganz einfach, wie? Wir holen den neuen Benutzer aus der Tabelle und senden eine E-Mail an die mit diesem Benutzer verbundene E-Mail-Adresse. Dank der SwiftMailer-Funktion ist das Durchführen scheinbar komplexer Aktionen wie das Anhängen von Dateien ein Kinderspiel! Nun erhält jedes neue Mitglied bei der Anmeldung ein Foto von Justin Bieber. Perfekt!


BFFs mit Backbone

"Backbone bietet Struktur für Ihren chaotischen Spaghetti-Code!"

Laravel 4 macht die Erstellung von RESTful-APIs so einfach wie möglich. Der Schlüssel ist, wie JSON standardmäßig von einer Route zurückgegeben wird.

Stellen wir uns vor, dass wir eine Liste aller Benutzer als JSON zurückgeben müssen. Nun, Chuck, wir können das in einer einzigen Zeile erreichen.

Route :: get ('users', function () return User :: all (););

Wenn Sie diese Route ausführen, wird ein bisschen JSON angezeigt, z. B .:

["id": 1, "username": "[email protected]", "id": 2, "username": "[email protected]"]

Frage mich, wo die Passwort Feld ist? In Laravel können Sie im zugehörigen Modell der Tabelle über a angeben $ versteckt Eigenschaft, welche Felder vor der JSON-Ausgabe ausgeblendet werden sollen.

Mit einer JavaScript-Bibliothek wie Backbone können wir diese Daten jetzt problemlos abrufen.

var User = Backbone.Model.extend (); var UsersCollection = Backbone.Collection.extend (Modell: Benutzer, URL: '/ Benutzer'); var users = neue UsersCollection; users.fetch (); users.toJSON (); // [Objekt, Objekt, Objekt]

Wie wäre es stattdessen, einen einzelnen Benutzer abzurufen? Nun, wir müssen zuerst die richtige Laravel-Route einrichten:

Route :: get ('users / id', Funktion ($ id) return User :: find ($ id););

Wie wir erfahren haben, wird der JSON für den angeforderten Benutzer zurückgegeben (abzüglich der Passwort). Als Nächstes erstellen wir ein Backbone-Modell und rufen die Daten ab.

var User = Backbone.Model.extend (urlRoot: '/ users'); var user = neuer Benutzer (id: 1); user.fetch (); // id: 1, benutzername: '[email protected]'

Beachten Sie, wie die Hauptlast der Arbeit auf der Kundenseite liegt? Unser Laravel-Code ist so gut wie möglich.


Migrationen

Wenn Sie ausschließlich PHP-Entwickler sind, haben Sie wahrscheinlich noch nicht die Freude an Migrationen erlebt, die von Ruby on Rails erstmals populär wurden.

Stellen Sie sich Migrationen als Versionskontrolle für Ihre Datenbank vor. Was würde passieren, wenn Sie am nächsten Tag dieses neue Feld zu Ihrem Feld hinzufügen Aufgaben Tisch, merkte man, dass es doch nicht nötig war. Nun, Sie würden das Feld manuell entfernen, richtig? Aber was ist mit den anderen Entwicklern in Ihrem Team? Ihr Code kann fehlerhaft sein, wenn Sie sie nicht informieren!

Bei Migrationen machen wir jedoch lediglich die vorherige Migration rückgängig und setzen unseren Tag fort! Noch besser, wenn Sie Änderungen auf Ihren Server übertragen, ist dies ein einfacher Vorgang PHP Handwerker migrieren Befehl aktualisiert automatisch Ihre Produktionsdatenbank. In Kombination mit dem Schema-Generator von Laravel wird das Verwalten von Datenbanken so einfach wie möglich.

Lassen Sie uns eine Migration erstellen, um eine neue hinzuzufügen Benutzer Tabelle zu unserer Datenbank. Von der Kommandozeile aus:

PHP Handwerker Migration: make create_users_table --table = Benutzer --create

Im obigen Snippet geben wir den Namen der Tabelle sowie den Namen an --erstellen flag, um anzugeben, dass wir eine neue Tabelle erstellen, anstatt eine vorhandene zu ändern.

Dieser Befehl erstellt eine neue Migrationsdatei in unserer Anwendung. Wir können dann Laravel's Schema-Klasse nutzen, um das Schema unserer Tabelle vorzubereiten.

Inkremente ('id'); $ table-> string ('title'); );  / ** * Kehren Sie die Migrationen um. * / public function down () Schema :: drop ('task'); 

Beachten Sie, wie diese Klasse zwei Methoden bietet: oben und Nieder, Diese geben an, welche Aktion Laravel bei der Durchführung einer Migration ausführen soll, und setzen diese zurück.

In diesem Fall auf oben(), Wir erstellen eine neue Tabelle, Aufgaben, und geben Sie zwei Felder für die Ich würde und Titel der Aufgabe. Wenn Sie die Migration rückgängig machen, löschen Sie einfach die Tabelle.

Führen Sie die Migration aus, indem Sie zum Terminal zurückkehren und Folgendes eingeben:

PHP Handwerker migrieren

Das ist es! Sie haben jetzt ein brandneues Aufgaben Tisch mit zwei Feldern!… Oh, müssen Sie es zurückrollen? Einfach:

PHP Handwerker migrieren: Rollback

Auf Wiedersehen Aufgaben Tabelle.


Klinge

Die Blaver-Template-Engine von Laravel bietet eine klare Syntax für Ansichten. Um beispielsweise mit regulärem PHP eine Liste von Personen zu filtern und deren Namen innerhalb eines Listenelements zu wiederholen, schreiben wir möglicherweise:

Diese Syntax kann auf die meisten Kontrollstrukturen von PHP angewendet werden.

Das ist nicht so schlimm, aber wir können es besser machen. Jede Laravel-Ansicht, die das enthält .Klinge.php Die Dateierweiterung wird entsprechend analysiert. Daher kann das vorherige Snippet dann ersetzt werden durch:

    @foreach ($ Leute als $ p)
  • $ p
  • @endforeach

Beachten Sie, wie Variablen, die wiederholt werden sollen, darin eingeschlossen werden , Ähnlich wie bei einer JavaScript-Templating-Engine, z. B. bei Lenkern.

Blade kann auch für elegante Layouts und Masterseiten verwendet werden. Lassen Sie uns eine Basis-Masteransicht erstellen, um diese Funktionalität zu demonstrieren.

// views / layout.blade.php       
@ield ('container')

Das @Ausbeute Zeile ist der Schlüssel. Dies gibt an, dass alle untergeordneten Ansichten mit einem Abschnitt angezeigt werden Ich würde von Container sollte dort verschachtelt sein.

Als nächstes erstellen wir eine neue Ansicht.

// views / home / hello.blade.php @layout ('layout') @section ('container') 

Hallo, $ $ user-> name!

@ endection

Erledigt! Einfache Masterseiten in PHP!


Erfinderische Controller

Das Erstellen eines RESTful-Dienstes in PHP kann sich ohne etwas Hilfe als etwas schwierig erweisen. In Laravel 4 könnte es nicht einfacher sein. Das Framework bietet das, was wir als Restful Resources bezeichnen. Lass es uns testen.

In Ihrem Routen Datei, geben Sie eine neue Ressource an.

Route :: resource ('Aufgaben', 'Aufgabencontroller');

Diese Codezeile gibt an, dass wir eine neue Ressource erstellen möchten, Aufgaben, und platziere die AufgabenController Controller, der die Logik für jede Route verwaltet.

Wenn Sie die Prinzipien von REST befolgen, registriert diese Ressource automatisch Routen für:

  • Aufgaben erhalten (Alle Aufgaben anzeigen)
  • GET Aufgaben / id (Einzelne Aufgabe anzeigen)
  • Aufgaben erhalten / erstellen (Formular anzeigen, um eine neue Aufgabe zu erstellen)
  • POST-Aufgaben (Neue Aufgabe erstellen)
  • GET Aufgabe / id / edit (Einzelne Aufgabe bearbeiten)
  • PUT-Aufgaben / id (Aktualisierungsaufgabe)
  • DELETE Aufgaben / id (Aufgabe löschen)

Als nächstes erstellen wir das AufgabenController, Aber anstatt es manuell zu tun, lassen wir Artisan die Boilerplate erledigen.

PHP Handwerker: TasksController

Dadurch wird ein neues erstellt Steuerungen / TasksController.php Controller, und füllen Sie es mit etwas Boilerplate.

 

Jede dieser Methoden wird ausgelöst, wenn die entsprechende RESTful-Route ausgelöst wird. So zeigen Sie ein Formular an, um ein neues zu erstellen Aufgabe, wir würden die zutreffende Ansicht innerhalb der laden erstellen Methode, die ausgelöst wird, wenn example.com/tasks/create wird angefordert. Dieses Formular sollte POST an /Aufgaben, In diesem Fall ist der Geschäft Methode wird ausgelöst.

Es könnte nicht sauberer sein!

Die neuesten offiziellen Laravel-Screencasts finden Sie auf der Vimeo-Seite von UserScape


Datenbank Seeding

Wie oft haben Sie selbst festgestellt, dass Sie eine Datenbanktabelle mit Dummy-Datensätzen zum Testen manuell "säen"? Für mich ist es eine große Anzahl! In Laravel 4 können wir eine angeben Samen Datei für eine Tabelle.

Um es auszuprobieren, erstellen Sie eine neue Datei mit dem Namen der jeweiligen Tabelle innerhalb der App / Datenbank / Saatgut Verzeichnis Ihrer Anwendung. Diese Datei sollte ein Array von Arrays enthalten, von denen jedes die erforderlichen Schlüssel-Wert-Paare enthält. Hier ist ein Beispiel:

 'Zum Laden gehen'] ['title' => 'Laravel-Artikel fertigstellen'] ['title' => 'Eier abholen.' ]]);

Wir haben jetzt drei neue Zeilen für die beschrieben Aufgaben Tabelle in unserer Datenbank. Lass es säen.

php handwerker db: samen

Erledigt!


Modell Setter und Getter

Es gibt wahrscheinlich eine Vielzahl von Aktionen, die Sie häufig auslösen, wenn Sie ein Feld aus einer Datenbanktabelle festlegen oder abrufen. Wenn sich ein Benutzer beispielsweise anmeldet, sollten wir zur Einhaltung der bewährten Sicherheitsmethoden immer sein Kennwort kennzeichnen. Statt die Arbeit manuell zu erledigen, aktualisieren wir stattdessen die Nutzer Modell und geben Sie an, dass beim Festlegen eines Kennworts zuerst ein Hash ausgeführt werden soll.

Passwort ); 

Einfach! Jetzt müssen wir uns nie um diesen Teil des Puzzles kümmern, wenn wir einen neuen Benutzer registrieren. Natürlich ist auch die umgekehrte Option verfügbar, wenn Sie den Wert eines Felds bearbeiten müssen, bevor Sie ihn "abrufen" können.

Was ist, wenn wir einen Zeitstempel oder einen Namen festlegen müssen? Dies kann auch über das Modell erfolgen, wenn Sie dies wünschen.

firstName. ". $ this-> lastName;

Das neue vollständiger Name() Die Methode steht nun unserer Benutzerinstanz zur Verfügung.

echo User :: find (1) -> fullName (); // John Doe

Gemeinschaft (Konferenz)

Vielleicht wichtiger als alles andere ist, dass Laravel in relativ kurzer Zeit eine blühende, evangelikale Gemeinschaft aufgebaut hat, die sich aus einigen der einflussreichsten Entwicklern der PHP-Gemeinschaft zusammensetzt.

Warum ist das wichtig? Einfach: Mit Evangelisation geht es sowohl um Bildung als auch um Beitrag. Die größte Hürde für ein neues Framework besteht darin, das Wort zu bekommen und den Leuten zu zeigen, wie man das Dang-Ding benutzt! Glücklicherweise zeichnet sich Laravel durch Dokumentation und Tutorials / Screencasts im Web aus - einschließlich eines vollständigen Kurses bei Ihnen!

Lernen Sie bei Tuts + Premium die Besonderheiten von Laravel kennen!

Die Wahrheit ist, dass wir die Oberfläche dessen, was in Laravel möglich ist, kaum zerkratzt haben. Wir müssen uns noch mit der Fehlerbehandlung von Laravel, der Integration von PHPUnit, dem eifrigen Laden (vor und nach dem Abrufen von Sammlungen) und vielem mehr befassen. Lesen Sie sich die fantastische Dokumentation durch, um tiefer in das Framework einzutauchen, und achten Sie auf die offizielle Version von Version 4!

Die beliebte Nettuts + Community bietet eine Reihe von Laravel-spezifischen Tutorials.

Wenn dieser Artikel der Anstoß für Ihre neu entdeckte Liebe zu PHP und Laravel war, sollten Sie vielleicht an der ersten jährlichen Konferenz von Laracon (Konferenz) teilnehmen, die für Ende Februar 2013 in Washington DC geplant ist. Vielleicht sehe ich Sie dort!

Die erste Laravel-Konferenz, Laracon, wird vom 22. bis 23. Februar 2013 in Washington D.C. stattfinden. Weitere Informationen finden Sie unter http://conference.laravel.com