Laravel 5.1 本地化工厂数据填充器

6

我实现了一个新的工厂来生成随机数据。但是我希望这些随机数据的格式为de_DE。通常情况下,我首先创建一个faker对象,但在Laravel 5.1中使用新的ModelFactory类时不需要这样做。那么我该如何本地化呢?

$factory->define(App\Models\AED::class, function($faker) {
    return [
        'owner' => $faker->company,
        'street' => $faker->streetAddress,
        'latitude' => $faker->latitude,
        'longitude' => $faker->longitude
    ];
});
4个回答

22
为了更改Faker使用的默认语言环境,最简单的方法是通过自己的具体实现重写FakerGenerator绑定。
// AppServiceProvider.php
$this->app->singleton(FakerGenerator::class, function () {
    return FakerFactory::create('nl_NL');
});

在你的 AppServiceProvider.php 文件顶部添加以下行:

use Faker\Generator as FakerGenerator;
use Faker\Factory as FakerFactory;
例如,上述代码会意味着所有的Faker实例都是使用nl_NL提供程序创建的,从而创建荷兰语的模拟数据。
请记住:这必须发生在DatabaseServiceProvider执行之后,因此请确保将您自己的AppServiceProvider放置在所有Laravel ServiceProviders之后,在您的config.php数组中。

4
这应该是这个问题的正确答案。Laravel有松散的组件,必须在创建之前定义,以避免创建垃圾对象而影响性能。只需注意,在示例中包括路径别名,如Faker\Factory as FakerFactoryFaker\Generator as FakerGenerator,才能使其正常工作。 - Alwin Kesler

4

尝试

$factory->define(App\Models\AED::class, function($faker) {
    $faker->locale = "YOUR_LOCALE";
    ...
});

1
这是另一种中缀问题的方法,因为您可能(或应该)需要在每个定义内包含此行代码。由@max解释的服务提供者方法是更好的解决方案。 - Alwin Kesler
@alwinKesler 确实,这是更好的解决方案。 - chanafdo

1

将以下内容添加到ModelFactory.php文件的顶部或者在AppServiceProvider::register()方法中添加:

$this->app->singleton(\Faker\Generator::class, function () {
    return \Faker\Factory::create('de_DE');
});

将内容添加到ModelFactory没有起作用,但是使用AppServiceProvider::register()方法可以。谢谢。 - Sinan Eldem

0

你必须添加提供者,例如:

$factory->define(Mylead\Models\UserDetails::class, function($faker) {

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

    return [
        'name' => $faker->name,
        'surname' => $faker->lastname,
        'street' => $faker->streetName,
        'city' => $faker->city,
        'post_code' => $faker->pesel,
        'pesel' => $faker->pesel,
        'paypal' => $faker->email,
        'bank_name' => $faker->bank,
        'bank_account' => $faker->bankAccountNumber,
        'created_at' => $faker->dateTime
    ];
});

目前您无法手动设置Faker的语言环境。它应该在Laravel核心中更改。


在 Laravel 核心中,这应该在哪里以及如何更改? - animaacija
1
这两个文件:\Illuminate\Database\Eloquent\Factory::raw\Illuminate\Database\Eloquent\FactoryBuilder::__construct - Pyton
1
那么,如果你有20个定义,你是建议在每一个定义中都包含N个提供者吗?这不应该是继续的方式。请查看@max的答案。 - Alwin Kesler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接