Laravel Database Seeding mit Faker

Das Problem dürfte vielen Entwicklern bekannt sein: Woher bekomme ich Testdaten während der Entwicklung einer Anwendung. Die manuelle Eingabe ist mühsam und kostet viel Zeit und während die Datenbank sich im Entwicklungsprozess verändert, müssen diese Daten immer wieder angepasst oder ergänzt werden.
Laravel bietet mit dem Database Seeding eine einfache Möglichkeit, Datenbaktabellen mit Testdaten zu füllen. Allerdings müssen auch diese zunächst manuell als Array erfasst werden.

Um den Prozess der manuellen Dateneingabe zu automatisieren und auch umfangreichere Datenmengen im Entwicklungsprozess zu verwenden, hat sich im PHP-Umfeld die Bibliothek Faker etabliert. Mit Hilfe von Faker können zufällige Testdaten für einen großen Pool von Datenklassen wie z.B. Vorname, Nachname, Anschrift, E-Mailadressen, Blindtexte bis hin zu zufälligen Bildern generiert werden. Über die Provider steht sogar eine Schnittstelle zu Verfügung, um Faker um eigene Inhaltstypen zu erweitern. Ein herausragendes Merkmal ist zudem die Lokalisierung der Testdaten.

Um Faker in das Laravel-Projekt einzubinden, muss die composer.json um die Zeile "fzaninotto/faker": "1.5.*@dev" ergänzt werden, um die neue Abhängigkeit zu definieren.

"require": {
		"laravel/framework": "4.2.*",
		"fzaninotto/faker": "1.5.*@dev"
	}

Alternative ließe sich die composer.json auch über den Befehl composer require fzaninotto/faker um den Eintrag ergänzen.

Mit dem Kommando composer update wird Faker dann geladen.


<?php

class UserSeeder extends Seeder {

	public function run(){
		// Faker mit deutscher Lokalisierung über Factory initialisieren
		$faker = Faker\Factory::create('de:DE');
		$faker->seed(1234); // Zufallsgenerator initialisieren
		// Wir laden dynamisch einen Provide rhinzu, um Passwörter zu generieren 
		$faker->addProvider(new Faker\Provider\Internet($faker));
		$users = array();
		for ($i=0; $i < 10000; $i++) { // Wir generieren 10.000 Testdatensätze

			$firstname = $faker->firstName; //Vorname über Generator
			$surname = $faker->lastName; // Nachname über Generator
			$initials = $firstname[0] . $surname[0]; 
			// Einen Datensatz für die Tabelle User definieren wir als Array
			// und erzeugen dieses dynamisch über die Faker-Generatoren 
			$user = array(
			'email' => $faker->email,
			'initial'=> $initials,
			'firstname' => $firstname,
			'surname' => $surname,
			'username' => $faker->userName,
			'password' => Hash::make($faker->password()),
			'bio'=> $faker->text(255),
			'confirmation' => str_random(20),
			'confirmed'=> true,
			'registration_date'=> $faker->dateTimeThisDecade($max = 'now')

		);
		DB::table('user')->insert(array($user));
		}
	}
}

Mit dem Befehl php artisan db:seed wird der UserSeeder ausgeführt und erzeugt 10.000 sinvolle Testdatensätze.