Last active
September 15, 2016 17:19
-
-
Save CLOUGH/59e5fe5910cbc76bad7e29e4e61b8aa0 to your computer and use it in GitHub Desktop.
A Laravel console command for generating transformer templates based on Laravel's own implementation of their make commands.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?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); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment