2015-12-28 22 views
10

データベース/ファクトリ/ ModelFactory.phpファイルにFakerロケールを指定する方法はありますか?ここではそうすることで私の非機能の試みは、>読書のための<LaravelのFakerロケールを変更する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, 
    ]; 
}); 

感謝です!

答えて

19

偽物のロケールがconfig/app.php設定ファイルで設定することができます。キーfaker_localeを追加するだけです。

例えば:以前に文書化されていない機能文書へ'faker_locale' => 'fr_FR',

も参照してください私のPR:上記のコードでhttps://github.com/laravel/laravel/pull/4161

+0

Laravel> = 5.2の場合、これが最良の答えです。 – Soroush

+0

これは、あなたのアプリケーション全体に_single_ロケールが必要なときにうまくいくと思います。多言語テストをサポートしたいときは、これはうまくいきません。 – abbood

+0

DI container(app())からいつでもfakerインスタンスを取得できます。 –

8

この回答は、ララベルの場合にのみ有効です。< = 5.1this answer for a solution in Laravel >=5.2を参照してください。

Fakerでロケールを使用するには、ジェネレータがロケールで作成する必要があります。偽物のドキュメントから

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

ローカライズさプロバイダが見つからない場合は、デフォルトのロケールに工場出荷時のフォールバック(en_EN)。

デフォルトでは、LaravelはEloquentServiceProviderのfakerインスタンスの作成をバインドします。バインドするために使用される正確なコードは次のとおりです。

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

Laravelはそれが偽物に任意の引数を渡すことはありませんので、それは工場の閉鎖に渡し偽物インスタンスのロケールを変更する方法がないように見えます。

このように、ファクトリメソッドで独自のFakerインスタンスを使用する方が良いでしょう。

$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

EloquentServiceProviderの場所はわかりませんが、ローカライズされたバージョンのfakerを作成するためのアイディアは素晴らしいです。どうもありがとう。以前に説明したように、$ localisedFakerがファクトリメソッドの範囲内にある必要があることを反映するためにコードサンプルを編集しました。 – hapi

+1

「Illuminate \ Database \ EloquentServiceProvider」のコアにあります。あなたは本当にそれを変えることはできません。ローカライズされたバージョンで続けていくことをお勧めします。私は助けてくれるとうれしいです:-) –

+1

受け入れられた答えではありません。設定ファイルで簡単に行うことができます。私の答えは以下を参照してください:http://stackoverflow.com/a/42594893/490961 –

2
パーティで後期

が、いくつかの研究の後、私は偽物のドキュメントでこれを見つけた:

[...]偽物が最後のプロバイダで始まっているので、あなたが簡単に無効にすることができ、既存のフォーマッタ:オーバーライドするフォーマッタの名前を持つメソッドを含むプロバイダを追加するだけです。

これは、自分のプロバイダをFaker \ Generatorインスタンスに簡単に追加できることを意味します。

だからちょうどreturn []前にこの

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

ような何かを行うことができ、その後、(この場合)のように、特定のプロバイダを使用

$faker->cpf;

Laravel 5.3でテストFaker documentationの詳細情報

2

@IvanAugustoDB、それを行う別の形式があります。 Laravelがfakerを初期化するとき、別のロケールで構築することができます。サービスプロバイダを作成し、その内部に次のスニペットを挿入します。

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


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

私はそれを使用することを好む:

$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)); 
... 

は、「ng_NGは」ナイジェリアのためのものであり、他のロケールに置き換えることができます。

私の知る限り、あなたのvendor \ fzaninotto \ faker \ src \ Faker \ Providerフォルダにあるものに応じてPerson、PhoneNumberなどを指定する必要があります。ただし、使用するプロバイダが利用できない場合は、 "en"を使用して解決します。

これは私の魅力のように機能し、あなたにとってもうまくいくはずです。