有没有办法在数据库/ 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, ]; });
谢谢阅读!
可以在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默认情况下,绑定创建一个faker实例EloquentServiceProvider
.用于绑定的确切代码是:
// 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, ]; });
晚会,但经过一些研究,我在faker文档中发现了这一点:
[...]因为Faker从最后一个提供程序开始,您可以轻松地覆盖现有的格式化程序:只需添加一个包含以您要覆盖的格式化程序命名的方法的提供程序.
这意味着您可以轻松地将自己的提供程序添加到Faker\Generator实例中.
所以你可以做这样的事情
$faker->addProvider(new Faker\Provider\pt_BR\Person($faker));
就在之前return []
然后使用特定的提供者,比如(在这种情况下)$faker->cpf;
在Laravel 5.3上测试过
有关Faker文档的更多信息
我更喜欢使用它:
$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, ]; });