Skip to content

Commit 2f61602

Browse files
authored
Support both customized namespace factories as well as default resolvable ones (#1201)
1 parent c8ebf56 commit 2f61602

File tree

7 files changed

+117
-35
lines changed

7 files changed

+117
-35
lines changed

src/Console/ModelsCommand.php

+5-6
Original file line numberDiff line numberDiff line change
@@ -1091,18 +1091,17 @@ protected function getFactoryMethods($model)
10911091
return;
10921092
}
10931093

1094-
$traits = class_uses(get_class($model), true);
1094+
$modelName = get_class($model);
1095+
1096+
$traits = class_uses($modelName, true);
10951097
if (!in_array('Illuminate\\Database\\Eloquent\\Factories\\HasFactory', $traits)) {
10961098
return;
10971099
}
10981100

1099-
$modelName = get_class($model);
1100-
$modelBaseName = class_basename($modelName);
1101-
1102-
$factory = "\Database\Factories\\{$modelBaseName}Factory";
1103-
11041101
if ($modelName::newFactory()) {
11051102
$factory = get_class($modelName::newFactory());
1103+
} else {
1104+
$factory = Factory::resolveFactoryName($modelName);
11061105
}
11071106

11081107
$factory = '\\' . trim($factory, '\\');
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\CustomSpace;
6+
7+
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\ModelWithCustomNamespace;
8+
use Illuminate\Database\Eloquent\Factories\Factory;
9+
10+
class ModelWithCustomNamespaceFactory extends Factory
11+
{
12+
/**
13+
* The name of the factory's corresponding model.
14+
*
15+
* @var string
16+
*/
17+
protected $model = ModelWithCustomNamespace::class;
18+
19+
/**
20+
* Define the model's default state.
21+
*
22+
* @return array
23+
*/
24+
public function definition()
25+
{
26+
return [
27+
//
28+
];
29+
}
30+
}

tests/Console/ModelsCommand/Factories/Factories/SimpleFactory.php tests/Console/ModelsCommand/Factories/Factories/ModelWithFactoryFactory.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,17 @@
44

55
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Factories;
66

7-
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Getter\Models\Simple;
7+
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\ModelWithFactory;
88
use Illuminate\Database\Eloquent\Factories\Factory;
99

10-
class SimpleFactory extends Factory
10+
class ModelWithFactoryFactory extends Factory
1111
{
1212
/**
1313
* The name of the factory's corresponding model.
1414
*
1515
* @var string
1616
*/
17-
protected $model = Simple::class;
17+
protected $model = ModelWithFactory::class;
1818

1919
/**
2020
* Define the model's default state.

tests/Console/ModelsCommand/Factories/Models/Simple.php tests/Console/ModelsCommand/Factories/Models/ModelWithCustomNamespace.php

+3-3
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44

55
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
66

7-
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Factories\SimpleFactory;
7+
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\CustomSpace\ModelWithCustomNamespaceFactory;
88
use Illuminate\Database\Eloquent\Factories\HasFactory;
99
use Illuminate\Database\Eloquent\Model;
1010

11-
class Simple extends Model
11+
class ModelWithCustomNamespace extends Model
1212
{
1313
use HasFactory;
1414

@@ -19,6 +19,6 @@ class Simple extends Model
1919
*/
2020
protected static function newFactory()
2121
{
22-
return SimpleFactory::new();
22+
return ModelWithCustomNamespaceFactory::new();
2323
}
2424
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
6+
7+
use Illuminate\Database\Eloquent\Factories\HasFactory;
8+
use Illuminate\Database\Eloquent\Model;
9+
10+
class ModelWithFactory extends Model
11+
{
12+
use HasFactory;
13+
}

tests/Console/ModelsCommand/Factories/Test.php

+20
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,10 @@
66

77
use Barryvdh\LaravelIdeHelper\Console\ModelsCommand;
88
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\AbstractModelsCommand;
9+
use Closure;
10+
use Illuminate\Database\Eloquent\Factories\Factory;
911
use Illuminate\Foundation\Application;
12+
use Illuminate\Support\Str;
1013

1114
class Test extends AbstractModelsCommand
1215
{
@@ -18,6 +21,8 @@ public function test(): void
1821
);
1922
}
2023

24+
Factory::guessFactoryNamesUsing(static::getFactoryNameResolver());
25+
2126
$command = $this->app->make(ModelsCommand::class);
2227

