Изменить Faker Locale в Laravel 5.2
Можно ли указать локаль Faker в базе данных/фабриках/файле ModelFactory.php? Вот моя неработающая попытка сделать это > , <
$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,
];
});
Спасибо за чтение!
Ответы
Ответ 1
Локаль Faker может быть настроен в файле конфигурации config/app.php
. Просто добавьте ключ faker_locale
.
например: 'faker_locale' => 'fr_FR',
См. также мой PR для документирования ранее недокументированной функции: https://github.com/laravel/laravel/pull/4161
Ответ 2
ЭТО ОТВЕТ ТОЛЬКО ДЕЙСТВИТЕЛЬНО ДЛЯ LARAVEL <= 5.1 см. этот ответ для решения в Laravel >= 5.2.
Чтобы использовать локаль с Faker, генератору необходимо создать локаль.
$faker = Faker\Factory::create('fr_FR'); // create a French faker
Из документации фейкера:
Если локальный провайдер не найден, factory возвращается к языку по умолчанию (en_EN).
Laravel по умолчанию связывает создание экземпляра faker в EloquentServiceProvider
. Точный код, используемый для привязки:
// FakerFactory is aliased to Faker\Factory
$this->app->singleton(FakerGenerator::class, function () {
return FakerFactory::create();
});
Похоже, что Laravel не имеет возможности модифицировать локаль экземпляра faker, который он передает в закрытие factory, поскольку он не передает никаких аргументов Faker.
Таким образом, вам лучше будет использовать ваш собственный экземпляр Faker в методе factory.
$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,
];
});
Ответ 3
Поздно в партии, но после некоторых исследований я нашел это в документации фейкера:
[...], поскольку Faker запускается с последнего провайдера, вы можете легко переопределить существующие форматы: просто добавьте поставщика, содержащий методы, названные в честь форматировщиков, которые вы хотите переопределить.
Это означает, что вы можете легко добавить своих собственных поставщиков в экземпляр Faker\Generator.
Итак, вы можете сделать что-то вроде этого
$faker->addProvider(new Faker\Provider\pt_BR\Person($faker));
Как раз перед return []
, а затем используйте определенные провайдеры, например (в данном случае) $faker->cpf;
Протестировано на Laravel 5.3
Дополнительная информация о Документация Faker
Ответ 4
@IvanAugustoDB, есть другая форма этого. Когда Laravel initalize faker, он может быть создан на другом языке, просто создайте Поставщика услуг и поместите в него следующий фрагмент.
use Faker\Generator as FakerGenerator;
use Faker\Factory as FakerFactory;
$this->app->singleton(FakerGenerator::class, function () {
return FakerFactory::create('pt_BR');
});
Ответ 5
$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" для Нигерии и может быть заменен на любой другой язык.
Насколько мне известно, вам нужно будет указать Person, PhoneNumber и другие в зависимости от того, что у вас есть в папке поставщика \fzaninotto\faker\src\Faker\Provider. Однако, если поставщик, которого вы намереваетесь использовать, недоступен, он вернется к использованию "en".
Это работает как прелесть для меня, и он тоже должен работать для вас.
Ответ 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,
];
});