--confirm * php bin/module-deactivate.php --dry-run * * The module does NOT need to be in the enabled list — the manifest is loaded * directly from modules//module.php. */ require_once __DIR__ . '/module-cli-bootstrap.php'; function moduleDeactivateRun(): int { return moduleCliRunStep('module-deactivate', static function (): int { global $argv; $moduleId = $argv[1] ?? ''; $flags = array_slice($argv, 2); if ($moduleId === '' || $moduleId === '--help') { fwrite(STDOUT, "Usage: php bin/module-deactivate.php --confirm|--dry-run\n"); return $moduleId === '--help' ? 0 : 1; } $confirm = in_array('--confirm', $flags, true); $dryRun = in_array('--dry-run', $flags, true); if (!$confirm && !$dryRun) { fwrite(STDERR, "Error: must pass --confirm to execute or --dry-run to validate.\n"); return 1; } $projectRoot = moduleCliProjectRoot(); $manifest = \MintyPHP\App\Module\ModuleManifestLoader::loadFromDisk( $projectRoot . '/modules', $moduleId ); $handlerClass = $manifest->deactivationHandler; if ($handlerClass === null) { fwrite(STDOUT, "Module '{$moduleId}' has no deactivation_handler declared — nothing to do.\n"); return 0; } if (!class_exists($handlerClass)) { fwrite(STDERR, "Error: deactivation handler class '{$handlerClass}' not found.\n"); return 1; } $handler = new $handlerClass(); if (!$handler instanceof \MintyPHP\App\Module\Contracts\ModuleDeactivationHandler) { fwrite(STDERR, "Error: '{$handlerClass}' does not implement ModuleDeactivationHandler.\n"); return 1; } if ($dryRun) { fwrite(STDOUT, "Dry-run: handler '{$handlerClass}' found and valid for module '{$moduleId}'.\n"); return 0; } fwrite(STDOUT, "Running deactivation handler for module '{$moduleId}'...\n"); $container = app(); $handler->deactivate($container); fwrite(STDOUT, "Deactivation handler for module '{$moduleId}' completed.\n"); return 0; }); } if (PHP_SAPI === 'cli' && realpath((string) ($_SERVER['SCRIPT_FILENAME'] ?? '')) === __FILE__) { fwrite(STDERR, "Hint: prefer `php bin/console module:deactivate` instead.\n"); exit(moduleDeactivateRun()); }