assertSitemapEnabled(); $isFresh = $cache->get(SitemapManager::META_CACHE_KEY) !== null; if ($isFresh) { $response = $store->indexResponse(); if ($response !== null) { return $response; } } // 신선도 만료 또는 세트 부재 — 생성은 큐에 맡긴다 (ShouldBeUnique 로 중복 디스패치 방지). GenerateSitemapJob::dispatch(); $serveStale = (bool) g7_core_settings('seo.sitemap_serve_stale_on_miss', true); if ($serveStale) { $response = $store->indexResponse(); if ($response !== null) { return $response; } } abort(503, __('seo.sitemap_not_ready'), ['Retry-After' => (string) self::RETRY_AFTER_SECONDS]); } /** * 자식 sitemap 을 반환합니다. * * gzip 여부는 manifest 가 결정하므로 `.xml` / `.xml.gz` 요청을 같은 액션에서 처리합니다. * * @param int $n 자식 번호 (1부터) * @param SitemapFileStore $store sitemap 파일 저장소 (읽기측) * @return StreamedResponse 자식 sitemap 스트림 */ public function child(int $n, SitemapFileStore $store): StreamedResponse { $this->assertSitemapEnabled(); $response = $store->childResponse($n); if ($response === null) { abort(404); } return $response; } /** * Sitemap 기능이 비활성화되어 있으면 404 로 중단합니다. */ private function assertSitemapEnabled(): void { if (! (bool) g7_core_settings('seo.sitemap_enabled', true)) { abort(404); } } }