63 lines
1.7 KiB
PHP
63 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace Illuminate\Database\Eloquent\Factories;
|
|
|
|
use Illuminate\Database\Eloquent\Attributes\UseFactory;
|
|
|
|
/**
|
|
* @template TFactory of \Illuminate\Database\Eloquent\Factories\Factory
|
|
*/
|
|
trait HasFactory
|
|
{
|
|
/**
|
|
* Get a new factory instance for the model.
|
|
*
|
|
* @param (callable(array<string, mixed>, static|null): array<string, mixed>)|array<string, mixed>|int|null $count
|
|
* @param (callable(array<string, mixed>, static|null): array<string, mixed>)|array<string, mixed> $state
|
|
* @return TFactory
|
|
*/
|
|
public static function factory($count = null, $state = [])
|
|
{
|
|
$factory = static::newFactory() ?? Factory::factoryForModel(static::class);
|
|
|
|
return $factory
|
|
->count(is_numeric($count) ? $count : null)
|
|
->state(is_callable($count) || is_array($count) ? $count : $state);
|
|
}
|
|
|
|
/**
|
|
* Create a new factory instance for the model.
|
|
*
|
|
* @return TFactory|null
|
|
*/
|
|
protected static function newFactory()
|
|
{
|
|
if (isset(static::$factory)) {
|
|
return static::$factory::new();
|
|
}
|
|
|
|
return static::getUseFactoryAttribute() ?? null;
|
|
}
|
|
|
|
/**
|
|
* Get the factory from the UseFactory class attribute.
|
|
*
|
|
* @return TFactory|null
|
|
*/
|
|
protected static function getUseFactoryAttribute()
|
|
{
|
|
$attributes = (new \ReflectionClass(static::class))
|
|
->getAttributes(UseFactory::class);
|
|
|
|
if ($attributes !== []) {
|
|
$useFactory = $attributes[0]->newInstance();
|
|
|
|
$factory = new $useFactory->factoryClass;
|
|
|
|
$factory->guessModelNamesUsing(fn () => static::class);
|
|
|
|
return $factory;
|
|
}
|
|
}
|
|
}
|