| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- <?php
- namespace Illuminate\Database\Console\Factories;
- use Illuminate\Console\GeneratorCommand;
- use Illuminate\Support\Str;
- use Symfony\Component\Console\Attribute\AsCommand;
- use Symfony\Component\Console\Input\InputOption;
- #[AsCommand(name: 'make:factory')]
- class FactoryMakeCommand extends GeneratorCommand
- {
- /**
- * The console command name.
- *
- * @var string
- */
- protected $name = 'make:factory';
- /**
- * The console command description.
- *
- * @var string
- */
- protected $description = 'Create a new model factory';
- /**
- * The type of class being generated.
- *
- * @var string
- */
- protected $type = 'Factory';
- /**
- * Get the stub file for the generator.
- *
- * @return string
- */
- protected function getStub()
- {
- return $this->resolveStubPath('/stubs/factory.stub');
- }
- /**
- * Resolve the fully-qualified path to the stub.
- *
- * @param string $stub
- * @return string
- */
- protected function resolveStubPath($stub)
- {
- return file_exists($customPath = $this->laravel->basePath(trim($stub, '/')))
- ? $customPath
- : __DIR__.$stub;
- }
- /**
- * Build the class with the given name.
- *
- * @param string $name
- * @return string
- */
- protected function buildClass($name)
- {
- $factory = class_basename(Str::ucfirst(str_replace('Factory', '', $name)));
- $namespaceModel = $this->option('model')
- ? $this->qualifyModel($this->option('model'))
- : $this->qualifyModel($this->guessModelName($name));
- $model = class_basename($namespaceModel);
- $namespace = $this->getNamespace(
- Str::replaceFirst($this->rootNamespace(), 'Database\\Factories\\', $this->qualifyClass($this->getNameInput()))
- );
- $replace = [
- '{{ factoryNamespace }}' => $namespace,
- 'NamespacedDummyModel' => $namespaceModel,
- '{{ namespacedModel }}' => $namespaceModel,
- '{{namespacedModel}}' => $namespaceModel,
- 'DummyModel' => $model,
- '{{ model }}' => $model,
- '{{model}}' => $model,
- '{{ factory }}' => $factory,
- '{{factory}}' => $factory,
- ];
- return str_replace(
- array_keys($replace), array_values($replace), parent::buildClass($name)
- );
- }
- /**
- * Get the destination class path.
- *
- * @param string $name
- * @return string
- */
- protected function getPath($name)
- {
- $name = (string) Str::of($name)->replaceFirst($this->rootNamespace(), '')->finish('Factory');
- return $this->laravel->databasePath().'/factories/'.str_replace('\\', '/', $name).'.php';
- }
- /**
- * Guess the model name from the Factory name or return a default model name.
- *
- * @param string $name
- * @return string
- */
- protected function guessModelName($name)
- {
- if (str_ends_with($name, 'Factory')) {
- $name = substr($name, 0, -7);
- }
- $modelName = $this->qualifyModel(Str::after($name, $this->rootNamespace()));
- if (class_exists($modelName)) {
- return $modelName;
- }
- if (is_dir(app_path('Models/'))) {
- return $this->rootNamespace().'Models\Model';
- }
- return $this->rootNamespace().'Model';
- }
- /**
- * Get the console command options.
- *
- * @return array
- */
- protected function getOptions()
- {
- return [
- ['model', 'm', InputOption::VALUE_OPTIONAL, 'The name of the model'],
- ];
- }
- }
|