GNUCMS / MANUAL

플러그인·모듈 개발

manifest·bootstrap·서비스 연결과 고정 라우트로 확장을 만듭니다.

개발자

최소 패키지

폴더 구조
modules/hello/
  extension.json
  bootstrap.php
  templates/hello.php
extension.json
{
  "id": "hello", "type": "module", "name": "인사",
  "description": "공개 인사 화면", "version": "1.0.0",
  "api": 1, "route_prefix": "/hello", "aliases": false,
  "entry_path": "/", "public_path": "/",
  "requires": [], "optional": []
}

ID와 폴더명을 맞춥니다. 영문 소문자로 시작하는 소문자·숫자·_·- 이름을 사용합니다. 확장은 최초 비활성입니다. 공개 모듈도 관리자가 켜기 전에는 실행되지 않습니다.

bootstrap과 라우트

bootstrap.php
<?php
use GnuCms\Extension\Context;
use GnuCms\View\View;
return static function (Context $context): void {
    $context->route('GET', '/', static function ($request, $response) {
        return View::forExtension($request, 'hello', __DIR__ . '/templates')
            ->render($response, 'hello', ['message' => '안녕하세요']);
    });
};

Context는 고정 경로의 GET·POST를 등록합니다. 동적 라우트 패턴을 넘기지 않습니다. POST는 CSRF, admin:true는 전역 관리자 검사를 적용합니다. 공개 라우트의 로그인·데이터 소유권은 해당 패키지가 검사합니다.

서비스와 의존성

필수 확장은 requires, 선택 확장은 optional의 전체 키로 선언합니다. 제공 서비스는 context->provide(), 사용 서비스는 context->service(패키지키, 서비스명)로 연결합니다. 다른 패키지 PHP 파일을 직접 require해 내부 구현에 의존하지 않습니다.

route_prefix는 짧은 공개 기본 경로, admin_route_prefix는 관리자 기본 경로입니다. 충돌 경로는 실행을 막습니다. aliases:false는 새 패키지의 기존 확장 별칭을 만들지 않습니다. public_path는 등록된 공개 GET 진입점을 메뉴로 연결합니다.

뷰와 배포

View::forExtension의 탐색 순서는 선택 테마 extensions/이름, 패키지 템플릿, 사이트 공통, 코어 확장 조각입니다. 관리자 화면은 admin/extension과 extension_body 블록을 사용합니다. 공개 화면은 사이트 layout을 사용합니다.

bootstrap은 등록만 수행하고 등록 단계에서 업무 데이터·외부 발송을 바꾸지 않습니다. 필요한 의존성·자산은 개발 환경에서 준비한 완성본으로 배포합니다.

개발자 참고 소스

문서 파일 갱신 26-10-07 08:34:40