/blog/vendor/laravel/framework/src/Illuminate/Console/GeneratorCommand.php
https://gitlab.com/zan_zan/laravel_sample · PHP · 204 lines · 87 code · 31 blank · 86 comment · 4 complexity · 352ee83221f451ef735a4b633435c938 MD5 · raw file
- <?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 void
- */
- public function fire()
- {
- $name = $this->parseName($this->getNameInput());
- if ($this->files->exists($path = $this->getPath($name))) {
- $this->error($this->type.' already exists!');
- return false;
- }
- $this->makeDirectory($path);
- $this->files->put($path, $this->buildClass($name));
- $this->info($this->type.' created successfully.');
- }
- /**
- * Get the destination class path.
- *
- * @param string $name
- * @return string
- */
- protected function getPath($name)
- {
- $name = str_replace($this->laravel->getNamespace(), '', $name);
- return $this->laravel['path'].'/'.str_replace('\\', '/', $name).'.php';
- }
- /**
- * Parse the name and format according to the root namespace.
- *
- * @param string $name
- * @return string
- */
- protected function parseName($name)
- {
- $rootNamespace = $this->laravel->getNamespace();
- if (Str::startsWith($name, $rootNamespace)) {
- return $name;
- }
- if (Str::contains($name, '/')) {
- $name = str_replace('/', '\\', $name);
- }
- return $this->parseName($this->getDefaultNamespace(trim($rootNamespace, '\\')).'\\'.$name);
- }
- /**
- * Get the default namespace for the class.
- *
- * @param string $rootNamespace
- * @return string
- */
- protected function getDefaultNamespace($rootNamespace)
- {
- return $rootNamespace;
- }
- /**
- * 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);
- }
- }
- /**
- * 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', $this->getNamespace($name), $stub
- );
- $stub = str_replace(
- 'DummyRootNamespace', $this->laravel->getNamespace(), $stub
- );
- return $this;
- }
- /**
- * Get the full namespace name for a given class.
- *
- * @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 $this->argument('name');
- }
- /**
- * Get the console command arguments.
- *
- * @return array
- */
- protected function getArguments()
- {
- return [
- ['name', InputArgument::REQUIRED, 'The name of the class'],
- ];
- }
- }