Skip to content

Commit ca2b076

Browse files
committed
feat: add ModelMakeCommand with builder option and update service provider
1 parent 29b7ad7 commit ca2b076

File tree

4 files changed

+99
-3
lines changed

4 files changed

+99
-3
lines changed

composer.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@
3636
},
3737
"autoload": {
3838
"psr-4": {
39-
"MrPunyapal\\LaravelExtendedCommands\\": "src/",
40-
"MrPunyapal\\LaravelExtendedCommands\\Database\\Factories\\": "database/factories/"
39+
"MrPunyapal\\LaravelExtendedCommands\\": "src/"
4140
}
4241
},
4342
"autoload-dev": {

src/Commands/ModelMakeCommand.php

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
namespace MrPunyapal\LaravelExtendedCommands\Commands;
4+
5+
use Illuminate\Foundation\Console\ModelMakeCommand as BaseCommand;
6+
use Illuminate\Support\Str;
7+
use Symfony\Component\Console\Input\InputOption;
8+
9+
class ModelMakeCommand extends BaseCommand
10+
{
11+
/**
12+
* @inheritDoc
13+
*/
14+
public function handle()
15+
{
16+
parent::handle();
17+
18+
if ($this->option('builder')) {
19+
$this->createBuilder();
20+
}
21+
}
22+
23+
/**
24+
* Create a builder file for the model.
25+
*
26+
* @return void
27+
*/
28+
protected function createBuilder()
29+
{
30+
$builder = Str::studly($this->argument('name'));
31+
32+
$this->call('make:builder', [
33+
'name' => "{$builder}Builder",
34+
'--model' => '\\'.$this->qualifyClass($this->getNameInput()),
35+
]);
36+
}
37+
38+
/**
39+
* @inheritDoc
40+
*/
41+
protected function getOptions()
42+
{
43+
return array_merge(parent::getOptions(), [
44+
['builder', 'b', InputOption::VALUE_NONE, 'Create a new builder for the model'],
45+
]);
46+
}
47+
}

src/LaravelExtendedCommandsServiceProvider.php

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace MrPunyapal\LaravelExtendedCommands;
44

55
use MrPunyapal\LaravelExtendedCommands\Commands\BuilderMakeCommand;
6+
use MrPunyapal\LaravelExtendedCommands\Commands\ModelMakeCommand;
67
use Spatie\LaravelPackageTools\Package;
78
use Spatie\LaravelPackageTools\PackageServiceProvider;
89

@@ -18,6 +19,13 @@ public function configurePackage(Package $package): void
1819
$package
1920
->name('laravel-extended-commands')
2021
->hasConfigFile()
21-
->hasCommand(BuilderMakeCommand::class);
22+
->hasCommands([
23+
BuilderMakeCommand::class,
24+
ModelMakeCommand::class,
25+
]);
26+
27+
$this->app->extend('command.model.make', function ($app) {
28+
return new ModelMakeCommand($app['files']);
29+
});
2230
}
2331
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
use Orchestra\Testbench\Concerns\InteractsWithPublishedFiles;
4+
5+
uses(InteractsWithPublishedFiles::class);
6+
7+
beforeEach(function () {
8+
$this->files = [
9+
'app/Models/Foo.php',
10+
'app/Models/Builders/FooBuilder.php',
11+
];
12+
});
13+
14+
it('can generate model file', function () {
15+
$this->artisan('make:model', ['name' => 'Foo'])
16+
->assertExitCode(0);
17+
18+
$this->assertFileContains([
19+
'namespace App\Models;',
20+
'class Foo extends Model',
21+
], 'app/Models/Foo.php');
22+
23+
$this->assertFilenameNotExists('app/Models/Builders/FooBuilder.php');
24+
});
25+
26+
it('can generate model with builder', function (): void {
27+
$this->artisan('make:model', ['name' => 'Foo', '--builder' => true])
28+
->assertExitCode(0);
29+
30+
$this->assertFileContains([
31+
'namespace App\Models;',
32+
'class Foo extends Model',
33+
], 'app/Models/Foo.php');
34+
35+
$this->assertFileContains([
36+
'namespace App\Models\Builders;',
37+
'use Illuminate\Database\Eloquent\Builder;',
38+
'class FooBuilder extends Builder',
39+
'@template TModel of \\App\\Models\\Foo',
40+
'@extends Builder<\\App\\Models\\Foo>',
41+
], 'app/Models/Builders/FooBuilder.php');
42+
});

0 commit comments

Comments
 (0)