-
-
Save rdpascua/7223ffc7e5fedae488c3282ba382c112 to your computer and use it in GitHub Desktop.
[6.0] Command app:name
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\Console\Command; | |
use Illuminate\Support\Composer; | |
use Symfony\Component\Finder\Finder; | |
use Illuminate\Filesystem\Filesystem; | |
use Symfony\Component\Console\Input\InputArgument; | |
class AppName extends Command | |
{ | |
/** | |
* The console command name. | |
* | |
* @var string | |
*/ | |
protected $name = 'app:name'; | |
/** | |
* The console command description. | |
* | |
* @var string | |
*/ | |
protected $description = 'Set the application namespace'; | |
/** | |
* The Composer class instance. | |
* | |
* @var \Illuminate\Support\Composer | |
*/ | |
protected $composer; | |
/** | |
* The filesystem instance. | |
* | |
* @var \Illuminate\Filesystem\Filesystem | |
*/ | |
protected $files; | |
/** | |
* Current root application namespace. | |
* | |
* @var string | |
*/ | |
protected $currentRoot; | |
/** | |
* Create a new key generator command. | |
* | |
* @param \Illuminate\Support\Composer $composer | |
* @param \Illuminate\Filesystem\Filesystem $files | |
* @return void | |
*/ | |
public function __construct(Composer $composer, Filesystem $files) | |
{ | |
parent::__construct(); | |
$this->files = $files; | |
$this->composer = $composer; | |
} | |
/** | |
* Execute the console command. | |
* | |
* @return void | |
*/ | |
public function handle() | |
{ | |
$this->currentRoot = trim($this->laravel->getNamespace(), '\\'); | |
$this->setAppDirectoryNamespace(); | |
$this->setBootstrapNamespaces(); | |
$this->setConfigNamespaces(); | |
$this->setComposerNamespace(); | |
$this->setDatabaseFactoryNamespaces(); | |
$this->info('Application namespace set!'); | |
$this->composer->dumpAutoloads(); | |
$this->call('optimize:clear'); | |
} | |
/** | |
* Set the namespace on the files in the app directory. | |
* | |
* @return void | |
*/ | |
protected function setAppDirectoryNamespace() | |
{ | |
$files = Finder::create() | |
->in($this->laravel['path']) | |
->contains($this->currentRoot) | |
->name('*.php'); | |
foreach ($files as $file) { | |
$this->replaceNamespace($file->getRealPath()); | |
} | |
} | |
/** | |
* Replace the App namespace at the given path. | |
* | |
* @param string $path | |
* @return void | |
*/ | |
protected function replaceNamespace($path) | |
{ | |
$search = [ | |
'namespace '.$this->currentRoot.';', | |
$this->currentRoot.'\\', | |
]; | |
$replace = [ | |
'namespace '.$this->argument('name').';', | |
$this->argument('name').'\\', | |
]; | |
$this->replaceIn($path, $search, $replace); | |
} | |
/** | |
* Set the bootstrap namespaces. | |
* | |
* @return void | |
*/ | |
protected function setBootstrapNamespaces() | |
{ | |
$search = [ | |
$this->currentRoot.'\\Http', | |
$this->currentRoot.'\\Console', | |
$this->currentRoot.'\\Exceptions', | |
]; | |
$replace = [ | |
$this->argument('name').'\\Http', | |
$this->argument('name').'\\Console', | |
$this->argument('name').'\\Exceptions', | |
]; | |
$this->replaceIn($this->getBootstrapPath(), $search, $replace); | |
} | |
/** | |
* Set the namespace in the appropriate configuration files. | |
* | |
* @return void | |
*/ | |
protected function setConfigNamespaces() | |
{ | |
$this->setAppConfigNamespaces(); | |
$this->setAuthConfigNamespace(); | |
$this->setServicesConfigNamespace(); | |
} | |
/** | |
* Set the application provider namespaces. | |
* | |
* @return void | |
*/ | |
protected function setAppConfigNamespaces() | |
{ | |
$search = [ | |
$this->currentRoot.'\\Providers', | |
$this->currentRoot.'\\Http\\Controllers\\', | |
]; | |
$replace = [ | |
$this->argument('name').'\\Providers', | |
$this->argument('name').'\\Http\\Controllers\\', | |
]; | |
$this->replaceIn($this->getConfigPath('app'), $search, $replace); | |
} | |
/** | |
* Set the authentication User namespace. | |
* | |
* @return void | |
*/ | |
protected function setAuthConfigNamespace() | |
{ | |
$this->replaceIn( | |
$this->getConfigPath('auth'), | |
$this->currentRoot.'\\User', | |
$this->argument('name').'\\User' | |
); | |
} | |
/** | |
* Set the services User namespace. | |
* | |
* @return void | |
*/ | |
protected function setServicesConfigNamespace() | |
{ | |
$this->replaceIn( | |
$this->getConfigPath('services'), | |
$this->currentRoot.'\\User', | |
$this->argument('name').'\\User' | |
); | |
} | |
/** | |
* Set the PSR-4 namespace in the Composer file. | |
* | |
* @return void | |
*/ | |
protected function setComposerNamespace() | |
{ | |
$this->replaceIn( | |
$this->getComposerPath(), | |
str_replace('\\', '\\\\', $this->currentRoot).'\\\\', | |
str_replace('\\', '\\\\', $this->argument('name')).'\\\\' | |
); | |
} | |
/** | |
* Set the namespace in database factory files. | |
* | |
* @return void | |
*/ | |
protected function setDatabaseFactoryNamespaces() | |
{ | |
$files = Finder::create() | |
->in(database_path('factories')) | |
->contains($this->currentRoot) | |
->name('*.php'); | |
foreach ($files as $file) { | |
$this->replaceIn( | |
$file->getRealPath(), | |
$this->currentRoot, $this->argument('name') | |
); | |
} | |
} | |
/** | |
* Replace the given string in the given file. | |
* | |
* @param string $path | |
* @param string|array $search | |
* @param string|array $replace | |
* @return void | |
*/ | |
protected function replaceIn($path, $search, $replace) | |
{ | |
if ($this->files->exists($path)) { | |
$this->files->put($path, str_replace($search, $replace, $this->files->get($path))); | |
} | |
} | |
/** | |
* Get the path to the bootstrap/app.php file. | |
* | |
* @return string | |
*/ | |
protected function getBootstrapPath() | |
{ | |
return $this->laravel->bootstrapPath().'/app.php'; | |
} | |
/** | |
* Get the path to the Composer.json file. | |
* | |
* @return string | |
*/ | |
protected function getComposerPath() | |
{ | |
return base_path('composer.json'); | |
} | |
/** | |
* Get the path to the given configuration file. | |
* | |
* @param string $name | |
* @return string | |
*/ | |
protected function getConfigPath($name) | |
{ | |
return $this->laravel['path.config'].'/'.$name.'.php'; | |
} | |
/** | |
* Get the console command arguments. | |
* | |
* @return array | |
*/ | |
protected function getArguments() | |
{ | |
return [ | |
['name', InputArgument::REQUIRED, 'The desired namespace'], | |
]; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment