Routing-Konventionen

Diese Konventionen sind keine Pflicht, erleichtern aber die Zusammenarbeit:

index: GET /seite
create: GET /seite/create
show: GET /seite/{id}
edit: GET /seite/{id}/edit
store: POST /seite
delete: DELETE /seite/{id}
update: PATCH /seite/{id}

Denkt dran, dass HTML Formulare PUT, PATCH und DELETE nicht beherrschen. Dort muss im Laravel Blade Template gespoofed werden mit @method(‚PUT‘), @method(‚PATCH‘) oder @method(‚DELETE‘).

Schau in der Laravel Dokumentation für weitere Details zum Spoofing.

Laravel Fehler: Specified key was too long

Specified key was too long; max key length is 767 bytes

Tritt dieser Fehler bei euch auf, wenn ihr eine Migration in Laravel durchführen wollt? Das kann durchaus daran liegen, dass ihr eine ältere MySQL-Version laufen habt.

Zwei Lösungen:

  1. Update MySQL auf eine neuere Version 😀
  2. Erweitere die boot()-Methode in app/Providers/AppServiceProvider.php um folgende Zeile:
\Illuminate\Support\Facades\Schema::defaultStringLength(191);

Anschließend sollte die Migration wieder klappen.

Laravel Migrations: Neue Tabelle anlegen

Um eine neue Tabelle zu erstellen führe folgendes Kommando aus:

php artisan make:migration create_tabellenname_table

make:migration erzeugt eine neue Migration im Laravel-Projekt im Verzeichnis „database/migrations“. In der neu angelegten PHP-Migrationsdatei (welche „*_create_tabellenname_table.php“ heißen sollte), kann man nun anpassen welche Felder angelegt werden, sowie deren Typ festlegen. In der Methode up() wird die Logik eingepflegt, welche beim Migrieren (php artisan migrate) abgearbeitet werden sollen. In der down()-Methode, wird die Logik eingepflegt, welche beim Zurücksetzen (php artisan migrate:rollback) ausgeführt werden soll.

Beispielhaft kann eine Migrationsdatei wie folgt aussehen:

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateTaskgroupTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('taskgroup', function (Blueprint $table) {
            $table->increments('id');
            $table->string('aufgabe');
            $table->boolean('erledigt');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('taskgroup');
    }
}

Schema::create legt in diese, Fall eine Tabelle namens taskgroup an. Dort werden die Felder id (mit auto_increment, primary_key, unsigned), aufgabe (als varchar) und erledigt (als boolean) angelegt. $table->timestamps() legt zusätzlich noch die Felder created_at und updated_at an.

Die verschiedenen Typen und Methoden welche von Schema unterstützt werden, können hier nachgelesen werden:

Laravel Documentation: Migrations

Laravel Routes: Controller ansteuern

Möchte man statt einer direkten Rückgabe eines views eine bestimmte Methode in einem Controller ansteuern, geht dies relativ einfach in Laravel:

Route::get('/impressum', 'SeitenController@impressum');
Route::get('/datenschutz', 'SeitenController@datenschutz');

Statt im 2. Argument die view()-Methode zurückzugeben, gibt man der get()-Methode den Controllernamen mit und kann direkt den Methodennamen, welcher für den Aufruf verantwortlich sein soll mit einem vorangestellten @ angeben.

Im Falle von der Seite Impressum, wird nun die Methode „impressum“ des Controllers „SeitenController“ aufgerufen.

Der Controller könnte beispielhaft wie folgt aussehen:

namespace App\Http\Controllers;

class SeitenController extends Controller 
{
    public function impressum() 
    {
        // mach hier irgendwas, z.B. Datenbankoperationen, Berechnungen etc.
        
        return view('impressum');
    }

    public function datenschutz()
    {
        $data = 'Coole Daten';
        return view('datenschutz', ['data' => $data]);
    }
}


Laravel Routes: Variablen an view mitgeben

Variablen an einen view mitzugeben ist in Laravel recht einfach, nämlich als 2. Argument der view()-Methode:

Route::get('/eineseite', function () {

    $dataArray = [
        'Viele',
        'coole',
        'Daten'
    ];

    $text = 'Ein einfacher String';
    

    return view('eineseite', ['data' => $dataArray, 'text' => $text]);
}

Hier kann man ein Array übergeben, dessen key dem Variablennamen im Template entsprechen wird. In „eineseite.blade.php“ könnte man auf das dataArray mit $data zugreifen, sowie mit $text auf die text-Variable.

Laravel bietet auch verschiedene shorthands für die Variablenzuweisung an:

Route::get('/eineseite', function () {

    $dataArray = [
        'Viele',
        'coole',
        'Daten'
    ];

    $text = 'Ein einfacher String';
    

    return view('eineseite')->withData($dataArray)->withText($text);
}

Hier leitet sich der Variablenname aus dem Namen hinter der with()-Methode ab. Das Ergebnis ist äquivalent zum oberen Codeblock.

Die with()-Methodekann man auch als Array, noch weiter vereinfachen:

Route::get('/eineseite', function () {

    $dataArray = [
        'Viele',
        'coole',
        'Daten'
    ];

    $text = 'Ein einfacher String';
    

    return view('eineseite')->with(['data' => $dataArray, 'text' => $text]);
}

Letztendlich bleibt es Geschmackssache 🙂

Grundlagen des Routings in Laravel

Webroutes werden in Laravel in „routes/web.php“ definiert. Um z.B. einen view zurückzugeben, wird folgendes in der web.php hinzugefügt:

Route::get('/', function() {
    return view('home');
});

Route::get('/impressum', function() [{
    return view('impressum');
});

Route ist eine Klasse, welche sich um die URL Logik kümmert. Die Methode „get“ kümmert sich um die GET-Requests und löst diese auf. Als erster Parameter wird die URI mitgegeben und als zweiter Parameter eine callback-Funktion. In diesem Fall wird ein view zurückgegeben.

Der erste Block greift, wenn man auf die root-Seite zugreift und liefert den view „home“ zurück, während der zweite Block greift, wenn https://rootseite/impressum aufgerufen wird und gibt den view „impressum“ zurück.

Die views werden in „resources/views“ abgelegt. Hier hätten wir also eine home.php und eine impressum.php. Nutzt man Laravel Blade heißen die Dateien home.blade.php und impressum.blade.php.

Laravel PHP Entwicklungsserver

Um einen PHP Entwicklungsserver zu starten führt man folgenden Befehl im Laravelprojektverzeichnis aus:

php artisan serve

Nun kann man auf der lokalen Maschine das Laravelprojekt lokal im Browser ausführen und testen.

Neuen Laravel installer mit composer installieren

Um den Laravel installer global zu installieren, führe folgenden Code aus:

composer global require "laravel/installer"

Die globale Installation ermöglicht aus jedem Verzeichnis mit dem Keyword „laravel“ verschiedene Befehle auszuführen. Um ein neues Laravel-Projekt in einem Verzeichnis anzulegen, führt man folgenden Befehl aus:

laravel new projectname

Composer löst alle Abhängigkeiten auf und installiert diese im vendor-Verzeichnis.