Skip to content

Commit 0feef93

Browse files
authored
Merge pull request #40902 from axlon/patch-3
[9.x] Improve types on model factory methods
2 parents 589f55d + e22ec12 commit 0feef93

File tree

2 files changed

+38
-10
lines changed

2 files changed

+38
-10
lines changed

src/Illuminate/Database/Eloquent/Factories/Factory.php

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ abstract public function definition();
148148
/**
149149
* Get a new factory instance for the given attributes.
150150
*
151-
* @param (callable(): array<string, mixed>)|array<string, mixed> $attributes
151+
* @param (callable(array<string, mixed>): array<string, mixed>)|array<string, mixed> $attributes
152152
* @return static
153153
*/
154154
public static function new($attributes = [])
@@ -180,7 +180,7 @@ public function configure()
180180
/**
181181
* Get the raw attributes generated by the factory.
182182
*
183-
* @param array<string, mixed> $attributes
183+
* @param (callable(array<string, mixed>): array<string, mixed>)|array<string, mixed> $attributes
184184
* @param \Illuminate\Database\Eloquent\Model|null $parent
185185
* @return array<int|string, mixed>
186186
*/
@@ -198,7 +198,7 @@ public function raw($attributes = [], ?Model $parent = null)
198198
/**
199199
* Create a single model and persist it to the database.
200200
*
201-
* @param array<string, mixed> $attributes
201+
* @param (callable(array<string, mixed>): array<string, mixed>)|array<string, mixed> $attributes
202202
* @return \Illuminate\Database\Eloquent\Model|TModel
203203
*/
204204
public function createOne($attributes = [])
@@ -209,7 +209,7 @@ public function createOne($attributes = [])
209209
/**
210210
* Create a single model and persist it to the database.
211211
*
212-
* @param array<string, mixed> $attributes
212+
* @param (callable(array<string, mixed>): array<string, mixed>)|array<string, mixed> $attributes
213213
* @return \Illuminate\Database\Eloquent\Model|TModel
214214
*/
215215
public function createOneQuietly($attributes = [])
@@ -248,7 +248,7 @@ public function createManyQuietly(iterable $records)
248248
/**
249249
* Create a collection of models and persist them to the database.
250250
*
251-
* @param array<string, mixed> $attributes
251+
* @param (callable(array<string, mixed>): array<string, mixed>)|array<string, mixed> $attributes
252252
* @param \Illuminate\Database\Eloquent\Model|null $parent
253253
* @return \Illuminate\Database\Eloquent\Collection<int, \Illuminate\Database\Eloquent\Model|TModel>|\Illuminate\Database\Eloquent\Model|TModel
254254
*/
@@ -338,7 +338,7 @@ protected function createChildren(Model $model)
338338
/**
339339
* Make a single instance of the model.
340340
*
341-
* @param (callable(): array<string, mixed>)|array<string, mixed> $attributes
341+
* @param (callable(array<string, mixed>): array<string, mixed>)|array<string, mixed> $attributes
342342
* @return \Illuminate\Database\Eloquent\Model|TModel
343343
*/
344344
public function makeOne($attributes = [])
@@ -349,7 +349,7 @@ public function makeOne($attributes = [])
349349
/**
350350
* Create a collection of models.
351351
*
352-
* @param array<string, mixed> $attributes
352+
* @param (callable(array<string, mixed>): array<string, mixed>)|array<string, mixed> $attributes
353353
* @param \Illuminate\Database\Eloquent\Model|null $parent
354354
* @return \Illuminate\Database\Eloquent\Collection<int, \Illuminate\Database\Eloquent\Model|TModel>|\Illuminate\Database\Eloquent\Model|TModel
355355
*/
@@ -469,7 +469,7 @@ protected function expandAttributes(array $definition)
469469
/**
470470
* Add a new state transformation to the model definition.
471471
*
472-
* @param (callable(): array<string, mixed>)|array<string, mixed> $state
472+
* @param (callable(array<string, mixed>): array<string, mixed>)|array<string, mixed> $state
473473
* @return static
474474
*/
475475
public function state($state)

types/Database/Eloquent/Factories/Factory.php

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,12 @@ public function definition()
2828
}
2929
}
3030

