argument('identifier'); try { // 플러그인 디렉토리 스캔 및 로드 $this->pluginManager->loadPlugins(); $clearedCount = 0; if ($identifier) { // 특정 플러그인 캐시 삭제 $this->info(__('plugins.commands.cache_clear.clearing_single', ['plugin' => $identifier])); // 플러그인이 존재하는지 확인 $plugin = $this->pluginManager->getPlugin($identifier); if (! $plugin) { $this->error('❌ '.__('plugins.not_found', ['plugin' => $identifier])); return Command::FAILURE; } $clearedCount = $this->clearPluginCache($identifier); // 상태 키(ext.plugins.*) + 미들웨어 인덱스 + 버전 포함 키 무효화 (버전 bump) PluginManager::invalidatePluginStatusCache(); ExtensionMiddlewareRegistry::flush(); $this->incrementExtensionCacheVersion(); $this->info('✅ '.__('plugins.commands.cache_clear.success_single', [ 'plugin' => $identifier, 'count' => $clearedCount, ])); } else { // 모든 플러그인 캐시 삭제 $this->info(__('plugins.commands.cache_clear.clearing_all')); // 각 플러그인별 캐시 삭제 foreach ($this->pluginManager->getAllPlugins() as $plugin) { $clearedCount += $this->clearPluginCache($plugin->getIdentifier()); } // 상태 키 + 미들웨어 인덱스 + 버전 포함 키 무효화는 전체에서 1회면 충분 PluginManager::invalidatePluginStatusCache(); ExtensionMiddlewareRegistry::flush(); $this->incrementExtensionCacheVersion(); // 플러그인 프론트엔드 병합 번들 파일 삭제 (캐시 키 forget 만으로는 미삭제) $clearedCount += $this->bundleService->clearBundles('plugin'); $this->info('✅ '.__('plugins.commands.cache_clear.success_all', ['count' => $clearedCount])); } Log::info('플러그인 캐시 삭제 완료', [ 'plugin' => $identifier ?? 'all', 'count' => $clearedCount, ]); return Command::SUCCESS; } catch (\Exception $e) { $this->error('❌ '.$e->getMessage()); Log::error('플러그인 캐시 삭제 실패', [ 'plugin' => $identifier ?? 'all', 'error' => $e->getMessage(), ]); return Command::FAILURE; } } /** * 특정 플러그인의 캐시를 삭제합니다. * * 플러그인이 소유한 실재 서버 캐시는 레이아웃 캐시뿐이다 — 트레이트 단일 지점 * (InvalidatesLayoutCache)으로 위임해 키 규약 드리프트를 방지한다. * * @return int 캐시를 무효화한 레이아웃 수 */ private function clearPluginCache(string $identifier): int { $this->invalidateExtensionLayoutCache($identifier, 'plugin'); return $this->layoutRepository ->getBySourceIdentifier($identifier, LayoutSourceType::Plugin) ->count(); } }