2015-06-10 5 views
6

Я внедрил новую фабрику для генерации случайных данных. Но я хочу, чтобы эти случайные данные были в формате de_DE. Поэтому обычно я создаю объект фейкера сначала, но это не относится к Laravel 5.1 с новым классом ModelFactory. Как мне локализовать это?Laravel 5.1 Localize Factory Seeder

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

ответ

21

Чтобы изменить локаль по умолчанию, используемый 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; 

Например, приведенный выше код будет означать все экземпляры Факер создаются с помощью nl_NL поставщика, создавая тем самым голландские данные обманщик.

Помните: это должно произойти после того, как DatabaseServiceProvider была выполнена, поэтому убедитесь, что поставить свой собственный AppServiceProviderпосле все из Laravel ServiceProviders в вашем config.php массиве.

+4

Это должен был быть правильный ответ на эту проблему. Laravel имеет свободный компонент, который должен быть определен до создания, чтобы не потерять производительность, создавая объекты мусора. Только записка. включают в себя псевдонимы путей, такие как «Faker \ Factory as FakerFactory» и «Faker \ Generator as FakerGenerator», чтобы этот пример работал –

4

Попробуйте

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

Это еще один способ середины решить эту проблему, как вы могли бы (или должны) необходимость включить эту строку кода в каждое определение. Подход поставщика услуг, объясненный @max, является лучшим решением. –

+0

@alwinKesler Действительно. Это лучшее решение. – chanafdo

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 Ядра

+0

Как и где это должно быть изменено на Laravel Core? – animaacija

+1

Эти 2 файла: '\ Осветите \ Database \ Eloquent \ Factory :: raw' ' \ Осветите \ Database \ Eloquent \ FactoryBuilder :: __ construct' – Pyton

+1

Так что, если у вас есть 20 определений, вы предлагаете включить N провайдеров в каждом из них? Это не должно продолжаться. Проверьте @max ответ –

1

Добавить это либо в верхней части ModelFactory.php или в AppServiceProvider :: регистр() метод:

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

. Добавление в ModelFactory не сработало, но работал AppServiceProvider :: register(). Благодарю. –

Смежные вопросы