Viewing file: ModuleGenerator.php (10.72 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
<?php
namespace Akaunting\Module\Generators;
use Illuminate\Config\Repository as Config; use Illuminate\Console\Command as Console; use Illuminate\Filesystem\Filesystem; use Illuminate\Support\Str; use Akaunting\Module\FileRepository; use Akaunting\Module\Support\Config\GenerateConfigReader; use Akaunting\Module\Support\Stub;
class ModuleGenerator extends Generator { /** * The module alias will created. * * @var string */ protected $alias;
/** * The laravel config instance. * * @var Config */ protected $config;
/** * The laravel filesystem instance. * * @var Filesystem */ protected $filesystem;
/** * The laravel console instance. * * @var Console */ protected $console;
/** * The module instance. * * @var \Akaunting\Module\Module */ protected $module;
/** * Force status. * * @var bool */ protected $force = false;
/** * Generate a plain module. * * @var bool */ protected $plain = false;
/** * The constructor. * @param $alias * @param FileRepository $module * @param Config $config * @param Filesystem $filesystem * @param Console $console */ public function __construct( $alias, FileRepository $module = null, Config $config = null, Filesystem $filesystem = null, Console $console = null ) { $this->alias = Str::kebab($alias); $this->config = $config; $this->filesystem = $filesystem; $this->console = $console; $this->module = $module; }
/** * Set plain flag. * * @param bool $plain * * @return $this */ public function setPlain($plain) { $this->plain = $plain;
return $this; }
/** * Get the name of module will created. By default in studly case. * * @return string */ public function getName() { return Str::studly($this->alias); }
/** * Get the laravel config instance. * * @return Config */ public function getConfig() { return $this->config; }
/** * Set the laravel config instance. * * @param Config $config * * @return $this */ public function setConfig($config) { $this->config = $config;
return $this; }
/** * Get the laravel filesystem instance. * * @return Filesystem */ public function getFilesystem() { return $this->filesystem; }
/** * Set the laravel filesystem instance. * * @param Filesystem $filesystem * * @return $this */ public function setFilesystem($filesystem) { $this->filesystem = $filesystem;
return $this; }
/** * Get the laravel console instance. * * @return Console */ public function getConsole() { return $this->console; }
/** * Set the laravel console instance. * * @param Console $console * * @return $this */ public function setConsole($console) { $this->console = $console;
return $this; }
/** * Get the module instance. * * @return \Akaunting\Module\Module */ public function getModule() { return $this->module; }
/** * Set the module instance. * * @param mixed $module * * @return $this */ public function setModule($module) { $this->module = $module;
return $this; }
/** * Get the list of folders will created. * * @return array */ public function getFolders() { return $this->module->config('paths.generator'); }
/** * Get the list of files will created. * * @return array */ public function getFiles() { return $this->module->config('stubs.files'); }
/** * Set force status. * * @param bool|int $force * * @return $this */ public function setForce($force) { $this->force = $force;
return $this; }
/** * Generate the module. */ public function generate() { if ($this->module->has($this->alias)) { if ($this->force) { $this->module->delete($this->alias); } else { $this->console->error("Module [{$this->alias}] already exist!");
return; } }
$this->generateFolders();
$this->generateModuleJsonFile();
if ($this->plain !== true) { $this->generateFiles(); $this->generateResources(); }
if ($this->plain === true) { $this->cleanModuleJsonFile(); }
$this->console->info("Module [{$this->alias}] created successfully."); }
/** * Generate the folders. */ public function generateFolders() { foreach ($this->getFolders() as $key => $folder) { $folder = GenerateConfigReader::read($key);
if ($folder->generate() === false) { continue; }
$path = $this->module->getModulePath($this->getName()) . '/' . $folder->getPath();
$this->filesystem->makeDirectory($path, 0755, true); if (config('module.stubs.gitkeep')) { $this->generateGitKeep($path); } } }
/** * Generate git keep to the specified path. * * @param string $path */ public function generateGitKeep($path) { $this->filesystem->put($path . '/.gitkeep', ''); }
/** * Generate the files. */ public function generateFiles() { foreach ($this->getFiles() as $stub => $file) { $path = $this->module->getModulePath($this->getName()) . $file;
if (!$this->filesystem->isDirectory($dir = dirname($path))) { $this->filesystem->makeDirectory($dir, 0775, true); }
$this->filesystem->put($path, $this->getStubContents($stub));
$this->console->info("Created : {$path}"); } }
/** * Generate some resources. */ public function generateResources() { if (GenerateConfigReader::read('seeder')->generate() === true) { $this->console->call('module:make-seed', [ 'name' => $this->getName(), 'alias' => $this->alias, '--master' => true, ]); }
if (GenerateConfigReader::read('provider')->generate() === true) { $this->console->call('module:make-provider', [ 'name' => 'Main', 'alias' => $this->alias, '--master' => true, ]); }
if (GenerateConfigReader::read('controller')->generate() === true) { $this->console->call('module:make-controller', [ 'controller' => 'Main', 'alias' => $this->alias, ]); } }
/** * Get the contents of the specified stub file by given stub name. * * @param $stub * * @return string */ protected function getStubContents($stub) { return (new Stub( '/' . $stub . '.stub', $this->getReplacement($stub) ))->render(); }
/** * get the list for the replacements. */ public function getReplacements() { return $this->module->config('stubs.replacements'); }
/** * Get array replacement for the specified stub. * * @param $stub * * @return array */ protected function getReplacement($stub) { $replacements = $this->module->config('stubs.replacements');
if (!isset($replacements[$stub])) { return []; }
$keys = $replacements[$stub];
$replaces = [];
foreach ($keys as $key) { if (method_exists($this, $method = 'get' . ucfirst(Str::studly(strtolower($key))) . 'Replacement')) { $replaces[$key] = $this->$method(); } else { $replaces[$key] = null; } }
return $replaces; }
/** * Generate the module.json file */ private function generateModuleJsonFile() { $path = $this->module->getModulePath($this->alias) . 'module.json';
if (!$this->filesystem->isDirectory($dir = dirname($path))) { $this->filesystem->makeDirectory($dir, 0775, true); }
$this->filesystem->put($path, $this->getStubContents('json'));
$this->console->info("Created : {$path}"); }
/** * Remove the default service provider that was added in the module.json file * This is needed when a --plain module was created */ private function cleanModuleJsonFile() { $path = $this->module->getModulePath($this->alias) . 'module.json';
$content = $this->filesystem->get($path); $namespace = $this->getModuleNamespaceReplacement(); $studlyName = $this->getStudlyNameReplacement();
$provider = '"' . $namespace . '\\\\' . $studlyName . '\\\\Providers\\\\' . $studlyName . '"';
$content = str_replace($provider, '', $content);
$this->filesystem->put($path, $content); }
/** * Get the module alias. * * @return string */ protected function getAliasReplacement() { return $this->alias; }
/** * Get the module name in lower case. * * @return string */ protected function getLowerNameReplacement() { return $this->getAliasReplacement(); }
/** * Get the module name in studly case. * * @return string */ protected function getStudlyNameReplacement() { return $this->getName(); }
/** * Get replacement for $VENDOR$. * * @return string */ protected function getVendorReplacement() { return $this->module->config('composer.vendor'); }
/** * Get replacement for $MODULE_NAMESPACE$. * * @return string */ protected function getModuleNamespaceReplacement() { return str_replace('\\', '\\\\', $this->module->config('namespace')); }
/** * Get replacement for $AUTHOR_NAME$. * * @return string */ protected function getAuthorNameReplacement() { return $this->module->config('composer.author.name'); }
/** * Get replacement for $AUTHOR_EMAIL$. * * @return string */ protected function getAuthorEmailReplacement() { return $this->module->config('composer.author.email'); } }
|