public function deactivatePlugin($pluginId)
{
$entity = $this->getPlugin($pluginId);
// 비활성화하려는 플러그인이 활성화되어있는 상태인지 체크한다.
if ($entity->getStatus() !== static::STATUS_ACTIVATED) {
throw new PluginAlreadyDeactivatedException();
}
// 비활성화하려는 플러그인에 의존하는 활성화 상태인 플러그인이 있는지 검사한다.
// 만약 의존하는 플러그인이 있다면, 비활성화시키지 않고 예외 처리한다.
$activateds = $this->getActivatedPlugins();
foreach ($activateds as $activated) {
$dependencies = $activated->getDependencies();
if (in_array($pluginId, $dependencies)) {
throw new PluginDependencyException();
}
}
// 기존에 설치(활성화)된 적이 있는지 검사한다. 기존에 활성화된 적이 있다면 설치된 버전을 조회한다.
$installedVersion = $entity->getInstalledVersion();
// 플러그인 비활성화. 플러그인을 비활성화할 때마다 각 플러그인의 deactivate() 메소드를 호출해준다.
// 각 플러그인은 deactivate() 메소드에서 자신이 XE에 설치된 상황을 파악한 후, 비활성화에 필요한 준비를 한다.
$plugin = $entity->getObject();
try {
$plugin->deactivate($installedVersion);
} catch (\Exception $e) {
throw new PluginDeactivationFailedException();
}
$entity->setStatus(static::STATUS_DEACTIVATED);
// 비활성화된 플러그인 정보를 config에 기록한다.
$this->setPluginStatus($pluginId, ['status' => static::STATUS_DEACTIVATED, 'version' => $entity->getInstalledVersion()]);
}