buildSeedContext($seedContext, $routeParams, $url); // seoOnly=true — 검색엔진 탭/레이아웃/모듈/코어 SEO 설정의 산출물(title/description/ // keywords/canonical/hreflang/og/twitter/JSON-LD/소유권 확인 메타)만 담긴 미리보기 HTML. // 렌더 파이프라인이 분리해 둔 산출물 부분을 SEO 전용 블레이드로 조립하므로, 완성 HTML 을 // 태그/속성 휴리스틱으로 후처리하지 않는다(body/CSS/시스템 메타는 SEO 산출물 아님). return $this->renderer->renderFromResolved( $layout, $routeParams, $url, $locale, $templateIdentifier, $layoutName, $moduleId, $pluginId, $context, null, true, ); } /** * 편집기 샘플 풀에 route/query 를 보강해 렌더 컨텍스트를 만듭니다. * * 운영 render() 가 data_sources fetch 결과 + route + query + _global + _local 로 컨텍스트를 * 구성하는 것과 대응 — 미리보기는 실 fetch 대신 편집기 샘플(`seedContext`)을 그대로 쓴다. * * @param array $seedContext 편집기 샘플 컨텍스트 * @param array $routeParams 샘플 라우트 파라미터 * @param string $url 현재 URL 경로 * @return array 렌더 컨텍스트 */ private function buildSeedContext(array $seedContext, array $routeParams, string $url): array { $context = $seedContext; // route 보강(샘플에 명시 안 됐으면 routeParams + path). $context['route'] = array_merge($routeParams, ['path' => $url], (array) ($seedContext['route'] ?? [])); $context['query'] = (array) ($seedContext['query'] ?? []); // _global/_local 은 샘플에 있으면 그대로, 없으면 빈 객체(엔진 평가 안전). $context['_global'] = (array) ($seedContext['_global'] ?? []); $context['_local'] = (array) ($seedContext['_local'] ?? []); return $context; } }