31-
$factory = UserFactory::new();
32-
assertType('UserFactory', $factory);
31+
assertType('UserFactory', $factory = UserFactory::new());
32+
assertType('UserFactory', UserFactory::new(['string' => 'string']));
33+
assertType('UserFactory', UserFactory::new(function ($attributes) {
34+
// assertType('array<string, mixed>', $attributes);
35+
return ['string' => 'string'];
36+
}));
3337

3438
assertType('array<string, mixed>', $factory->definition());
3539

@@ -39,16 +43,28 @@ public function definition()
3943

4044
assertType('array<int|string, mixed>', $factory->raw());
4145
assertType('array<int|string, mixed>', $factory->raw(['string' => 'string']));
46+
assertType('array<int|string, mixed>', $factory->raw(function ($attributes) {
47+
// assert('array<string, mixed>', $attributes);
48+
return ['string' => 'string'];
49+
}));
4250

4351
// assertType('User', $factory->createOne());
4452
// assertType('User', $factory->createOne(['string' => 'string']));
4553
assertType('Illuminate\Database\Eloquent\Model', $factory->createOne());
4654
assertType('Illuminate\Database\Eloquent\Model', $factory->createOne(['string' => 'string']));
55+
assertType('Illuminate\Database\Eloquent\Model', $factory->createOne(function ($attributes) {
56+
// assertType('array<string, mixed>', $attributes);
57+
return ['string' => 'string'];
58+
}));
4759

4860
// assertType('User', $factory->createOneQuietly());
4961
// assertType('User', $factory->createOneQuietly(['string' => 'string']));
5062
assertType('Illuminate\Database\Eloquent\Model', $factory->createOneQuietly());
5163
assertType('Illuminate\Database\Eloquent\Model', $factory->createOneQuietly(['string' => 'string']));
64+
assertType('Illuminate\Database\Eloquent\Model', $factory->createOneQuietly(function ($attributes) {
65+
// assertType('array<string, mixed>', $attributes);
66+
return ['string' => 'string'];
67+
}));
5268

5369
// assertType('Illuminate\Database\Eloquent\Collection<int, User>', $factory->createMany([['string' => 'string']]));
5470
assertType('Illuminate\Database\Eloquent\Collection<int, Illuminate\Database\Eloquent\Model>', $factory->createMany(
@@ -68,6 +84,10 @@ public function definition()
6884
assertType('Illuminate\Database\Eloquent\Collection<int, Illuminate\Database\Eloquent\Model>|Illuminate\Database\Eloquent\Model', $factory->create([
6985
'string' => 'string',
7086
]));
87+
assertType('Illuminate\Database\Eloquent\Collection<int, Illuminate\Database\Eloquent\Model>|Illuminate\Database\Eloquent\Model', $factory->create(function ($attributes) {
88+
// assertType('array<string, mixed>', $attributes);
89+
return ['string' => 'string'];
90+
}));
7191

7292
// assertType('Illuminate\Database\Eloquent\Collection<int, User>|User', $factory->createQuietly());
7393
// assertType('Illuminate\Database\Eloquent\Collection<int, User>|User', $factory->createQuietly([
@@ -95,6 +115,10 @@ public function definition()
95115
assertType('Illuminate\Database\Eloquent\Model', $factory->makeOne([
96116
'string' => 'string',
97117
]));
118+
assertType('Illuminate\Database\Eloquent\Model', $factory->makeOne(function ($attributes) {
119+
// assert('array<string, mixed>', $attributes);
120+
return ['string' => 'string'];
121+
}));
98122

99123
// assertType('Illuminate\Database\Eloquent\Collection<int, User>|User', $factory->make());
100124
// assertType('Illuminate\Database\Eloquent\Collection<int, User>|User', $factory->make([
@@ -104,6 +128,10 @@ public function definition()
104128
assertType('Illuminate\Database\Eloquent\Collection<int, Illuminate\Database\Eloquent\Model>|Illuminate\Database\Eloquent\Model', $factory->make([
105129
'string' => 'string',
106130
]));
131+
assertType('Illuminate\Database\Eloquent\Collection<int, Illuminate\Database\Eloquent\Model>|Illuminate\Database\Eloquent\Model', $factory->make(function ($attributes) {
132+
// assert('array<string, mixed>', $attributes);
133+
return ['string' => 'string'];
134+
}));
107135

108136
assertType('UserFactory', $factory->state(['string' => 'string']));
109137
assertType('UserFactory', $factory->state(function () {

0 commit comments

Comments
 (0)