更改Laravel 5.2中的Faker Locale


Change Faker Locale in Laravel 5.2

有没有办法在数据库/工厂/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,  
    ];
});

感谢阅读!

可以在config/app.php配置文件中配置Faker语言环境。只需添加密钥faker_locale

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

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

此答案仅对LARAVEL<5.1或者当您想使用许多不同的本地时,请参阅Laravel>=5.2中的解决方案答案。

要将区域设置与Faker一起使用,生成器需要使用该区域设置进行创建。

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

来自faker文档:

如果找不到本地化的提供程序,则工厂会回退到默认的区域设置(en_en)。

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

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

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,  
    ];
});

我更喜欢使用它:

$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,  
    ];
});

派对后期,但经过一些研究,我在faker文档中发现了这一点:

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

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

所以你可以做一些类似的事情

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

就在return []之前,然后使用特定的提供者,如(在本例中)$faker->cpf;

在Laravel 5.3上测试

有关伪造文档的更多信息

此答案仅适用于Laravel 5.4及更高版本:

由于此pull,您可以在应用程序配置文件中使用"faker_locate"作为变量。它真的很好用。

@IvanAugustoDB,还有另一种形式。当Laravel初始化faker时,它可以在另一个语言环境中构建,只需创建一个Service Provider并在其中放入以下代码段

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

$this->app->singleton(FakerGenerator::class, function () {
    return FakerFactory::create('pt_BR');
});
$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''fzaninoto''faker''src''faker''Provider文件夹中的内容指定Person、PhoneNumber和其他内容。但是,如果您打算使用的提供程序不可用,则它将解析为使用"en"。

这对我来说很有魅力,对你来说也应该如此。

这是faker 中使用的所有提供者的链接

对于阿拉伯语言示例

    use Faker'Factory as Faker; ### in the head off class
    $faker = Faker::create();
    $faker_ar = Faker::create('ar_SA');
    for ($i = 0; $i < 10; $i++) {
        DB::table('categories')->insert([
            'name'          => $faker->name,
            'name_ar'       => $faker_ar->name,
            'created_at'    => now(),
            'updated_at'    => now(),
        ]);
    }

如果您对同一个表使用多种语言,并且不能使用本地语言您可以使用:shuffleString

'name'=>$faker->shuffleString('abddefhig')
'name_ar'=>$faker->shuffleString('البتثجحخدزسش')