getLayoutExtensions(); $identifier = $extension->getIdentifier(); $extensionType = $sourceType === LayoutSourceType::Module ? 'module' : 'plugin'; $stats = ['refreshed' => 0, 'created' => 0, 'updated' => 0, 'deleted' => 0]; if ($adminTemplates->isEmpty()) { return $stats; } // 파일에서 읽은 확장 데이터 수집 (target_layout 또는 extension_point) $fileExtensions = []; foreach ($extensionFiles as $extensionFile) { try { $content = File::get($extensionFile); $extensionData = json_decode($content, true); if (json_last_error() !== JSON_ERROR_NONE) { Log::error("레이아웃 확장 JSON 파싱 실패: {$extensionFile}", [ $extensionType => $identifier, 'error' => json_last_error_msg(), ]); continue; } // target_layout (overlay) 또는 extension_point 중 하나가 있어야 함 $targetKey = $extensionData['target_layout'] ?? $extensionData['extension_point'] ?? null; if ($targetKey) { $fileExtensions[$targetKey] = $extensionData; } } catch (\Exception $e) { Log::error("레이아웃 확장 파일 읽기 실패: {$extensionFile}", [ $extensionType => $identifier, 'error' => $e->getMessage(), ]); } } // 각 admin 템플릿에 대해 확장 동기화 foreach ($adminTemplates as $template) { // 파일에서 읽은 확장 등록/업데이트 foreach ($fileExtensions as $targetKey => $extensionData) { try { $result = $this->layoutExtensionService->registerExtension( $extensionData, $sourceType, $identifier, $template->id ); if ($result === 'created') { $stats['created']++; } elseif ($result === 'updated') { $stats['updated']++; } $stats['refreshed']++; } catch (\Exception $e) { Log::error("레이아웃 확장 갱신 실패: {$targetKey}", [ $extensionType => $identifier, 'template' => $template->identifier, 'error' => $e->getMessage(), ]); } } } if ($stats['refreshed'] > 0) { $typeLabel = $sourceType === LayoutSourceType::Module ? '모듈' : '플러그인'; Log::info("{$typeLabel} 레이아웃 확장 갱신 완료", [ $extensionType => $identifier, 'created' => $stats['created'], 'updated' => $stats['updated'], ]); } return $stats; } }