2328
$tester = $this->runCommand($command, [
@@ -29,4 +34,19 @@ public function test(): void
2934
$this->assertStringNotContainsString('not found', $tester->getDisplay());
3035
$this->assertMatchesMockedSnapshot();
3136
}
37+
38+
public static function getFactoryNameResolver(): Closure
39+
{
40+
// This mimics the default resolver, but with adjusted test namespaces.
41+
// Illuminate\Database\Eloquent\Factories\Factory::resolveFactoryName
42+
return function (string $modelName): string {
43+
$appNamespace = 'Barryvdh\\LaravelIdeHelper\\Tests\\Console\\ModelsCommand\\Factories\\';
44+
45+
$modelName = Str::startsWith($modelName, $appNamespace . 'Models\\')
46+
? Str::after($modelName, $appNamespace . 'Models\\')
47+
: Str::after($modelName, $appNamespace);
48+
49+
return $appNamespace . 'Factories\\' . $modelName . 'Factory';
50+
};
51+
}
3252
}

tests/Console/ModelsCommand/Factories/__snapshots__/Test__test__1.php

+43-23
Original file line numberDiff line numberDiff line change
@@ -4,53 +4,73 @@
44

55
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
66

7+
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\CustomSpace\ModelWithCustomNamespaceFactory;
78
use Illuminate\Database\Eloquent\Factories\HasFactory;
89
use Illuminate\Database\Eloquent\Model;
910

1011
/**
11-
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\ModelWithoutFactory
12+
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\ModelWithCustomNamespace
1213
*
13-
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithoutFactory newModelQuery()
14-
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithoutFactory newQuery()
15-
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithoutFactory query()
14+
* @method static \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\CustomSpace\ModelWithCustomNamespaceFactory factory(...$parameters)
15+
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithCustomNamespace newModelQuery()
16+
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithCustomNamespace newQuery()
17+
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithCustomNamespace query()
1618
* @mixin \Eloquent
1719
*/
18-
class ModelWithoutFactory extends Model
20+
class ModelWithCustomNamespace extends Model
1921
{
2022
use HasFactory;
23+
24+
/**
25+
* Create a new factory instance for the model.
26+
*
27+
* @return \Illuminate\Database\Eloquent\Factories\Factory
28+
*/
29+
protected static function newFactory()
30+
{
31+
return ModelWithCustomNamespaceFactory::new();
32+
}
2133
}
2234
<?php
2335

2436
declare(strict_types=1);
2537

2638
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
2739

28-
use Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Factories\SimpleFactory;
2940
use Illuminate\Database\Eloquent\Factories\HasFactory;
3041
use Illuminate\Database\Eloquent\Model;
3142

3243
/**
33-
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\Simple
44+
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\ModelWithFactory
3445
*
35-
* @property integer $id
36-
* @method static \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Factories\SimpleFactory factory(...$parameters)
37-
* @method static \Illuminate\Database\Eloquent\Builder|Simple newModelQuery()
38-
* @method static \Illuminate\Database\Eloquent\Builder|Simple newQuery()
39-
* @method static \Illuminate\Database\Eloquent\Builder|Simple query()
40-
* @method static \Illuminate\Database\Eloquent\Builder|Simple whereId($value)
46+
* @method static \Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Factories\ModelWithFactoryFactory factory(...$parameters)
47+
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithFactory newModelQuery()
48+
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithFactory newQuery()
49+
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithFactory query()
4150
* @mixin \Eloquent
4251
*/
43-
class Simple extends Model
52+
class ModelWithFactory extends Model
4453
{
4554
use HasFactory;
55+
}
56+
<?php
4657

47-
/**
48-
* Create a new factory instance for the model.
49-
*
50-
* @return \Illuminate\Database\Eloquent\Factories\Factory
51-
*/
52-
protected static function newFactory()
53-
{
54-
return SimpleFactory::new();
55-
}
58+
declare(strict_types=1);
59+
60+
namespace Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models;
61+
62+
use Illuminate\Database\Eloquent\Factories\HasFactory;
63+
use Illuminate\Database\Eloquent\Model;
64+
65+
/**
66+
* Barryvdh\LaravelIdeHelper\Tests\Console\ModelsCommand\Factories\Models\ModelWithoutFactory
67+
*
68+
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithoutFactory newModelQuery()
69+
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithoutFactory newQuery()
70+
* @method static \Illuminate\Database\Eloquent\Builder|ModelWithoutFactory query()
71+
* @mixin \Eloquent
72+
*/
73+
class ModelWithoutFactory extends Model
74+
{
75+
use HasFactory;
5676
}

0 commit comments

Comments
 (0)