master

laravel/framework

Last updated at: 29/12/2023 09:22

ResourceMakeCommand.php

TLDR

This file ResourceMakeCommand.php is a part of the Illuminate\Foundation\Console namespace in the Demo Projects project. It is used to create a new resource in the project.

Methods

handle

This method executes the console command. It checks if the command is generating a resource collection and sets the type accordingly. It then calls the parent handle method.

getStub

This method returns the stub file path for the generator. Based on whether the command is generating a resource collection or not, it resolves the stub path accordingly.

collection

This method determines if the command is generating a resource collection by checking the command options and the provided name.

resolveStubPath

This method resolves the fully-qualified path to the stub file. It checks if a custom stub path exists in the Laravel application or falls back to the default stub path.

getDefaultNamespace

This method returns the default namespace for the generated resource class.

getOptions

This method returns an array of console command options including force and collection options.

Classes

Class ResourceMakeCommand

This class extends the GeneratorCommand class and is used to create a new resource in the Laravel project. It sets the command name, description, and type. It implements the handle method to execute the command, and provides other helper methods to determine the stub file path, default namespace, and available command options.

<?php

namespace Illuminate\Foundation\Console;

use Illuminate\Console\GeneratorCommand;
use Symfony\Component\Console\Attribute\AsCommand;
use Symfony\Component\Console\Input\InputOption;

#[AsCommand(name: 'make:resource')]
class ResourceMakeCommand extends GeneratorCommand
{
    /**
     * The console command name.
     *
     * @var string
     */
    protected $name = 'make:resource';

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

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

    /**
     * Execute the console command.
     *
     * @return void
     */
    public function handle()
    {
        if ($this->collection()) {
            $this->type = 'Resource collection';
        }

        parent::handle();
    }

    /**
     * Get the stub file for the generator.
     *
     * @return string
     */
    protected function getStub()
    {
        return $this->collection()
                    ? $this->resolveStubPath('/stubs/resource-collection.stub')
                    : $this->resolveStubPath('/stubs/resource.stub');
    }

    /**
     * Determine if the command is generating a resource collection.
     *
     * @return bool
     */
    protected function collection()
    {
        return $this->option('collection') ||
               str_ends_with($this->argument('name'), 'Collection');
    }

    /**
     * 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 $rootNamespace.'\Http\Resources';
    }

    /**
     * Get the console command options.
     *
     * @return array
     */
    protected function getOptions()
    {
        return [
            ['force', 'f', InputOption::VALUE_NONE, 'Create the class even if the resource already exists'],
            ['collection', 'c', InputOption::VALUE_NONE, 'Create a resource collection'],
        ];
    }
}