확장이 훅으로 등록한 카탈로그에서 고른 값은 그 확장이 사라져도 저장값으로 남는다. 그 상태에서 값만 보고 판정하면 이미 제공 불가한 항목이 사용자 화면에 그대로 노출된다. 예외도 경고도 로그도 남지 않아 관리자 화면과 나란히 보지 않으면 드러나지 않는다. - 결제수단에 지정한 PG, 현금영수증 발급사, 검색엔진 드라이버 세 축에 같은 판정을 적용. 공개 응답에서는 제거하고 관리자 응답에는 표시를 남긴다 — 운영자가 고쳐야 할 대상이라 감추면 복구 경로가 사라진다. 서버 검증도 같은 판정을 공유해 화면 우회 제출을 막는다. - 설정 단건 저장이 벌크 저장과 다른 경로를 타던 문제를 코어·이커머스·게시판에서 정리. 저장은 성공하고 파생 값만 갱신되지 않아 어느 화면에서 저장했느냐로 결과가 갈렸다. - 단건 저장의 값 형태 계약 신설. 빈 값으로 되돌릴 수 있게 하고, 타입은 defaults.json 의 기본값을 SSoT 로 삼는다. 해석 불가한 입력은 조용히 캐스팅하지 않고 거절한다. - 드라이버 셀렉트를 서버 카탈로그에 바인딩하고, 저장값이 카탈로그에 없으면 그 값을 드러내는 안내를 8곳 전수에 붙인다. 종전에는 빈 칸으로만 보여 무엇이 저장됐는지 알 수 없었다. 시나리오 매니페스트 8종을 면제 없이 신설했다. `audit:allow` 는 cross product 와 effects 검사를 함께 끄므로, 면제가 걸린 매니페스트에 선언을 추가하면 검증이 회복되지 않는다. 그 아래에서 대응 테스트가 없는 effect 이름 2건이 살아남아 있었고, 함께 정리했다.
200 lines
7.5 KiB
PHP
200 lines
7.5 KiB
PHP
<?php
|
|
|
|
namespace App\Contracts\Extension;
|
|
|
|
use App\Enums\DeactivationReason;
|
|
|
|
interface TemplateManagerInterface
|
|
{
|
|
/**
|
|
* 모든 템플릿을 로드하고 초기화합니다. (항상 재스캔)
|
|
*/
|
|
public function loadTemplates(): void;
|
|
|
|
/**
|
|
* 템플릿이 아직 로드되지 않았을 때만 로드합니다. (멱등)
|
|
*
|
|
* "맵이 채워져 있기만 하면 되는" 소비자용 진입점. 재스캔이 필요한 경우
|
|
* (설치/삭제/업데이트 직후)에만 `loadTemplates()` 를 직접 호출합니다.
|
|
*/
|
|
public function ensureLoaded(): void;
|
|
|
|
/**
|
|
* /templates 디렉토리를 스캔하여 사용 가능한 템플릿을 발견합니다.
|
|
*
|
|
* @return array 발견된 템플릿 배열 (identifier => path)
|
|
*/
|
|
public function scanTemplates(): array;
|
|
|
|
/**
|
|
* 로드된 모든 템플릿 인스턴스들을 반환합니다.
|
|
*
|
|
* @return array 모든 템플릿 배열
|
|
*/
|
|
public function getAllTemplates(): array;
|
|
|
|
/**
|
|
* 활성화된 템플릿을 반환합니다.
|
|
*
|
|
* @param string $type 템플릿 타입 (admin 또는 user)
|
|
* @return array|null 활성화된 템플릿 데이터 또는 null
|
|
*/
|
|
public function getActiveTemplate(string $type): ?array;
|
|
|
|
/**
|
|
* 지정된 식별자의 템플릿 데이터를 반환합니다.
|
|
*
|
|
* @param string $identifier 템플릿 식별자 (vendor-name 형식)
|
|
* @return array|null 템플릿 데이터 또는 null
|
|
*/
|
|
public function getTemplate(string $identifier): ?array;
|
|
|
|
/**
|
|
* 지정된 템플릿을 시스템에 설치합니다.
|
|
*
|
|
* @param string $identifier 설치할 템플릿 식별자
|
|
* @param \Closure|null $onProgress 진행 콜백 (?string $step, string $message)
|
|
* @return bool 설치 성공 여부
|
|
*
|
|
* @throws \Exception 템플릿을 찾을 수 없거나 의존성 문제 시
|
|
*/
|
|
public function installTemplate(string $identifier, ?\Closure $onProgress = null): bool;
|
|
|
|
/**
|
|
* 지정된 템플릿을 제거합니다.
|
|
*
|
|
* @param string $identifier 제거할 템플릿 식별자
|
|
* @param \Closure|null $onProgress 진행 콜백 (?string $step, string $message)
|
|
* @return bool 제거 성공 여부
|
|
*
|
|
* @throws \Exception 템플릿을 찾을 수 없을 때
|
|
*/
|
|
public function uninstallTemplate(string $identifier, ?\Closure $onProgress = null): bool;
|
|
|
|
/**
|
|
* 지정된 템플릿을 활성화합니다.
|
|
*
|
|
* @param string $identifier 활성화할 템플릿 식별자
|
|
* @param bool $force 의존성 미충족 시에도 강제 활성화 여부
|
|
* @return array{success: bool, warning?: bool, missing_modules?: array, missing_plugins?: array, message?: string} 활성화 결과
|
|
*/
|
|
public function activateTemplate(string $identifier, bool $force = false): array;
|
|
|
|
/**
|
|
* 지정된 템플릿을 비활성화합니다.
|
|
*
|
|
* @param string $identifier 비활성화할 템플릿 식별자
|
|
* @param string $reason 비활성화 사유 (DeactivationReason enum value: manual|incompatible_core)
|
|
* @param string|null $incompatibleRequiredVersion incompatible_core 사유 시 요구된 코어 버전 제약
|
|
* @return bool 비활성화 성공 여부
|
|
*/
|
|
public function deactivateTemplate(
|
|
string $identifier,
|
|
string $reason = DeactivationReason::Manual->value,
|
|
?string $incompatibleRequiredVersion = null,
|
|
): bool;
|
|
|
|
/**
|
|
* 템플릿의 의존성을 검증합니다.
|
|
*
|
|
* @param string $identifier 검증할 템플릿 식별자
|
|
* @return bool 의존성 충족 여부
|
|
*
|
|
* @throws \Exception 의존성이 충족되지 않을 때
|
|
*/
|
|
public function validateTemplate(string $identifier): bool;
|
|
|
|
/**
|
|
* 설치되지 않은 템플릿들을 반환합니다.
|
|
*
|
|
* @return array 미설치 템플릿 배열
|
|
*/
|
|
public function getUninstalledTemplates(): array;
|
|
|
|
/**
|
|
* 설치된 템플릿 정보를 데이터베이스 레코드와 함께 반환합니다.
|
|
*
|
|
* @return array 설치된 템플릿 배열
|
|
*/
|
|
public function getInstalledTemplatesWithDetails(): array;
|
|
|
|
/**
|
|
* 특정 템플릿의 정보를 반환합니다 (설치 여부와 관계없이).
|
|
*
|
|
* @param string $identifier 템플릿 식별자
|
|
* @return array|null 템플릿 정보 배열 또는 null
|
|
*/
|
|
public function getTemplateInfo(string $identifier): ?array;
|
|
|
|
/**
|
|
* 타입별 템플릿 목록을 반환합니다.
|
|
*
|
|
* @param string $type 템플릿 타입 (admin 또는 user)
|
|
* @return array 해당 타입의 템플릿 배열
|
|
*/
|
|
public function getTemplatesByType(string $type): array;
|
|
|
|
/**
|
|
* 템플릿의 레이아웃을 파일에서 다시 읽어 DB에 갱신합니다.
|
|
*
|
|
* @param string $identifier 템플릿 식별자
|
|
* @return array{success: bool, layouts_refreshed: int} 갱신 결과 및 갱신된 레이아웃 개수
|
|
*
|
|
* @throws \Exception 템플릿을 찾을 수 없거나 레이아웃 갱신 실패 시
|
|
*/
|
|
public function refreshTemplateLayouts(string $identifier): array;
|
|
|
|
/**
|
|
* 템플릿의 의존성 충족 상태를 확인합니다.
|
|
*
|
|
* template.json의 dependencies를 기반으로 모든 모듈/플러그인의
|
|
* 활성화 상태 및 버전 요구사항 충족 여부를 확인합니다.
|
|
*
|
|
* 각 의존성 항목 구조:
|
|
* - identifier: 모듈/플러그인 식별자
|
|
* - name: 로케일화된 이름 (미설치 시 identifier 사용)
|
|
* - required_version: 요구 버전 제약조건
|
|
* - installed_version: 설치된 버전 (null이면 미설치)
|
|
* - is_active: 활성화 여부
|
|
* - version_met: 버전 요구사항 충족 여부
|
|
* - met: 전체 요구사항 충족 여부
|
|
*
|
|
* @param string $identifier 템플릿 식별자
|
|
* @return array{met: bool, modules: array, plugins: array} 의존성 상태
|
|
*/
|
|
public function checkDependenciesStatus(string $identifier): array;
|
|
|
|
/**
|
|
* 템플릿의 미충족 의존성 목록을 반환합니다.
|
|
*
|
|
* checkDependenciesStatus()를 활용하여 충족되지 않은 의존성만 필터링합니다.
|
|
* 각 항목에는 identifier, name, required_version 등이 포함됩니다.
|
|
*
|
|
* @param string $identifier 템플릿 식별자
|
|
* @return array{modules: array, plugins: array} 미충족 의존성 목록
|
|
*/
|
|
public function getUnmetDependencies(string $identifier): array;
|
|
|
|
/**
|
|
* 특정 모듈에 의존하는 활성 템플릿 목록을 반환합니다.
|
|
*
|
|
* 모든 활성화된 템플릿을 조회하여 해당 모듈을 dependencies.modules에
|
|
* 포함하고 있는 템플릿의 identifier 목록을 반환합니다.
|
|
*
|
|
* @param string $moduleIdentifier 모듈 식별자
|
|
* @return array 의존하는 템플릿 identifier 배열
|
|
*/
|
|
public function getTemplatesDependingOnModule(string $moduleIdentifier): array;
|
|
|
|
/**
|
|
* 특정 플러그인에 의존하는 활성 템플릿 목록을 반환합니다.
|
|
*
|
|
* 모든 활성화된 템플릿을 조회하여 해당 플러그인을 dependencies.plugins에
|
|
* 포함하고 있는 템플릿의 identifier 목록을 반환합니다.
|
|
*
|
|
* @param string $pluginIdentifier 플러그인 식별자
|
|
* @return array 의존하는 템플릿 identifier 배열
|
|
*/
|
|
public function getTemplatesDependingOnPlugin(string $pluginIdentifier): array;
|
|
}
|