2015-06-10 23 views
6

Ho implementato un nuovo factory per generare dati casuali. Ma voglio avere questi dati casuali nel formato di de_DE. Di solito, per prima cosa creo un oggetto faker, ma questo non è il caso in Laravel 5.1 con la nuova classe ModelFactory. Come faccio a localizzare questo poi?Laravel 5.1 Localize Seeder Factory

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

risposta

21

Per modificare le impostazioni internazionali predefinito utilizzato da Faker, il modo più semplice è quello di ignorare semplicemente la FakerGenerator vincolante con la propria implementazione concreta:

// AppServiceProvider.php 
$this->app->singleton(FakerGenerator::class, function() { 
    return FakerFactory::create('nl_NL'); 
}); 

in cima ai vostri AppServiceProvider.php file di aggiungere le seguenti righe:

use Faker\Generator as FakerGenerator; 
use Faker\Factory as FakerFactory; 

Ad esempio, il codice di cui sopra significherà vengono create tutte le istanze Faker utilizzando il provider nl_NL, creando così i dati Faker olandesi.

Ricorda: questo deve avvenire dopo il DatabaseServiceProvider è stato eseguito, quindi assicuratevi di mettere il proprio AppServiceProviderdopo tutti i ServiceProviders laravel nel config.php array.

+4

Questa dovrebbe essere la risposta giusta a questo problema. Laravel ha componenti liberi che devono essere definiti prima della creazione per non perdere le prestazioni creando oggetti inutili. Solo una nota. includere gli alias del percorso come 'Faker \ Factory come FakerFactory' e' Faker \ Generator as FakerGenerator' per fare in modo che questo esempio funzioni –

4

Prova

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

Questo è un altro modo per metà risolvere il problema come si potrebbe aver bisogno (o dovrebbe) per includere questa riga di codice all'interno di ogni definizione. L'approccio del fornitore di servizi spiegato da @max è una soluzione migliore –

+0

@alwinKesler. È una soluzione migliore – chanafdo

0

È necessario aggiungere Provider ad es.

$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 
    ]; 
}); 

Per ora Non è possibile impostare impostazioni locali di Faker. Esso dovrebbe essere modificato laravel Nucleo

+0

come e dove dovrebbe essere modificato su Laravel Core? – animaacija

+1

Questi 2 file: '\ Illuminate \ Database \ Eloquente \ fabbrica :: raw' ' \ Illuminate \ Database \ Eloquente \ FactoryBuilder :: __ construct' – Pyton

+1

Quindi, se si dispone di 20 definizioni, stai suggerendo di includere N fornitori in ognuno di loro? Questo non dovrebbe essere il modo di procedere. Dai un'occhiata a @max answer –

1

Aggiungere questo sia nella parte superiore del vostro ModelFactory.php o nel vostro AppServiceProvider :: registro() metodo:

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

L'aggiunta a ModelFactory non ha funzionato ma AppServiceProvider :: register() ha funzionato. Grazie. –