From 2cf815c7d40c9f7036d19e421e9694194db08eec Mon Sep 17 00:00:00 2001 From: Lars Dobschall Date: Tue, 8 Sep 2020 16:50:35 +0200 Subject: [PATCH] move function based factory stub to class based --- README.md | 39 ++++++++++---- composer.json | 8 +-- resources/views/factory.blade.php | 37 +++++++++---- src/Console/GenerateCommand.php | 90 +++++++++++++++---------------- 4 files changed, 106 insertions(+), 68 deletions(-) diff --git a/README.md b/README.md index 93ba6ff..e95f86a 100644 --- a/README.md +++ b/README.md @@ -30,16 +30,35 @@ class User extends Model { #### Factory Result ```php -$factory->define(App\User::class, function (Faker\Generator $faker) { - return [ - 'name' => $faker->name, - 'username' => $faker->userName, - 'email' => $faker->safeEmail, - 'password' => bcrypt($faker->password), - 'company_id' => factory(App\Company::class), - 'remember_token' => Str::random(10), - ]; -}); + + +class UserFactory extends Factory +{ + /** + * The name of the factory's corresponding model. + * + * @var string + */ + protected $model = App\User::class; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + 'name' => $faker->name, + 'username' => $faker->userName, + 'email' => $faker->safeEmail, + 'password' => bcrypt($faker->password), + 'company_id' => factory(App\Company::class), + 'remember_token' => Str::random(10), + ]; + } +} + ``` diff --git a/composer.json b/composer.json index 3db6493..aaca9d3 100644 --- a/composer.json +++ b/composer.json @@ -4,10 +4,10 @@ "keywords": ["Laravel", "Tests", "Factory"], "license": "MIT", "require": { - "php": "^7.2.5", - "illuminate/support": "^6.0|^7.0", - "illuminate/console": "^6.0|^7.0", - "illuminate/filesystem": "^6.0|^7.0", + "php": "^7.3", + "illuminate/support": "^8.0", + "illuminate/console": "^8.0", + "illuminate/filesystem": "^8.0", "doctrine/dbal": "^2.9" }, "autoload": { diff --git a/resources/views/factory.blade.php b/resources/views/factory.blade.php index 4c17d52..3560e32 100644 --- a/resources/views/factory.blade.php +++ b/resources/views/factory.blade.php @@ -1,11 +1,30 @@ -/* @@var $factory \Illuminate\Database\Eloquent\Factory */ -use Faker\Generator as Faker; +namespace Database\Factories; -$factory->define({{ $reflection->getName() }}::class, function (Faker $faker) { - return [ -@foreach($properties as $name => $property) - '{{$name}}' => {!! $property !!}, -@endforeach - ]; -}); +use Illuminate\Database\Eloquent\Factories\Factory; +use Illuminate\Support\Str; +use {{ $reflection->getName() }}; + +class {{ $reflection->getShortName() }}Factory extends Factory{ + + /** + * The name of the factory's corresponding model. + * + * @var string + */ + protected $model = {{ $reflection->getName() }}::class; + + /** + * Define the model's default state. + * + * @return array + */ + public function definition() + { + return [ + @foreach($properties as $name => $property) + '{{$name}}' => {!! $property !!}, + @endforeach + ]; + } +} diff --git a/src/Console/GenerateCommand.php b/src/Console/GenerateCommand.php index 57f814e..1a6f8cc 100644 --- a/src/Console/GenerateCommand.php +++ b/src/Console/GenerateCommand.php @@ -298,54 +298,54 @@ protected function setProperty($name, $type = null, $table = null) } $fakeableTypes = [ - 'enum' => '$faker->randomElement(' . $this->enumValues($table, $name) . ')', - 'string' => '$faker->word', - 'text' => '$faker->text', - 'date' => '$faker->date()', - 'time' => '$faker->time()', - 'guid' => '$faker->word', - 'datetimetz' => '$faker->dateTime()', - 'datetime' => '$faker->dateTime()', - 'integer' => '$faker->randomNumber()', - 'bigint' => '$faker->randomNumber()', - 'smallint' => '$faker->randomNumber()', - 'decimal' => '$faker->randomFloat()', - 'float' => '$faker->randomFloat()', - 'boolean' => '$faker->boolean' + 'enum' => '$this->faker->randomElement(' . $this->enumValues($table, $name) . ')', + 'string' => '$this->faker->word', + 'text' => '$this->faker->text', + 'date' => '$this->faker->date()', + 'time' => '$this->faker->time()', + 'guid' => '$this->faker->word', + 'datetimetz' => '$this->faker->dateTime()', + 'datetime' => '$this->faker->dateTime()', + 'integer' => '$this->faker->randomNumber()', + 'bigint' => '$this->faker->randomNumber()', + 'smallint' => '$this->faker->randomNumber()', + 'decimal' => '$this->faker->randomFloat()', + 'float' => '$this->faker->randomFloat()', + 'boolean' => '$this->faker->boolean' ]; $fakeableNames = [ - 'city' => '$faker->city', - 'company' => '$faker->company', - 'country' => '$faker->country', - 'description' => '$faker->text', - 'email' => '$faker->safeEmail', - 'first_name' => '$faker->firstName', - 'firstname' => '$faker->firstName', - 'guid' => '$faker->uuid', - 'last_name' => '$faker->lastName', - 'lastname' => '$faker->lastName', - 'lat' => '$faker->latitude', - 'latitude' => '$faker->latitude', - 'lng' => '$faker->longitude', - 'longitude' => '$faker->longitude', - 'name' => '$faker->name', - 'password' => 'bcrypt($faker->password)', - 'phone' => '$faker->phoneNumber', - 'phone_number' => '$faker->phoneNumber', - 'postcode' => '$faker->postcode', - 'postal_code' => '$faker->postcode', + 'city' => '$this->faker->city', + 'company' => '$this->faker->company', + 'country' => '$this->faker->country', + 'description' => '$this->faker->text', + 'email' => '$this->faker->safeEmail', + 'first_name' => '$this->faker->firstName', + 'firstname' => '$this->faker->firstName', + 'guid' => '$this->faker->uuid', + 'last_name' => '$this->faker->lastName', + 'lastname' => '$this->faker->lastName', + 'lat' => '$this->faker->latitude', + 'latitude' => '$this->faker->latitude', + 'lng' => '$this->faker->longitude', + 'longitude' => '$this->faker->longitude', + 'name' => '$this->faker->name', + 'password' => 'bcrypt($this->faker->password)', + 'phone' => '$this->faker->phoneNumber', + 'phone_number' => '$this->faker->phoneNumber', + 'postcode' => '$this->faker->postcode', + 'postal_code' => '$this->faker->postcode', 'remember_token' => 'Str::random(10)', - 'slug' => '$faker->slug', - 'street' => '$faker->streetName', - 'address1' => '$faker->streetAddress', - 'address2' => '$faker->secondaryAddress', - 'summary' => '$faker->text', - 'url' => '$faker->url', - 'user_name' => '$faker->userName', - 'username' => '$faker->userName', - 'uuid' => '$faker->uuid', - 'zip' => '$faker->postcode', + 'slug' => '$this->faker->slug', + 'street' => '$this->faker->streetName', + 'address1' => '$this->faker->streetAddress', + 'address2' => '$this->faker->secondaryAddress', + 'summary' => '$this->faker->text', + 'url' => '$this->faker->url', + 'user_name' => '$this->faker->userName', + 'username' => '$this->faker->userName', + 'uuid' => '$this->faker->uuid', + 'zip' => '$this->faker->postcode', ]; if (isset($fakeableNames[$name])) { @@ -360,7 +360,7 @@ protected function setProperty($name, $type = null, $table = null) return; } - $this->properties[$name] = '$faker->word'; + $this->properties[$name] = '$this->faker->word'; } public static function enumValues($table, $name)