Laravel Tutorial #03: Dynamische Navigation

Werbung

Aktuelle Tutorials findest du auf meiner neuen Laravel Tutorial Seite.

Lavavel Dynamische Navigation Tutorial Hallo und Willkommen zum Laravel Tutorial Dynamische Navigation mit Laravel. Das ist jetzt mein drittes Laravel Tutorial und es macht immer noch Spaß, was schon mal ein gutes Zeichen ist. Ich nutze für dieses Tutorial Laravel 5.

Im letzten Teil des Tutorials haben wir die Einstellungen für die Navigation aus der Laravel Konfiguration ausgelesen. Jetzt lesen wir die Daten aus der Datenbank.

Im Laravel Framework befindet sich die Config unter /config. Hier werden alle Einstellungen vorgenommen und verwaltet. Man könnte zum Beispiel eine /config/navigation.php anlegen und darüber eine Navigation erzeugen bzw. die Config dafür bereitstellen.

Die navigation.php sieht dann in etwa so aus

 'home',
	'title' => 'Startseite',
	'url'   => '/'
    ),
    array(
	'name'  => 'kontakt',
	'title' => 'Kontakt',
	'url'   => '/kontakt'
    ),
    array(
        'name'  => 'impressum',
	'title' => 'Impressum',
	'url'   => '/impressum'
    )
);

Wenn du eine noch dynamischere Navigation haben möchtest, dann musst du die Einstellungen in einer Datenbank speichern. Das könnte zum Beispiel für ein CMS oder einen Blog Sinn machen.

Doch wie bekommen wir jetzt die Einstellungen in die Datenbank und wieder raus?

Zuerst brauchen wir mal eine Datenbank. In der Regel, ich schätze mal über 90%, werden auf eine MySQL Datenbank setzen. Ich denke das ist auch gut so. Für dieses Tutorial werde ich allerdings auf SQLite aufbauen. SQLite ist schön leichtgewichtig und ideal für Tutorials, weil man nicht einen Datenbankserver aufsetzen muss.

Unterstützt Laravel denn SQLite?

Ja, Laravel unterstützt MySQL, Postgres, SQLite und SQL Server. Also alles im Lot.

Ok, dann konfigurieren wir jetzt Laravel für SQLite. Dazu schauen wir als erstes in die /config/database.php. Das ist die Hauptkonfigurationsdatei für die Datenbankverbindung. Als Default Einstellung steht gewöhnlich mysql dort drin. Wir könnten das jetzt hier ändern oder wir übernehmen den Parameter in unsere /app/config/local/database.php.

Das hat den Vorteil, dass wir unterschiedliche Datenbankeinstellungen für Entwicklungsumgebung und Livesystem nutzen können. Komischerweise ist der SQLite Abschnitt in der lokalen Konfiguration gar nicht drin. Also fügen wir ihn dort auch ein.

Das Ganze sollte dann in etwa so aussehen (Kommentare habe ich entfernt)

 'sqlite',

    'connections' => array(
        'sqlite' => array(
	'driver'   => 'sqlite',
	'database' => storage_path().'/localdb.sqlite',
	'prefix'   => '',
	),
    ),
);

Du könntest die Einstellungen für mysql und pqsql auch drin lassen. Allerdings sollte man immer darauf bedacht sein keinen verwaisten Quellcode zu haben.

Laravel Migration

Jetzt kommen wir das erste Mal mit Laravel Migration in Berührung und dem Laravel CLI Tool Artisan.

Dazu gehst du auf die Konsole und in das Rootverzeichnis des Laravel Projects. Dort gibst du php artisan make:migrate create_navigation_table ein. Nach kurzer Zeit sollte etwas ähnliches wie

Created Migration: 2015_02_13_220915_create_navigation_table

zu sehen sein. Hat also funktioniert. Scheinbar.

In dem Ordner /database/migrations ist jetzt eine Datei mit dem Namen 2015_02_13_220915_create_navigation_table.php. Soweit, so unspektakulär.

Öffne mal ruhig die Datei. Dort sind zwei Methoden zu finden. Eine up und eine down Methode. Mit diesen beiden Methoden steuern wir jetzt die Datenbanktabelle navigation.

Die up Methode wird immer aufgerufen, wenn die Migration gestartet wird und Änderungen an der Datenbank vorgenommen werden. Die down Methode wird aufgerufen wenn man die letzte Änderung rückgängig machen will.

Füge dazu in die down Methode Schema::drop('navigation'); ein. Diese löscht die navigation Tabelle wieder, wenn die Migration rückgängig gemacht werden sollte. In die up Methode kommt etwas mehr Code rein. Hier erstellen wir die navigation Tabelle mit allen benötigten Feldern.

Der Inhalt der up Methode sieht daher so

Schema::create('navigation', function($table)
{
    $table->increments('id');
    $table->string('name')->unique();
    $table->string('title');
    $table->string('url');
});

