PHP 8.3.31
Preview: ModelMakeCommand.php Size: 9.49 KB
/home/getspomw/royalsquad.us/vendor/laravel/framework/src/Illuminate/Foundation/Console/ModelMakeCommand.php

<?php

namespace Illuminate\Foundation\Console;

use Illuminate\Console\Concerns\CreatesMatchingTest;
use Illuminate\Console\GeneratorCommand;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Input\InputInterface;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Output\OutputInterface;

use function Laravel\Prompts\multiselect;

#[AsCommand(name: 'make:model')]
class ModelMakeCommand extends GeneratorCommand
{
    use CreatesMatchingTest;

    /**
     * The console command name.
     *
     * @var string
     */
    protected $name = 'make:model';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Create a new Eloquent model class';

    /**
     * The type of class being generated.
     *
     * @var string
     */
    protected $type = 'Model';

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function handle()
    {
        if (parent::handle() === false && ! $this->option('force')) {
            return false;
        }

        if ($this->option('all')) {
            $this->input->setOption('factory', true);
            $this->input->setOption('seed', true);
            $this->input->setOption('migration', true);
            $this->input->setOption('controller', true);
            $this->input->setOption('policy', true);
            $this->input->setOption('resource', true);
        }

        if ($this->option('factory')) {
            $this->createFactory();
        }

        if ($this->option('migration')) {
            $this->createMigration();
        }

        if ($this->option('seed')) {
            $this->createSeeder();
        }

        if ($this->option('controller') || $this->option('resource') || $this->option('api')) {
            $this->createController();
        } elseif ($this->option('requests')) {
            $this->createFormRequests();
        }

        if ($this->option('policy')) {
            $this->createPolicy();
        }
    }

    /**
     * Create a model factory for the model.
     *
     * @return void
     */
    protected function createFactory()
    {
        $factory = Str::studly($this->argument('name'));

        $this->call('make:factory', [
            'name' => "{$factory}Factory",
            '--model' => $this->qualifyClass($this->getNameInput()),
        ]);
    }

    /**
     * Create a migration file for the model.
     *
     * @return void
     */
    protected function createMigration()
    {
        $table = Str::snake(Str::pluralStudly(class_basename($this->argument('name'))));

        if ($this->option('pivot')) {
            $table = Str::singular($table);
        }

        $this->call('make:migration', [
            'name' => "create_{$table}_table",
            '--create' => $table,
        ]);
    }

    /**
     * Create a seeder file for the model.
     *
     * @return void
     */
    protected function createSeeder()
    {
        $seeder = Str::studly(class_basename($this->argument('name')));

        $this->call('make:seeder', [
            'name' => "{$seeder}Seeder",
        ]);
    }

    /**
     * Create a controller for the model.
     *
     * @return void
     */
    protected function createController()
    {
        $controller = Str::studly(class_basename($this->argument('name')));

        $modelName = $this->qualifyClass($this->getNameInput());

        $this->call('make:controller', array_filter([
            'name' => "{$controller}Controller",
            '--model' => $this->option('resource') || $this->option('api') ? $modelName : null,
            '--api' => $this->option('api'),
            '--requests' => $this->option('requests') || $this->option('all'),
            '--test' => $this->option('test'),
            '--pest' => $this->option('pest'),
        ]));
    }

    /**
     * Create the form requests for the model.
     *
     * @return void
     */
    protected function createFormRequests()
    {
        $request = Str::studly(class_basename($this->argument('name')));

        $this->call('make:request', [
            'name' => "Store{$request}Request",
        ]);

        $this->call('make:request', [
            'name' => "Update{$request}Request",
        ]);
    }

    /**
     * Create a policy file for the model.
     *
     * @return void
     */
    protected function createPolicy()
    {
        $policy = Str::studly(class_basename($this->argument('name')));

        $this->call('make:policy', [
            'name' => "{$policy}Policy",
            '--model' => $this->qualifyClass($this->getNameInput()),
        ]);
    }

