2015-12-28 8 views
10

Gibt es eine Möglichkeit, das Faker-Gebietsschema in der Datei database/factories/ModelFactory.php anzugeben? Hier ist meine nicht funktionierenden Versuch dabei>, <Faker-Gebietsschema in Laravel ändern 5.2

$factory->define(App\Flyer::class, function (Faker\Generator $faker) { 

    // What is the correct way of doing this? 
    $faker->locale('en_GB'); 

    return [ 
     'zip' => $faker->postcode, 
     'state' => $faker->state, 
    ]; 
}); 

Danke fürs Lesen!

Antwort

19

Faker locale kann in der config/app.php Konfigurationsdatei konfiguriert werden. Fügen Sie einfach den Schlüssel faker_locale hinzu.

z.B .: 'faker_locale' => 'fr_FR',

Siehe auch meine PR-Dokument, das zuvor nicht dokumentierte Funktion: https://github.com/laravel/laravel/pull/4161

+0

Für Laravel> = 5.2 ist dies die beste Antwort. – Soroush

+0

Ich denke, das funktioniert, wenn Sie ein _single_ Gebietsschema für Ihre gesamte App wollen .. das ist nicht gut, wenn Sie mehrsprachige Tests unterstützen möchten – abbood

+0

Sie können immer die Fälschung Instanz aus dem DI-Container (app()) –

8

DIESE ANTWORT IST NUR FÜR LARAVEL gültig < = 5.1 siehe this answer for a solution in Laravel >=5.2.

Um ein Gebietsschema mit Faker zu verwenden, muss der Generator mit dem Gebietsschema erstellt werden.

$faker = Faker\Factory::create('fr_FR'); // create a French faker 

Von der faker Dokumentation:

Wenn keine lokalisierte Anbieter gefunden wird, die Fabrik Fallbacks auf das Standardgebietsschema (de_DE).

Laravel bindet standardmäßig die Erstellung einer Faker-Instanz in EloquentServiceProvider. Der genaue Code verwendet zu binden:

// FakerFactory is aliased to Faker\Factory 
$this->app->singleton(FakerGenerator::class, function() { 
    return FakerFactory::create(); 
}); 

Es scheint, dass Laravel keine Möglichkeit hat, das Gebietsschema der faker Instanz es geht in die Fabrikschließungen zu ändern, da es nicht in irgendwelchen Argumenten Faker hindurchgeht.

Als solche würden Sie besser bedient werden, indem Sie Ihre eigene Instanz von Faker in der Fabrikmethode verwenden.

$localisedFaker = Faker\Factory::create("fr_FR"); 

$factory->define(App\Flyer::class, function (Faker\Generator $faker) { 

    // Now use the localisedFaker instead of the Faker\Generator 
    // passed in to the closure. 
    return [ 
     'zip' => $localisedFaker->postcode, 
     'state' => $localisedFaker->state, 
    ]; 
}); 
+1

Ich bin nicht sicher, wo sich der EloquentServiceProvider befindet, aber Ihre Idee zum Erstellen einer lokalisierten Version von faker funktioniert großartig. Danke vielmals. Ich habe Ihr Codebeispiel so bearbeitet, dass $ localisedFaker im Bereich der Factory-Methode enthalten war, wie Sie zuvor erläutert haben. – hapi

+1

Sie befindet sich im Kern 'Illuminate \ Database \ EloquentServiceProvider'. Sie können es nicht wirklich ändern, ohne viel herumzualbern. Am besten weitermachen mit der lokalisierten Version, froh, dass ich helfen konnte :-) –

+1

Sollte nicht mehr die akzeptierte Antwort sein, gibt es einen einfachen Weg, dies über die Konfigurationsdatei zu tun. Siehe meine Antwort unten: http://Stackoverflow.com/a/42594893/490961 –

2

Spät in der Partei, aber nach einigen Recherchen habe ich dies in faker Dokumentation:

[...] seit Faker mit dem letzten Anbieter beginnen, können Sie einfach überschreiben bestehende Formatierer : Fügen Sie einfach einen Anbieter hinzu, der Methoden enthält, die nach den Formatierern benannt sind, die Sie überschreiben möchten.

Das bedeutet, dass Sie Ihre eigenen Anbieter leicht zu einer Faker \ Generator-Instanz hinzufügen können.

So können Sie etwas tun, wie diese

$faker->addProvider(new Faker\Provider\pt_BR\Person($faker)); 

Kurz vor return [] und dann bestimmten Anbieter verwenden, wie (in diesem Fall) $faker->cpf;

auf Laravel Geprüft 5.3

Weitere Informationen unter Faker documentation

2

@IvanAugustoDB, es gibt eine andere Form, dies zu tun. Wenn Laravel faker initialisiert, kann er auf einem anderen Gebietsschema erstellt werden, erstellen Sie einfach einen Service Provider und legen Sie das folgende Snippet hinein.

use Faker\Generator as FakerGenerator; 
use Faker\Factory as FakerFactory; 


$this->app->singleton(FakerGenerator::class, function() { 
    return FakerFactory::create('pt_BR'); 
}); 
0

Ich ziehe es zu benutzen:

$fakerBR = Faker\Factory::create('pt_BR'); 

$factory->define(App\Flyer::class, function (Faker\Generator $faker) use (fakerBR) { 

    return [ 
     'name' => $fakerBR->name, 
     'cpf' => $fakerBR->cpf, 
     'zip' => $faker->postcode, 
     'state' => $faker->state, 
    ]; 
}); 
2
$factory->define(App\User::class, function (Faker\Generator $faker) { 
    $faker->addProvider(new Faker\Provider\ng_NG\Person($faker)); 
    $faker->addProvider(new Faker\Provider\ng_NG\PhoneNumber($faker)); 
... 

im obigen Code "ng_NG" für Nigeria ist und kann mit jedem anderen locale ersetzt werden.

Nach meinem Wissen müssten Sie Person, PhoneNumber und andere angeben, je nachdem, was Sie in Ihrem Lieferanten \ fzaninotto \ faker \ src \ Faker \ Provider-Ordner haben. Wenn jedoch der Provider, den Sie verwenden möchten, nicht verfügbar ist, wird er wieder auf "en" zurückgesetzt.

Das funktioniert wie Charme für mich, und es sollte auch für Sie arbeiten.