在Laravel 5.2中更改Faker Locale

时间:2015-12-28 16:01:00

标签: php laravel

有没有办法在database / 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,  
    ];
});

感谢阅读!

9 个答案:

答案 0 :(得分:49)

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

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

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

答案 1 :(得分:13)

此答案仅适用于LARAVEL< = 5.1 ,请参阅this answer for a solution in 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,  
    ];
});

答案 2 :(得分: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,  
    ];
});

答案 3 :(得分:5)

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

  

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

     

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

所以你可以做这样的事情

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

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

在Laravel 5.3上测试

有关Faker documentation

的更多信息

答案 4 :(得分: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');
});

答案 5 :(得分: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"适用于尼日利亚,可以替换为任何其他语言环境。

据我所知,您必须根据供应商\ fzaninotto \ faker \ src \ Faker \ Provider文件夹中的内容指定Person,PhoneNumber和其他人。但是,如果您打算使用的提供程序不可用,那么它将解析为使用" en"。

这对我来说就像魅力一样,它也适合你。

答案 6 :(得分:1)

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

this拉出后,您可以在应用配置文件中使用'faker_locale'作为变量。它真的很好用。

答案 7 :(得分:0)

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

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

答案 8 :(得分:0)

这是在 faker 中使用的所有 providers 的链接

以阿拉伯语语言为例

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