modules = $modules; } public function create($name, $class, $type = 'common', $active = ModuleRecord::STATUS_DISABLED): ModuleRecord { $module = new ModuleRecord(); $module->name = $name; $module->class = $class; $module->type = $type; $module->active = $active; $this->modules->save($module); return $module; } public function delete(ModuleRecord $module) { $migrations = $this->getMigrationFiles($module->name); $migrations = array_reverse($migrations); foreach ($migrations as $migrationPath) { $migrationFile = basename($migrationPath); $migration = str_replace('.php', '', $migrationFile); if ($this->migrationExists($migration)) { require $migrationPath; $obj = new $migration; if (method_exists($obj, 'safeDown')) { $obj->safeDown(); Yii::$app->moduleManager->removeFromMigrationTable($migration); } elseif (method_exists($obj, 'down')) { $obj->down(); Yii::$app->moduleManager->removeFromMigrationTable($migration); } } } // delete files $modulePath = Yii::getAlias('@common/modules/' . $module->name); if (file_exists($modulePath)) { FileHelper::removeDirectory($modulePath); } // delete module record $this->modules->remove($module); } public function disable(ModuleRecord $module) { $module->active = ModuleRecord::STATUS_DISABLED; $this->modules->save($module); } public function enable(ModuleRecord $module) { $module->active = ModuleRecord::STATUS_ENABLED; // migration if not exists $migrations = $this->getMigrationFiles($module->name); foreach ($migrations as $migrationPath) { $migrationFile = basename($migrationPath); $migration = str_replace('.php', '', $migrationFile); if (!$this->migrationExists($migration)) { // run migration require $migrationPath; $obj = new $migration; if (method_exists($obj, 'safeUp')) { $obj->safeUp(); Yii::$app->moduleManager->appendToMigrationTable($migration); } elseif (method_exists($obj, 'up')) { $obj->up(); Yii::$app->moduleManager->appendToMigrationTable($migration); } } } $this->modules->save($module); } private function getMigrationFiles($module) { // migration if not exists $migrationPath = Yii::getAlias('@common/modules/' . $module . '/migrations'); return file_exists($migrationPath) ? FileHelper::findFiles($migrationPath) : []; } private function migrationExists($name): bool { // check record exists $connection = Yii::$app->getDb(); $command = $connection->createCommand("SELECT * FROM migration WHERE version = '$name'"); $result = $command->queryAll(); return $result ? true : false; } }