You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							109 lines
						
					
					
						
							3.0 KiB
						
					
					
				
			
		
		
	
	
							109 lines
						
					
					
						
							3.0 KiB
						
					
					
				<?php | 
						|
 | 
						|
namespace core\services; | 
						|
 | 
						|
use core\entities\ModuleRecord; | 
						|
use core\repositories\ModuleRepository; | 
						|
use yii\helpers\FileHelper; | 
						|
use Yii; | 
						|
 | 
						|
class ModuleService | 
						|
{ | 
						|
    private $modules; | 
						|
 | 
						|
    public function __construct(ModuleRepository $modules) | 
						|
    { | 
						|
        $this->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; | 
						|
	} | 
						|
} |