Skip to content

Instantly share code, notes, and snippets.

@CLOUGH
Last active September 15, 2016 17:19
Show Gist options
  • Save CLOUGH/59e5fe5910cbc76bad7e29e4e61b8aa0 to your computer and use it in GitHub Desktop.
Save CLOUGH/59e5fe5910cbc76bad7e29e4e61b8aa0 to your computer and use it in GitHub Desktop.

Revisions

  1. CLOUGH revised this gist Sep 15, 2016. No changes.
  2. CLOUGH created this gist Sep 15, 2016.
    207 changes: 207 additions & 0 deletions MakeTransformerCommand.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,207 @@
    <?php

    namespace App\Console\Commands;

    use Illuminate\Support\Str;
    use Illuminate\Filesystem\Filesystem;
    use Illuminate\Console\Command;

    class MakeTransformerCommand extends Command
    {
    /**
    * The filesystem instance.
    *
    * @var \Illuminate\Filesystem\Filesystem
    */
    protected $files;

    /**
    * The name and signature of the console command.
    *
    * @var string
    */
    protected $signature = 'make:transformer { name : classs name for the transformer}';

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

    /**
    * Create a new command instance.
    *
    * @return void
    */
    public function __construct(Filesystem $files)
    {
    parent::__construct();

    $this->files = $files;
    }

    /**
    * Execute the console command.
    *
    * @return mixed
    */
    public function handle()
    {
    $name = $this->parseName($this->argument('name'));
    $path = $this->getPath($name);
    $this->line($name);

    if ($this->alreadyExists($this->argument('name'))) {
    $this->error('Transformer already exists!');

    return false;
    }

    $this->makeDirectory($path);

    $this->files->put($path, $this->buildClass($name));

    $this->info('Transformer created successfully.');
    }
    /**
    * Determine if the class already exists.
    *
    * @param string $rawName
    * @return bool
    */
    protected function alreadyExists($rawName)
    {
    $name = $this->parseName($rawName);

    return $this->files->exists($this->getPath($name));
    }

    /**
    * Get the stub file
    *
    * @return string
    */
    protected function getStub()
    {

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


    /**
    * 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 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';
    }


    /**
    * 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);
    }
    }