user12664329
user12664329

Reputation:

Generate multiple files with laravel command

could you help me with a problem that I have? I have created a command with php artisan make:command to generate repository type classes from existing models. The problem is that I need that instead of generating a single file from a stub, I need to generate 2 or more files. I can't find documentation regarding the subject. Currently what I have achieved is that I only generate a single file from a template.

<?php

namespace App\Console\Commands;

use Illuminate\Console\GeneratorCommand;
use Symfony\Component\Console\Input\InputArgument;

class MakeRepository extends GeneratorCommand
{
    /**
     * The console command name.
     *
     * @var string
     */
    protected $name = 'make:repository';

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

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

    /**
     * @inheritDoc
     */
    protected function getStub()
    {
        return __DIR__ . '/stubs/MakeRepository/ModelRepositoryInterface.stub';
    }

    /**
     * Get the console command arguments.
     *
     * @return array
     */
    protected function getArguments()
    {
        return [
            ['name', InputArgument::REQUIRED, 'The name of the model to which the repository will be generated'],
        ];
    }

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

EDIT #1

I have 2 stub files inside the directory:

app/Console/Commands/stubs/MakeRepository

ModelRepository.stub
ModelRepositoryInterface.stub

I want that when you execute the command...ex: php artisan make:repository Blog, these 2 files are created in the following directory:

/app/Repositories/Blog/BlogRepository.php
/app/Repositories/Blog/BlogRepositoryInterface.php

Upvotes: 6

Views: 2662

Answers (2)

Puckwang
Puckwang

Reputation: 434

You can write a new command to create repository interface, and then call it in MakeRepository.

I think this method is in line with SRP.

// In MakeRepository.php

// Override handle method
public function handle()
{
    if (parent::handle() === false && ! $this->option('force')) {
        return false;
    }

    if ($this->option('interface')) {
        $this->call('make:repository-interface', ['name' => $this->getNameInput() . 'Interface']);

    }
}

/**
 * Get the console command arguments.
 *
 * @return array
 */
protected function getArguments()
{
    return [
        ['name', InputArgument::REQUIRED, 'The name of the model to which the repository will be generated'],
        ['interface', 'i', InputOption::VALUE_NONE, 'Create a new interface for the repository'],
    ];
}

You can also refer to the code of make model of official. https://github.com/laravel/framework/blob/6.x/src/Illuminate/Foundation/Console/ModelMakeCommand.php

Upvotes: 1

M.abdelrhman
M.abdelrhman

Reputation: 1088

you can use glob to get your stubs in array then loop over them to create the multiple files

foreach(glob(stubs_path('stubs/Repository/*.stub') as $stub){
            copy(stubs_path('stubs/Repository/'.$stub), $repositoryLocation . 'Repository.php');
}

Upvotes: 0

Related Questions