diff --git a/src/CrudApiMake.php b/src/CrudApiMake.php index 56f6b14..810fdf7 100644 --- a/src/CrudApiMake.php +++ b/src/CrudApiMake.php @@ -13,7 +13,8 @@ class CrudApiMake extends GeneratorCommand {--p|parent= : The generated API controller parent directory} {--t|tests-only : Generate API CRUD testcases only} {--r|form-requests : Generate CRUD with Form Request on create and update actions} - {--f|formfield : Generate CRUD with FormField facades}'; + {--f|formfield : Generate CRUD with FormField facades} + {--uuid : Generate CRUD with UUID primary keys}'; /** * The console command description. diff --git a/src/CrudMake.php b/src/CrudMake.php index 6afeafb..3ba43e5 100644 --- a/src/CrudMake.php +++ b/src/CrudMake.php @@ -14,7 +14,8 @@ class CrudMake extends GeneratorCommand {--t|tests-only : Generate CRUD testcases only} {--f|formfield : Generate CRUD with FormField facades} {--r|form-requests : Generate CRUD with Form Request on create and update actions} - {--bs3 : Generate CRUD with Bootstrap 3 views}'; + {--bs3 : Generate CRUD with Bootstrap 3 views} + {--uuid : Generate CRUD with UUID primary keys}'; /** * The console command description. diff --git a/src/CrudSimpleMake.php b/src/CrudSimpleMake.php index 3bdf7f1..7d38f96 100644 --- a/src/CrudSimpleMake.php +++ b/src/CrudSimpleMake.php @@ -14,7 +14,8 @@ class CrudSimpleMake extends GeneratorCommand {--t|tests-only : Generate CRUD testcases only} {--f|formfield : Generate CRUD with FormField facades} {--r|form-requests : Generate CRUD with Form Request on create and update actions} - {--bs3 : Generate CRUD with Bootstrap 3 views}'; + {--bs3 : Generate CRUD with Bootstrap 3 views} + {--uuid : Generate CRUD with UUID primary keys}'; /** * The console command description. diff --git a/src/Generators/MigrationGenerator.php b/src/Generators/MigrationGenerator.php index 7623ff5..f5772f8 100644 --- a/src/Generators/MigrationGenerator.php +++ b/src/Generators/MigrationGenerator.php @@ -28,6 +28,12 @@ class MigrationGenerator extends BaseGenerator */ public function getContent(string $stubName) { - return $this->replaceStubString($this->getStubFileContent($stubName)); + $content = $this->replaceStubString($this->getStubFileContent($stubName)); + + if ($this->command->option('uuid')) { + $content = str_replace("\$table->bigIncrements('id')", "\$table->uuid('id')", $content); + } + + return $content; } } diff --git a/src/Generators/ModelFactoryGenerator.php b/src/Generators/ModelFactoryGenerator.php index c1e47da..046adf4 100644 --- a/src/Generators/ModelFactoryGenerator.php +++ b/src/Generators/ModelFactoryGenerator.php @@ -41,6 +41,12 @@ class ModelFactoryGenerator extends BaseGenerator $modelFactoryFileContent = str_replace('App\User', $userModel, $modelFactoryFileContent); } + if ($this->command->option('uuid')) { + $string = "'title' => \$this->faker->word,\n"; + $replacement = "'id' => \$this->faker->uuid,\n 'title' => \$this->faker->word,\n"; + $modelFactoryFileContent = str_replace($string, $replacement, $modelFactoryFileContent); + } + return $this->replaceStubString($modelFactoryFileContent); } } diff --git a/src/Generators/ModelGenerator.php b/src/Generators/ModelGenerator.php index 79940a5..bf066ae 100644 --- a/src/Generators/ModelGenerator.php +++ b/src/Generators/ModelGenerator.php @@ -43,6 +43,14 @@ class ModelGenerator extends BaseGenerator $modelFileContent = str_replace('App\User', $userModel, $modelFileContent); } + if ($this->command->option('uuid')) { + $string = "protected \$fillable = ['title', 'description', 'creator_id'];\n"; + $replacement = "public \$incrementing = false;\n\n"; + $replacement .= " protected \$keyType = 'string';\n\n"; + $replacement .= " protected \$fillable = ['id', 'title', 'description', 'creator_id'];\n"; + $modelFileContent = str_replace($string, $replacement, $modelFileContent); + } + return $this->replaceStubString($modelFileContent); } } diff --git a/tests/CommandOptions/UuidOptionsTest.php b/tests/CommandOptions/UuidOptionsTest.php new file mode 100644 index 0000000..5a1cf9d --- /dev/null +++ b/tests/CommandOptions/UuidOptionsTest.php @@ -0,0 +1,134 @@ +artisan('make:crud', ['name' => $this->model_name, '--uuid' => true, '--no-interaction' => true]); + + $migrationFilePath = database_path('migrations/'.date('Y_m_d_His').'_create_'.$this->table_name.'_table.php'); + $this->assertFileExists($migrationFilePath); + $modelClassContent = "plural_model_name}Table extends Migration +{ + /** + * Run the migrations. + * + * @return void + */ + public function up() + { + Schema::create('{$this->table_name}', function (Blueprint \$table) { + \$table->uuid('id'); + \$table->string('title', 60); + \$table->string('description')->nullable(); + \$table->foreignId('creator_id')->constrained('users')->onDelete('restrict'); + \$table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('{$this->table_name}'); + } +} +"; + $this->assertEquals($modelClassContent, file_get_contents($migrationFilePath)); + } + /** @test */ + public function it_creates_correct_model_factory_content_for_uuid_primary_key() + { + $this->artisan('make:crud', ['name' => $this->model_name, '--uuid' => true, '--no-interaction' => true]); + + $modelFactoryPath = database_path('factories/'.$this->model_name.'Factory.php'); + $this->assertFileExists($modelFactoryPath); + $modelFactoryContent = "full_model_name}; +use Illuminate\Database\Eloquent\Factories\Factory; + +class {$this->model_name}Factory extends Factory +{ + protected \$model = {$this->model_name}::class; + + public function definition() + { + return [ + 'id' => \$this->faker->uuid, + 'title' => \$this->faker->word, + 'description' => \$this->faker->sentence, + 'creator_id' => function () { + return User::factory()->create()->id; + }, + ]; + } +} +"; + $this->assertEquals($modelFactoryContent, file_get_contents($modelFactoryPath)); + } + /** @test */ + public function it_creates_correct_model_class_content_for_uuid_primary_key() + { + config(['auth.providers.users.model' => 'App\Models\User']); + $this->artisan('make:crud', ['name' => $this->model_name, '--uuid' => true, '--no-interaction' => true]); + + $modelPath = app_path('Models/'.$this->model_name.'.php'); + $this->assertFileExists($modelPath); + $modelClassContent = "model_name} extends Model +{ + use HasFactory; + + public \$incrementing = false; + + protected \$keyType = 'string'; + + protected \$fillable = ['id', 'title', 'description', 'creator_id']; + + public function getTitleLinkAttribute() + { + \$title = __('app.show_detail_title', [ + 'title' => \$this->title, 'type' => __('{$this->lang_name}.{$this->lang_name}'), + ]); + \$link = 'table_name}.show', \$this).'\"'; + \$link .= ' title=\"'.\$title.'\">'; + \$link .= \$this->title; + \$link .= ''; + + return \$link; + } + + public function creator() + { + return \$this->belongsTo(User::class); + } +} +"; + $this->assertEquals($modelClassContent, file_get_contents($modelPath)); + } +}