ok
Direktori : /home2/selectio/www/3-idiots/vendor/nwidart/laravel-modules/src/Generators/ |
Current File : /home2/selectio/www/3-idiots/vendor/nwidart/laravel-modules/src/Generators/ModuleGenerator.php |
<?php namespace Nwidart\Modules\Generators; use Illuminate\Config\Repository as Config; use Illuminate\Console\Command as Console; use Illuminate\Filesystem\Filesystem; use Illuminate\Support\Str; use Nwidart\Modules\Contracts\ActivatorInterface; use Nwidart\Modules\FileRepository; use Nwidart\Modules\Support\Config\GenerateConfigReader; use Nwidart\Modules\Support\Stub; class ModuleGenerator extends Generator { /** * The module name will created. * * @var string */ protected $name; /** * 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 activator instance * * @var ActivatorInterface */ protected $activator; /** * The module instance. * * @var \Nwidart\Modules\Module */ protected $module; /** * Force status. * * @var bool */ protected $force = false; /** * set default module type. * * @var string */ protected $type = 'web'; /** * Enables the module. * * @var bool */ protected $isActive = false; /** * The constructor. * @param $name * @param FileRepository $module * @param Config $config * @param Filesystem $filesystem * @param Console $console */ public function __construct( $name, FileRepository $module = null, Config $config = null, Filesystem $filesystem = null, Console $console = null, ActivatorInterface $activator = null ) { $this->name = $name; $this->config = $config; $this->filesystem = $filesystem; $this->console = $console; $this->module = $module; $this->activator = $activator; } /** * Set type. * * @param string $type * * @return $this */ public function setType($type) { $this->type = $type; return $this; } /** * Set active flag. * * @param bool $active * * @return $this */ public function setActive(bool $active) { $this->isActive = $active; return $this; } /** * Get the name of module will created. By default in studly case. * * @return string */ public function getName() { return Str::studly($this->name); } /** * 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; } /** * Set the modules activator * * @param ActivatorInterface $activator * * @return $this */ public function setActivator(ActivatorInterface $activator) { $this->activator = $activator; 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 \Nwidart\Modules\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() : int { $name = $this->getName(); if ($this->module->has($name)) { if ($this->force) { $this->module->delete($name); } else { $this->console->error("Module [{$name}] already exist!"); return E_ERROR; } } $this->generateFolders(); $this->generateModuleJsonFile(); if ($this->type !== 'plain') { $this->generateFiles(); $this->generateResources(); } if ($this->type === 'plain') { $this->cleanModuleJsonFile(); } $this->activator->setActiveByName($name, $this->isActive); $this->console->info("Module [{$name}] created successfully."); return 0; } /** * 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('modules.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(), 'module' => $this->getName(), '--master' => true, ]); } if (GenerateConfigReader::read('provider')->generate() === true) { $this->console->call('module:make-provider', [ 'name' => $this->getName() . 'ServiceProvider', 'module' => $this->getName(), '--master' => true, ]); $this->console->call('module:route-provider', [ 'module' => $this->getName(), ]); } if (GenerateConfigReader::read('controller')->generate() === true) { $options = $this->type=='api'?['--api'=>true]:[]; $this->console->call('module:make-controller', [ 'controller' => $this->getName() . 'Controller', 'module' => $this->getName(), ]+$options); } } /** * 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 = []; if ($stub === 'json' || $stub === 'composer') { if (in_array('PROVIDER_NAMESPACE', $keys, true) === false) { $keys[] = 'PROVIDER_NAMESPACE'; } } 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->getName()) . '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->getName()) . 'module.json'; $content = $this->filesystem->get($path); $namespace = $this->getModuleNamespaceReplacement(); $studlyName = $this->getStudlyNameReplacement(); $provider = '"' . $namespace . '\\\\' . $studlyName . '\\\\Providers\\\\' . $studlyName . 'ServiceProvider"'; $content = str_replace($provider, '', $content); $this->filesystem->put($path, $content); } /** * Get the module name in lower case. * * @return string */ protected function getLowerNameReplacement() { return strtolower($this->getName()); } /** * 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'); } protected function getProviderNamespaceReplacement(): string { return str_replace('\\', '\\\\', GenerateConfigReader::read('provider')->getNamespace()); } }