在Laravel 5.2中更改Faker Locale

hap*_*api 31 php laravel

有没有办法在数据库/ factories/ModelFactory.php文件中指定Faker区域设置?这是我这样做的非功能性尝试>,<

$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,  
    ];
});
Run Code Online (Sandbox Code Playgroud)

谢谢阅读!

Vin*_*rat 58

可以在config/app.php配置文件中配置Faker区域设置.只需添加密钥即可faker_locale.

例如: 'faker_locale' => 'fr_FR',

另请参阅我的PR以记录以前未记录的功能:https://github.com/laravel/laravel/pull/4161

  • 我想当你想要整个应用程序的_single_语言环境时,这是有效的...当你想支持多语言测试时,这是不行的 (8认同)
  • 对于Laravel> = 5.2,这是最好的答案. (3认同)

Dav*_*ker 15

这个答案仅适用于LARAVEL <= 5.1,请参阅此答案,了解Laravel> = 5.2中的解决方案.

要在Faker中使用区域设置,生成器需要使用区域设置进行创建.

$faker = Faker\Factory::create('fr_FR'); // create a French faker
Run Code Online (Sandbox Code Playgroud)

从faker文档:

如果未找到本地化提供程序,则工厂将回退到默认语言环境(en_EN).

Laravel默认情况下,绑定创建一个faker实例EloquentServiceProvider.用于绑定的确切代码是:

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

看起来Laravel无法修改它传递给工厂闭包的faker实例的区域设置,因为它没有传递给Faker的任何参数.

因此,在工厂方法中使用您自己的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,  
    ];
});
Run Code Online (Sandbox Code Playgroud)


iva*_*obd 6

晚会,但经过一些研究,我在faker文档中发现了这一点:

[...]因为Faker从最后一个提供程序开始,您可以轻松地覆盖现有的格式化程序:只需添加一个包含以您要覆盖的格式化程序命名的方法的提供程序.

这意味着您可以轻松地将自己的提供程序添加到Faker\Generator实例中.

所以你可以做这样的事情

$faker->addProvider(new Faker\Provider\pt_BR\Person($faker));
Run Code Online (Sandbox Code Playgroud)

就在之前return []然后使用特定的提供者,比如(在这种情况下)$faker->cpf;

在Laravel 5.3上测试过

有关Faker文档的更多信息


Jul*_*tto 6

我更喜欢使用它:

$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,  
    ];
});
Run Code Online (Sandbox Code Playgroud)