Изменить 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,  
    ];
});