layfi-earn/vendor/illuminate/database/Eloquent/Factories/HasFactory.php

63 lines
1.7 KiB
PHP
Raw Normal View History

2025-01-27 20:49:47 +08:00
<?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;
}
}
}