cms-orbit / lms
CMS Orbit LMS: TutorLMS-style learning management (courses, sections, lessons, quizzes, enrollments) for the Orbit admin engine.
Requires
- php: ^8.4
- cms-orbit/core: ^4.6
- laravel/framework: ^13.0
Requires (Dev)
- laravel/pint: ^1.30
Suggests
None
Provides
None
Conflicts
None
Replaces
None
README
cms-orbit/lms는 Orbit 관리자 엔진 위에 TutorLMS 스타일의 학습 관리(LMS)
도메인을 더하는 패키지입니다. 코스 → 섹션 → 레슨/퀴즈 구조와 수강신청·진도
관리를 Orbit Entity 기반 관리자 화면으로 제공합니다.
이 패키지는 TutorLMS의 기능/구조를 참고해 Orbit 규약으로 새로 구현한 것으로, 원본 코드를 포함하지 않습니다.
단계별 로드맵
| 단계 | 내용 | 상태 |
|---|---|---|
| Phase 1 — Core LMS | 코스/섹션/레슨/퀴즈/수강신청/진도, 강사·수강생 | ✅ 4.0.0 |
| Phase 2 — 오픈마켓형 수익화 | 코스 가격·주문·쿠폰·강사 커미션/매출/정산 | ✅ 4.1.0 |
| Phase 3 — 참여 기능 | Q&A·리뷰·과제·수료증 | ✅ 4.1.0 |
| Phase 4 — 공개 프론트엔드 | 코스 카탈로그·강의 플레이어·체크아웃·학생 대시보드 (호스트로 publish되는 스캐폴딩) | ✅ 4.1.0 |
오픈마켓(마켓플레이스)
독립 강사가 코스를 판매하고 플랫폼이 커미션을 가져가는 모델입니다. CheckoutService가
주문 → 강사/플랫폼 수익 분배 → 결제 시 수강 등록을 처리합니다. 커미션 기본값은
lms.marketplace.commission_rate(기본 80%, 코스별 commission_rate로 재정의).
관리자 Marketplace 섹션에서 주문·쿠폰·매출·정산을, Engagement 섹션에서
리뷰·Q&A·과제·수료증을 관리합니다.
공개 프론트엔드 스캐폴딩
php artisan lms:install-frontend # 덮어쓰기: --force npm run build # 또는 npm run dev
코스 카탈로그(/courses), 코스 상세, 강의 플레이어(/learn/...), 체크아웃, 학생
대시보드(/my-courses)의 React/Inertia 페이지와 공개 컨트롤러·라우트를 호스트로
게시합니다. 라라벨 스타터킷처럼 게시 후에는 호스트가 소유·자유롭게 수정합니다.
체크아웃 스캐폴딩은 데모용으로 즉시 결제 완료 처리하므로, 프로덕션에서는
CheckoutController::store()의 표시된 지점에 실제 결제 게이트웨이를 연결하세요.
요구사항
- PHP
^8.4 - Laravel
^13.0 cms-orbit/core^4.5
설치
composer require cms-orbit/lms php artisan migrate
백엔드(엔티티·마이그레이션·메뉴·권한)는 패키지 auto-discovery로 설치만으로 자동 등록됩니다. 호스트 파일 수정이 필요 없습니다.
도메인 모델
Course(lms_courses) — 제목, 슬러그, 강사(user), 난이도, 상태, 카테고리, 소요시간CourseSection(lms_course_sections) — 코스 내 정렬된 섹션(TutorLMS의 "topic")Lesson(lms_lessons) — 섹션 내 동영상/텍스트 단위,is_preview무료 미리보기Quiz/QuizQuestion— 단일/복수/참거짓 문항(options·correctJSON)Enrollment(lms_enrollments) — 수강생의 코스 등록, 진도율·상태LessonProgress(lms_lesson_progress) — 레슨별 완료.Enrollment::recalculateProgress()가 이를 집계해 진도율/완료를 갱신
설정
config('lms.user_model')로 강사/수강생 user 모델을 지정합니다(기본: 앱의 인증
user 모델). 설정을 게시하려면:
php artisan vendor:publish --tag=lms-config
드립 콘텐츠 & 플레이어 옵션
코스에서 드립을 켜고(drip_enabled) 방식(drip_type)을 고릅니다: 수강 후 N일,
특정 날짜, 순차(이전 레슨 완료), 선수 레슨. 레슨별로 drip_days/drip_date/
drip_prerequisite_id를 설정하며 Lesson::isUnlockedFor($enrollment)가 잠금을
판정합니다(무료 미리보기는 항상 열림). 플레이어는 코스별 옵션(탐색 불가,
빨리감기 불가, 자동재생, 완료 후 진행)을 지원하며 스캐폴딩 플레이어가 네이티브
비디오에서 이를 적용합니다.
이수증 & GUI 빌더 (관리자)
이수증 빌더는 Orbit 관리자 엔티티입니다. Engagement → Certificate Templates에서
템플릿을 만들고, 편집 화면의 커스텀 ReactField(lms-certificate-builder) 캔버스에서
텍스트/플레이스홀더를 드래그 배치합니다. 이 컴포넌트는 패키지가 소유하며
frontend.json의 registrations로 자동 등록됩니다(설치 후 php artisan orbit:frontend-sync && npm run build; cms-orbit/core ^4.0.12 필요).
{{student_name}}·{{course_title}}·{{instructor_name}}·{{issued_date}}·
{{serial}} 치환을 지원합니다. CertificateService::issue()로 완료 수강에
발급하고 renderHtml()로 인쇄/PDF용 HTML을 렌더합니다. 학생은 스토어프론트의
/certificates/{id}에서 자신의 이수증을 보고 인쇄합니다.
강사 대시보드
/instructor(게시된 스캐폴딩)에서 강사별 코스·수강생·매출(총/정산가능/정산완료)·
최근 리뷰·Q&A를 확인합니다(InstructorDashboardService).
업데이트 노트
4.6.0
cms-orbit/core^4.5→^4.6: core 4.6.0 이OrbitAccess라우팅 리졸버와 여러 관리자 화면 수정(PostgreSQL 500, strict mode,orbit:install의 OrbitProvider 미등록)을 담고 있습니다.- GitHub Actions 워크플로 추가: php 8.4·8.5 로
composer validate와pint --test를 돌리는ci.yml, 그리고 태그의composer.jsonversion 이 태그명과 일치하는지 확인하는release-guard.yml. Packagist 는 불일치 태그를 조용히 무시합니다. - 위성 패키지의 CI 는
cms-orbit/core를 Packagist 게시본으로 받으므로, "지금 게시된 core 와 이 패키지의 제약이 함께 해석되는가" 까지 같이 검증합니다. - pint 포맷 정규화:
pint --test를 CI 게이트로 걸려면 기존 코드가 설정에 맞아야 해서 함께 정규화했습니다. 순수 포맷 변경이며 동작은 바뀌지 않습니다.
4.5.0
laravel/framework^11.0 || ^12.0 || ^13.0→^13.0: Laravel 13 전용으로 좁혔습니다.cms-orbit/core^4.4→^4.5.- 왜 좁혔나: Pest 5 를 채택한 4.4.0(패키지별 4.1.0)부터
pest-plugin-laravel5 가laravel/framework ^13.23을 요구해, 이 저장소의 테스트가 Laravel 13 으로만 해석됩니다. 즉 Laravel 11·12 호환성을 더 이상 검증할 수 없는 상태로 그 범위를 광고하고 있었습니다. 검증되지 않는 지원 범위를 제약에 남겨두지 않기로 했습니다. - Laravel 11·12 사용자는 업그레이드가 필요합니다. 이번 변경은 실제로 지원 구성을 제거하므로, php 하한 상향과 달리 소비자에게 직접 영향이 있습니다. Laravel 13 으로 올리거나 이전 버전에 머물러야 합니다.
4.4.0
- php 제약
^8.3→^8.4: php 8.3 환경에서는 더 이상 설치되지 않습니다. cms-orbit/core^4.1→^4.4.- 생산 의존은 하나도 바뀌지 않았습니다. php 하한 상향으로 새로 받게 된 패키지는 Pest 5 계열(
require-dev)뿐입니다. cms-orbit 전 패키지의 직접 의존 20개를 최신판과 전수 대조했고, 나머지 18개는 이미 php^8.3에서 최신을 받고 있었습니다. 이번 상향은 기능 확보가 아니라 장기 정리 목적입니다. - 소비자의 Laravel 11·12 지원은 유지됩니다 (
laravel/framework ^11.0 || ^12.0 || ^13.0).
4.3.1
- php 제약
^8.3복구: 게시된 태그는 모두^8.3이었으나 main 에서^8.2로 내려가 있었습니다. Laravel 13 은 php^8.3을 요구하므로php ^8.2+laravel/framework ^13조합은 php 8.2 환경에서 조용히 Laravel 11 을 설치합니다. laravel/pint^1.14→^1.30(1.30 이 php^8.3을 요구).- 릴리스 파이프라인 도입:
.githooks/pre-push가 composer.json 의version필드와 태그명이 어긋난 태그의 푸시를 차단합니다.cms-orbit/core의4.0.8태그가version: 4.0.7로 만들어져 Packagist 가 아무 오류 없이 그 태그를 무시했고, 4.0.8 이 게시되지 않은 사실을 아무도 알지 못한 사고가 있었습니다.bin/release <버전>이 version 갱신·검증·커밋·태그·푸시를 한 동작으로 묶어 이 드리프트를 원천 차단하고,cms-orbit/*의존이 실제로 Packagist 에 게시되어 있는지 Composer 리졸버로 확인합니다. 저장소를 클론해composer install하면core.hooksPath가 자동 설정됩니다.
License
MIT