    /**
     * Get the stub file for the generator.
     *
     * @return string
     */
    protected function getStub()
    {
        if ($this->option('pivot')) {
            return $this->resolveStubPath('/stubs/model.pivot.stub');
        }

        if ($this->option('morph-pivot')) {
            return $this->resolveStubPath('/stubs/model.morph-pivot.stub');
        }

        return $this->resolveStubPath('/stubs/model.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;
    }

    /**
     * Get the default namespace for the class.
     *
     * @param  string  $rootNamespace
     * @return string
     */
    protected function getDefaultNamespace($rootNamespace)
    {
        return is_dir(app_path('Models')) ? $rootNamespace.'\\Models' : $rootNamespace;
    }

    /**
     * Build the class with the given name.
     *
     * @param  string  $name
     * @return string
     *
     * @throws \Illuminate\Contracts\Filesystem\FileNotFoundException
     */
    protected function buildClass($name)
    {
        $replace = $this->buildFactoryReplacements();

        return str_replace(
            array_keys($replace), array_values($replace), parent::buildClass($name)
        );
    }

    /**
     * Build the replacements for a factory.
     *
     * @return array<string, string>
     */
    protected function buildFactoryReplacements()
    {
        $replacements = [];

        if ($this->option('factory') || $this->option('all')) {
            $modelPath = Str::of($this->argument('name'))->studly()->replace('/', '\\')->toString();

            $factoryNamespace = '\\Database\\Factories\\'.$modelPath.'Factory';

            $factoryCode = <<<EOT
            /** @use HasFactory<$factoryNamespace> */
                use HasFactory;
            EOT;

            $replacements['{{ factory }}'] = $factoryCode;
            $replacements['{{ factoryImport }}'] = 'use Illuminate\Database\Eloquent\Factories\HasFactory;';
        } else {
            $replacements['{{ factory }}'] = '//';
            $replacements["{{ factoryImport }}\n"] = '';
            $replacements["{{ factoryImport }}\r\n"] = '';
        }

        return $replacements;
    }

    /**
     * Get the console command options.
     *
     * @return array
     */
    protected function getOptions()
    {
        return [
            ['all', 'a', InputOption::VALUE_NONE, 'Generate a migration, seeder, factory, policy, resource controller, and form request classes for the model'],
            ['controller', 'c', InputOption::VALUE_NONE, 'Create a new controller for the model'],
            ['factory', 'f', InputOption::VALUE_NONE, 'Create a new factory for the model'],
            ['force', null, InputOption::VALUE_NONE, 'Create the class even if the model already exists'],
            ['migration', 'm', InputOption::VALUE_NONE, 'Create a new migration file for the model'],
            ['morph-pivot', null, InputOption::VALUE_NONE, 'Indicates if the generated model should be a custom polymorphic intermediate table model'],
            ['policy', null, InputOption::VALUE_NONE, 'Create a new policy for the model'],
            ['seed', 's', InputOption::VALUE_NONE, 'Create a new seeder for the model'],
            ['pivot', 'p', InputOption::VALUE_NONE, 'Indicates if the generated model should be a custom intermediate table model'],
            ['resource', 'r', InputOption::VALUE_NONE, 'Indicates if the generated controller should be a resource controller'],
            ['api', null, InputOption::VALUE_NONE, 'Indicates if the generated controller should be an API resource controller'],
            ['requests', 'R', InputOption::VALUE_NONE, 'Create new form request classes and use them in the resource controller'],
        ];
    }

    /**
     * Interact further with the user if they were prompted for missing arguments.
     *
     * @param  \Symfony\Component\Console\Input\InputInterface  $input
     * @param  \Symfony\Component\Console\Output\OutputInterface  $output
     * @return void
     */
    protected function afterPromptingForMissingArguments(InputInterface $input, OutputInterface $output)
    {
        if ($this->isReservedName($this->getNameInput()) || $this->didReceiveOptions($input)) {
            return;
        }

        (new Collection(multiselect('Would you like any of the following?', [
            'seed' => 'Database Seeder',
            'factory' => 'Factory',
            'requests' => 'Form Requests',
            'migration' => 'Migration',
            'policy' => 'Policy',
            'resource' => 'Resource Controller',
        ])))->each(fn ($option) => $input->setOption($option, true));
    }
}

Directory Contents

Dirs: 1 × Files: 64

Name Size Perms Modified Actions
stubs DIR
- drwxrwxrwx 2025-09-17 06:52:55
Edit Download
9.83 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
4.96 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
6.75 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.85 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
4.29 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.67 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.60 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
948 B lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
3.28 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
2.93 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
4.56 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
2.12 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.16 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
3.11 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
2.89 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
2.47 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
13.40 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
4.88 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
3.56 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
726 B lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
3.87 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
3.84 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.46 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.19 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
2.07 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
5.66 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.96 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
2.91 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.07 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.52 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.94 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.81 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
16.53 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
3.16 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.82 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
4.16 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
5.98 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
9.49 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
4.47 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
4.42 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
2.06 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
2.04 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.05 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
6.01 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
2.21 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.01 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.69 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
2.39 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
2.73 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.14 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
15.29 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
2.00 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.70 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
11.62 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
2.06 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.21 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
5.88 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
3.90 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.81 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.41 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
10.76 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
2.82 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
1.52 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download
6.16 KB lrw-rw-rw- 2025-09-17 06:52:55
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).