fix(core,ecommerce,board,admin_basic): 고아 카탈로그 차단 + 설정 저장 파이프라인 정합
확장이 훅으로 등록한 카탈로그에서 고른 값은 그 확장이 사라져도 저장값으로 남는다. 그 상태에서 값만 보고 판정하면 이미 제공 불가한 항목이 사용자 화면에 그대로 노출된다. 예외도 경고도 로그도 남지 않아 관리자 화면과 나란히 보지 않으면 드러나지 않는다. - 결제수단에 지정한 PG, 현금영수증 발급사, 검색엔진 드라이버 세 축에 같은 판정을 적용. 공개 응답에서는 제거하고 관리자 응답에는 표시를 남긴다 — 운영자가 고쳐야 할 대상이라 감추면 복구 경로가 사라진다. 서버 검증도 같은 판정을 공유해 화면 우회 제출을 막는다. - 설정 단건 저장이 벌크 저장과 다른 경로를 타던 문제를 코어·이커머스·게시판에서 정리. 저장은 성공하고 파생 값만 갱신되지 않아 어느 화면에서 저장했느냐로 결과가 갈렸다. - 단건 저장의 값 형태 계약 신설. 빈 값으로 되돌릴 수 있게 하고, 타입은 defaults.json 의 기본값을 SSoT 로 삼는다. 해석 불가한 입력은 조용히 캐스팅하지 않고 거절한다. - 드라이버 셀렉트를 서버 카탈로그에 바인딩하고, 저장값이 카탈로그에 없으면 그 값을 드러내는 안내를 8곳 전수에 붙인다. 종전에는 빈 칸으로만 보여 무엇이 저장됐는지 알 수 없었다. 시나리오 매니페스트 8종을 면제 없이 신설했다. `audit:allow` 는 cross product 와 effects 검사를 함께 끄므로, 면제가 걸린 매니페스트에 선언을 추가하면 검증이 회복되지 않는다. 그 아래에서 대응 테스트가 없는 effect 이름 2건이 살아남아 있었고, 함께 정리했다.
This commit is contained in:
@@ -36,8 +36,12 @@ class TemplateService
|
||||
private PluginManagerInterface $pluginManager,
|
||||
private LayoutVersionRepositoryInterface $layoutVersionRepository
|
||||
) {
|
||||
// TemplateManager 초기화 (템플릿 스캔)
|
||||
$this->templateManager->loadTemplates();
|
||||
// TemplateManager 초기화 — 아직 로드되지 않았을 때만 스캔한다.
|
||||
// 무조건 loadTemplates() 를 부르면 공유 싱글톤의 템플릿 맵을 리셋한 뒤 디렉토리를
|
||||
// 통째로 재스캔하므로, 이 서비스가 주입될 때마다 풀스캔과 상태 변형이 반복된다.
|
||||
// (웹/serve/test 는 CoreServiceProvider::boot 가 로드를 보장하지만, 그 외 콘솔 경로는
|
||||
// 로딩을 건너뛰므로 이 초기화 자체를 없앨 수는 없다)
|
||||
$this->templateManager->ensureLoaded();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1213,6 +1217,11 @@ class TemplateService
|
||||
*/
|
||||
public function getEditorRoutesDataWithModules(string $identifier): array
|
||||
{
|
||||
// 열화 판정은 이 호출의 병합 결과만 가리켜야 한다. 이 서비스는 공유 인스턴스라
|
||||
// 리셋하지 않으면 직전 호출(업데이트 스왑 창)의 판정이 인스턴스에 눌어붙어,
|
||||
// 모듈 디렉토리가 복구된 뒤의 병합까지 열화로 보고된다.
|
||||
$this->routeMergeDegraded = false;
|
||||
|
||||
// 1. routes.json 경로 — 활성 디렉토리 우선, _bundled 폴백 (활성/비활성 무관).
|
||||
$candidates = [
|
||||
base_path("templates/{$identifier}/routes.json"),
|
||||
|
||||
Reference in New Issue
Block a user