【问题标题】:Laravel 5.1 Localize Factory SeederLaravel 5.1 本地化工厂播种机
【发布时间】:2015-08-26 01:36:14
【问题描述】:

我实现了一个新工厂来生成随机数据。但我想拥有 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
    ];
});

【问题讨论】:

    标签: php database laravel


    【解决方案1】:

    试试

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

    【讨论】:

    • 这是另一种中期解决问题的方法,因为您可能(或应该)需要在每个定义中包含这行代码。 @max 解释的 Service Provider 方法是更好的解决方案
    • @alwinKesler 确实如此。这是一个更好的解决方案。
    【解决方案2】:

    您必须添加提供者,例如。

    $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 Core 上更改

    【讨论】:

    • 在 Laravel Core 上应该如何以及在哪里进行更改?
    • 这两个文件:\Illuminate\Database\Eloquent\Factory::raw\Illuminate\Database\Eloquent\FactoryBuilder::__construct
    • 那么,如果您有 20 个定义,您是否建议在每个定义中包含 N 个提供程序?这不应该是继续的方式。查看@max 答案
    【解决方案3】:

    为了改变 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 提供程序创建的,从而创建了 Dutch faker 数据。

    记住:这必须发生在 DatabaseServiceProvider 执行之后,所以请确保将你自己的AppServiceProvider after 所有 Laravel ServiceProviders 放入你的 @987654327 @数组。

    【讨论】:

    • 这应该是这个问题的正确答案。 Laravel 有松散的组件,必须在创建之前定义,以免在创建垃圾对象时失去性能。只有一个注释。包括 Faker\Factory as FakerFactoryFaker\Generator as FakerGenerator 等路径别名,以便此示例正常工作
    【解决方案4】:

    在你的 ModelFactory.php 的顶部或者你的 AppServiceProvider::register() 方法中添加这个:

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

    【讨论】:

    • 添加到 ModelFactory 无效,但 AppServiceProvider::register() 有效。谢谢。
    猜你喜欢
    • 2015-09-16
    • 2017-08-02
    • 2016-10-17
    • 2020-01-29
    • 1970-01-01
    • 2020-03-18
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多