modules = $modules; $this->permission_manager = $permission_manager; } 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) { // connect manifest $manifest = require Yii::getAlias('@common/modules/' . $module->name . '/manifest.php'); // down migrations $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); } } } // remove permissions if (isset($manifest['permissions']) && is_array($manifest['permissions'])) { $this->removePermissions($manifest['permissions']); } // 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) { // connect manifest $manifest = require Yii::getAlias('@common/modules/' . $module->name . '/manifest.php'); $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); } } } // add not exists permissions if (isset($manifest['permissions']) && is_array($manifest['permissions'])) { $this->assignPermissions($manifest['permissions']); } $this->modules->save($module); } private function assignPermissions(array $permissions): void { foreach ($permissions as $permission => $description) { if (!$this->permission_manager->permissionExists($permission)) { $this->permission_manager->create($permission, $description); } } } private function removePermissions(array $permissions) { foreach ($permissions as $permission => $description) { if ($this->permission_manager->permissionExists($permission)) { $this->permission_manager->delete($permission); } } } 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; } }