modulesPath = config('modules.paths.modules'); } /** * Execute the console command. * * @return mixed */ public function handle() { $this->moduleName = $name = $this->argument('name'); // invalid module name provided if (!is_dir($this->modulesPath . DIRECTORY_SEPARATOR . $name)) { throw new InvalidArgumentException('Invalid module ' . $name . '. No directory under ' . $this->modulesPath . DIRECTORY_SEPARATOR . $name . ' found!'); } // get config $config = $this->loadConfig(); // check if it is valid $this->checkMandatoryFields($config); // all mandatory fields are present, we can write it into database and create modules.json $this->installModule($config); // inform user $this->line('Module ' . $name . ' successfuly installed'); } /** * Load config from Config/config.php in module files. We cannot use config() because the file have not published * yet. * * @return array */ private function loadConfig() { // we cannot rely on config() helper, because this module does not have to be published $config = @include($this->modulesPath . DIRECTORY_SEPARATOR . $this->moduleName . DIRECTORY_SEPARATOR . 'Config' . DIRECTORY_SEPARATOR . 'config.php'); return $config; } /** * Checks if config contains all mandatory entries. * * @param $config */ private function checkMandatoryFields($config) { $fields = ['providers', 'handler', 'name', 'files', 'alias']; foreach ($fields as $field) { if (!isset($config[$field])) { throw new MissingMandatoryParametersException('Missing *' . $field . '* in config file! Cannot install ' . $this->moduleName); } } } /** * Installs module into database. * * This method calls Module::install, which handles specific installation of module. In this way we should be able * to install any module even with some other database structures. * * @param $config * * @return Module * @throws \ErrorException * @throws \Exception */ private function installModule($config) { $name = isset($config['translatedName']) ? $config['translatedName'] : $config['name']; $description = isset($config['translatedDescription']) ? $config['translatedDescription'] : null; // check if module is not installed yet $exists = Module::where('handler', $config['handler']) ->exists(); if ($exists) { throw new \Exception('Module ' . $config['name'] . ' already exists in database.'); } $settings = [ 'staticName' => $this->moduleName, 'providers' => $config['providers'], 'aliases' => isset($config['aliases']) ? $config['aliases'] : [], 'order' => isset($config['order']) ? $config['order'] : 0, 'files' => $config['files'] ]; $module = Module::install($name, $config['alias'], $description, $config['handler'], $settings); return $module; } }