aus. Eigentlich bräuchten wir hier das id Feld nicht unbedingt. Aber falls wir später noch eine Unterebene in die Navigation einbauen, können wir mit einem zusätzlichen Feld parentid auf den darüber liegenden Menüpunkt verweisen.

Die SQLite Datenbank bzw. die Daten müssen wir manuell anlegen. Dazu einfach eine leere Datei unter /storage anlegen und sie localdb.sqlite nennen. Auf der Konsole kannst du jetzt php artisan migrate ausführen. Wenn alles funktioniert dann sollte mehr oder weniger so was wie

Werbung
Migrated: 2015_02_13_221528_create_navigation_table

angezeigt werden. Es können dabei auch noch die Einträge für die Users und die Password Resets Tabelle ausgeführt werden, die bereits vorher vom System definiert wurden.

Was ist jetzt passiert? Die Methode up() wurde aufgerufen und die Tabelle in der Datenbank mit den definierten Feldern angelegt. Die Tabelle ist allerdings komplett leer und so für uns nicht nutzbar. Wir können über den DatabaseSeeder Werte direkt in die Datenbank schreiben. Diese Initial Werte sind auch gut für die testgetriebene Entwicklung.

Seeding heisst übrigens „füttern“. Das passt ja.

Ok, also legst du jetzt am besten in /database/seeds die NavigationTableSeeder.php an. Das ist die Klasse, die der DatabaseSeeder später aufruft und in der die run() Methode ausgeführt wird.

Der Inhalt der Datei sollte so

delete();
	Navigation::create(
	    array(
		'name'  => 'home',
		'title' => 'Startseite',
		'url'   => '/'
		)
	);

        Navigation::create(
	    array(
		'name'  => 'kontakt',
		'title' => 'Kontakt',
		'url'   => '/kontakt'
		)
	);

	Navigation::create(
	    array(
		'name'  => 'impressum',
		'title' => 'Impressum',
		'url'   => '/impressum'
		)
	);
    }
}

aussehen.

Im ersten Schritt werden mit DB::table('navigation')->delete() die Daten aus der Tabelle navigation gelöscht und direkt danach werden drei neue Datensätze geschrieben, also unsere Navigationspunkte. Natürlich muss man hier sehr vorsichtig sein, dass man nicht aus Versehen Daten löscht. Aber ansich ist das Database Seeding eine sehr gute Sache.

Du musst jetzt noch dem DatabaseSeeder mitteilen, dass der NavigationTableSeeder auch ausgeführt werden soll. Das geschieht in der DatabaseSeeder.php unter /database/seeds.

Dort einfach an das Ende der run() Methode $this->call('NavigationTableSeeder'); einfügen.

Eine letzte Sache fehlt noch und zwar das Model für die Navigation.

Dies kannst du am einfachsten mit php artisan make:model Navigation anlegen. Dann öffnest du unter /app die Navigation.php an und fügst

 

ein. Eigentlich keine große Sache. Die Klasse sollte Navigation heissen, das table Attribute sollte auch so genannt werden und das timestamps Attribute kann hier auf false gesetzt werden. Ist das timestamps Attribute nicht auf false gesetzt gibt es eine Fehlermeldung, weil wir das updated_at Feld in der Datenbank nicht angelegt haben.

Auf der Konsole jetzt noch php artisan db:seed aufrufen und die Einstellungen für die Navigation sind in der Datenbank.

Dynamische Navigation aus der Datenbank lesen

Irgendwie müssen wir jetzt die Einstellungen aus der Datenbank lesen. Wie so vieles ist auch das eine der leichteren Übungen für Laravel Entwickler.

Die Config Datei /config/navigation.php kannst du löschen. Die Rückgabe der Navigationselemente führen wir im Model aus.

Öffne dazu /app/Navigation.php und ersetze den kompletten Inhalt durch

 $item->name,
		'title' => $item->title,
		'url'   => $item->url
		);
	    }
	    return $navigationItems;
	}
}

Vorher haben wir an der Stelle das statische Array mit den Navigationspunkte zurückgegeben. Jetzt holen wir mit $dbNavigationItems = self::all() alle Daten aus der Datenbank. So einfach ist der Datenbankzugriff mit Laravel und Eloquent.

Der Rest ist tägliches Entwickler Handwerk. Array aus den Datenbankeinträgen erzeugen und dann zurückgeben. Fertig.

Du musst jetzt allerdings noch die /resources/views/navigation.blade.php mit


befüllen.

Falls du die ersten beiden Laravel Tutorials mitgemacht hast, kannst du jetzt die Webseite aufrufen. Wenn sich nichts geändert hat, dann hat alles funktioniert.

Damit wären wir auch schon am Ende mit dem dritten Teil des Laravel Anfänger Tutorials. Ich freue mich, dass du mit mir auch dieses Tutorial durchgegangen bist. Das nächste Tutorial wird mit Sicherheit kommen. Falls du Fragen, Kritik, Lob oder Anregungen hast, dann kannst du gerne die Kommentarfunktion benutzen.

Vielen Dank und viel Spaß mit Laravel.