123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238 |
- <?php
-
- namespace Illuminate\Console;
-
- use Illuminate\Support\Str;
- use Illuminate\Filesystem\Filesystem;
- use Symfony\Component\Console\Input\InputArgument;
-
- abstract class GeneratorCommand extends Command
- {
- /**
- * The filesystem instance.
- *
- * @var \Illuminate\Filesystem\Filesystem
- */
- protected $files;
-
- /**
- * The type of class being generated.
- *
- * @var string
- */
- protected $type;
-
- /**
- * Create a new controller creator command instance.
- *
- * @param \Illuminate\Filesystem\Filesystem $files
- * @return void
- */
- public function __construct(Filesystem $files)
- {
- parent::__construct();
-
- $this->files = $files;
- }
-
- /**
- * Get the stub file for the generator.
- *
- * @return string
- */
- abstract protected function getStub();
-
- /**
- * Execute the console command.
- *
- * @return bool|null
- */
- public function handle()
- {
- $name = $this->qualifyClass($this->getNameInput());
-
- $path = $this->getPath($name);
-
- // First we will check to see if the class already exists. If it does, we don't want
- // to create the class and overwrite the user's code. So, we will bail out so the
- // code is untouched. Otherwise, we will continue generating this class' files.
- if ((! $this->hasOption('force') ||
- ! $this->option('force')) &&
- $this->alreadyExists($this->getNameInput())) {
- $this->error($this->type.' already exists!');
-
- return false;
- }
-
- // Next, we will generate the path to the location where this class' file should get
- // written. Then, we will build the class and make the proper replacements on the
- // stub files so that it gets the correctly formatted namespace and class name.
- $this->makeDirectory($path);
-
- $this->files->put($path, $this->buildClass($name));
-
- $this->info($this->type.' created successfully.');
- }
-
- /**
- * Parse the class name and format according to the root namespace.
- *
- * @param string $name
- * @return string
- */
- protected function qualifyClass($name)
- {
- $name = ltrim($name, '\\/');
-
- $rootNamespace = $this->rootNamespace();
-
- if (Str::startsWith($name, $rootNamespace)) {
- return $name;
- }
-
- $name = str_replace('/', '\\', $name);
-
- return $this->qualifyClass(
- $this->getDefaultNamespace(trim($rootNamespace, '\\')).'\\'.$name
- );
- }
-
- /**
- * Get the default namespace for the class.
- *
- * @param string $rootNamespace
- * @return string
- */
- protected function getDefaultNamespace($rootNamespace)
- {
- return $rootNamespace;
- }
-
- /**
- * Determine if the class already exists.
- *
- * @param string $rawName
- * @return bool
- */
- protected function alreadyExists($rawName)
- {
- return $this->files->exists($this->getPath($this->qualifyClass($rawName)));
- }
-
- /**
- * Get the destination class path.
- *
- * @param string $name
- * @return string
- */
- protected function getPath($name)
- {
- $name = Str::replaceFirst($this->rootNamespace(), '', $name);
-
- return $this->laravel['path'].'/'.str_replace('\\', '/', $name).'.php';
- }
-
- /**
- * Build the directory for the class if necessary.
- *
- * @param string $path
- * @return string
- */
- protected function makeDirectory($path)
- {
- if (! $this->files->isDirectory(dirname($path))) {
- $this->files->makeDirectory(dirname($path), 0777, true, true);
- }
-
- return $path;
- }
-
- /**
- * Build the class with the given name.
- *
- * @param string $name
- * @return string
- */
- protected function buildClass($name)
- {
- $stub = $this->files->get($this->getStub());
-
- return $this->replaceNamespace($stub, $name)->replaceClass($stub, $name);
- }
-
- /**
- * Replace the namespace for the given stub.
- *
- * @param string $stub
- * @param string $name
- * @return $this
- */
- protected function replaceNamespace(&$stub, $name)
- {
- $stub = str_replace(
- ['DummyNamespace', 'DummyRootNamespace', 'NamespacedDummyUserModel'],
- [$this->getNamespace($name), $this->rootNamespace(), config('auth.providers.users.model')],
- $stub
- );
-
- return $this;
- }
-
- /**
- * Get the full namespace for a given class, without the class name.
- *
- * @param string $name
- * @return string
- */
- protected function getNamespace($name)
- {
- return trim(implode('\\', array_slice(explode('\\', $name), 0, -1)), '\\');
- }
-
- /**
- * Replace the class name for the given stub.
- *
- * @param string $stub
- * @param string $name
- * @return string
- */
- protected function replaceClass($stub, $name)
- {
- $class = str_replace($this->getNamespace($name).'\\', '', $name);
-
- return str_replace('DummyClass', $class, $stub);
- }
-
- /**
- * Get the desired class name from the input.
- *
- * @return string
- */
- protected function getNameInput()
- {
- return trim($this->argument('name'));
- }
-
- /**
- * Get the root namespace for the class.
- *
- * @return string
- */
- protected function rootNamespace()
- {
- return $this->laravel->getNamespace();
- }
-
- /**
- * Get the console command arguments.
- *
- * @return array
- */
- protected function getArguments()
- {
- return [
- ['name', InputArgument::REQUIRED, 'The name of the class'],
- ];
- }
- }
|