CMS Orbit Core - Essential infrastructure for CMS Orbit

Installs: 2

Dependents: 0

Suggesters: 0

Security: 0

Stars: 0

Watchers: 0

Forks: 0

Open Issues: 0

pkg:composer/cms-orbit/core

3.11.4 2025-10-13 12:59 UTC

This package is auto-updated.

Last update: 2025-10-13 12:59:58 UTC


README

CMS Orbit Logo

Laravel 11+를 위한 강력하고 확장 가능한 CMS 패키지

Laravel Vue.js PHP

버전 3.11.0 | 문서 | 설치 | 예제

✨ 소개

CMS Orbit은 Laravel 11과 Vue 3를 기반으로 구축된 현대적인 콘텐츠 관리 시스템입니다. Orchid Platform의 강력한 관리자 패널과 유연한 테마 시스템을 통해 무한한 확장성을 제공합니다.

CMS Orbit Core는 이제 Composer 패키지입니다! 보일러플레이트를 포크하는 대신, 순정 Laravel 11+ 프로젝트에 패키지를 설치하여 바로 사용할 수 있습니다.

🎯 주요 특징

  • 🎨 테마 시스템: Inertia.js + Vue 3 기반의 멀티 테마 SPA
  • 📦 엔티티 시스템: DynamicModel과 DocumentModel로 유연한 콘텐츠 구조
  • 🌍 다국어 지원: Spatie Translatable 기반의 완전한 국제화
  • 🏢 멀티사이트: Stancl/Tenancy를 통한 다중 도메인 지원
  • 🛠️ Orchid Platform: 강력한 관리자 패널과 커스텀 화면
  • 🔒 권한 시스템: 세밀한 역할 기반 접근 제어
  • 📝 SEO 최적화: 자동 메타데이터 생성
  • 🎯 CLI 명령어: 빠른 개발을 위한 15개 Artisan 명령어

📋 시스템 요구사항

  • PHP: 8.2 이상
  • Laravel: 11.x
  • MySQL/MariaDB: 5.7+ / 10.3+
  • Node.js: 18.x 이상
  • Yarn: 최신 버전
  • Composer: 2.x 이상

🔧 설치

방법 1: 한 번에 설치 (권장)

# 1. Laravel 프로젝트 생성
composer create-project laravel/laravel my-cms
cd my-cms

# 2. CMS Orbit Core 설치
composer require cms-orbit/core

# 3. 한 번에 설치! 🚀
php artisan cms:install

cms:install이 자동으로 실행하는 작업:

  • ✅ 설정 파일 배포 (config/cms-orbit.php)
  • ✅ 코드 생성 템플릿 배포 (stubs/ - 81개)
  • ✅ 공용 에셋 배포 (public/assets/ - 폰트, 아이콘 등)
  • ✅ 필수 디렉토리 생성 (app/Entities/, app/Settings/, themes/)
  • ✅ 데이터베이스 마이그레이션 실행
  • ✅ 관리자 계정 생성
  • ✅ 테마 스크립트 빌드 (Vite 별칭 등록)

옵션:

php artisan cms:install --force       # 기존 파일 덮어쓰기
php artisan cms:install --no-migrate  # 마이그레이션 건너뛰기
php artisan cms:install --no-admin    # 관리자 생성 건너뛰기

방법 2: 단계별 설치

# 1. Laravel 프로젝트 생성
composer create-project laravel/laravel my-cms
cd my-cms

# 2. CMS Orbit Core 설치
composer require cms-orbit/core

# 3. 설정 파일 배포
php artisan vendor:publish --tag=cms-orbit-config

# 4. 코드 생성 템플릿 배포
php artisan vendor:publish --tag=cms-orbit-stubs

# 5. 공용 에셋 배포
php artisan vendor:publish --tag=cms-orbit-assets

# 6. 데이터베이스 설정 (.env)
DB_CONNECTION=mysql
DB_DATABASE=cms_orbit
DB_USERNAME=root
DB_PASSWORD=

# 7. 마이그레이션 실행
php artisan migrate

# 8. 관리자 계정 생성
php artisan cms:admin

# 9. 프론트엔드 빌드
yarn install
yarn build

개발 환경 실행

# 프론트엔드 개발 서버 (HMR)
yarn dev

# Laravel 서버
php artisan serve

🎉 완료! http://localhost:8000에서 사이트를, http://localhost:8000/admin에서 관리자 패널을 확인하세요.

📦 엔티티 시스템

CMS Orbit은 세 가지 타입의 모델을 제공합니다:

1. DynamicModel (기본 엔티티)

관리자 패널에 필요한 공통 기능을 갖춘 기본 모델입니다.

php artisan cms:entity Product

생성되는 파일:

  • app/Entities/Product/Product.php - 모델 클래스
  • app/Entities/Product/Screens/ - Orchid 화면
  • app/Entities/Product/Layouts/ - Orchid 레이아웃
  • app/Entities/Product/routes/settings.php - 관리자 라우트
  • database/migrations/xxxx_create_products_table.php - 마이그레이션

기본 기능:

  • ✅ 관리자 메뉴 자동 등록
  • ✅ 권한 시스템 통합
  • ✅ 미디어 첨부 지원
  • ✅ 정렬 기능
  • ✅ 활동 로그

예제:

namespace App\Entities\Product;

use CmsOrbit\Core\Services\DynamicModel;
use CmsOrbit\Core\Services\Traits\HasPermissions;
use CmsOrbit\Core\Services\Traits\SettingMenuItemTrait;

class Product extends DynamicModel
{
    use HasPermissions, SettingMenuItemTrait;

    protected $fillable = ['name', 'description', 'price', 'stock'];

    public static function getMenuItems(): array
    {
        return [
            [
                'section' => __('Shop'),
                'title' => __('Products'),
                'route' => 'settings.entities.products.index',
                'icon' => 'bs.box',
            ],
        ];
    }

    public static function getPermissions(): array
    {
        return [
            'settings.entities.products.index' => __('View Products'),
            'settings.entities.products.create' => __('Create Product'),
            'settings.entities.products.edit' => __('Edit Product'),
            'settings.entities.products.delete' => __('Delete Product'),
        ];
    }
}

2. DocumentModel (문서형 엔티티)

프론트엔드에 노출되는 콘텐츠를 위한 강력한 모델입니다.

php artisan cms:document Blog

추가 기능 (DynamicModel + ):

  • ✅ 자동 다국어 콘텐츠 관리
  • ✅ SEO 메타데이터 자동 생성
  • ✅ 조회수, 추천/비추천 수
  • ✅ 작성자 정보
  • ✅ 슬러그 자동 생성
  • ✅ 승인 워크플로우

자동 제공 컬럼:

// documents 테이블
'document_id', 'document_uuid', 'author_id', 'author_type',
'read_count', 'comment_count', 'assent_count', 'dissent_count',
'is_notice', 'is_secret', 'approved', 'ipaddress'

// document_contents 테이블 (다국어)
'title', 'content', 'description', 'format', 'pure_content', 'slug'

사용 예제:

// 다국어 블로그 포스트 생성
$blog = Blog::create([
    'author_id' => auth()->id(),
    'author_type' => User::class,
    'save_contents' => [
        'ko' => [
            'title' => '한국어 제목',
            'content' => '한국어 내용',
            'description' => '한국어 요약'
        ],
        'en' => [
            'title' => 'English Title',
            'content' => 'English Content',
            'description' => 'English Summary'
        ]
    ]
]);

// 카운터 업데이트
$blog->incrementReadCount();      // 조회수 +1
$blog->incrementAssentCount();    // 추천수 +1

// 현재 로케일로 자동 조회
$blogs = Blog::where('is_notice', false)
    ->orderBy('created_at', 'desc')
    ->paginate(10);

// $blog->title은 자동으로 현재 언어의 제목을 반환

3. Eloquent Model (종속 모델)

일반적인 Laravel Eloquent 모델입니다.

php artisan cms:model Comment --entity=Blog

사용처: 댓글, 태그, 평점 등 특정 엔티티에 종속되는 모델

🎨 테마 시스템

테마 구조

themes/my-theme/
├── package.json              # 테마별 의존성
├── vite.config.js
├── tailwind.config.js
├── Pages/                    # Inertia 페이지
│   ├── Home.vue
│   └── Blog/
│       ├── Index.vue
│       └── Show.vue
├── Components/               # Vue 컴포넌트
│   ├── Header.vue
│   └── Footer.vue
├── Layouts/                  # 레이아웃
│   └── AppLayout.vue
└── views/
    └── app.blade.php         # Blade 엔트리포인트

테마 생성

php artisan cms:theme
# 테마 이름 입력: my-theme

테마별 패키지 설치 (Yarn Workspaces)

# 특정 테마에 패키지 추가
yarn workspace my-theme add @headlessui/vue

# 루트에 공통 패키지 추가
yarn add axios

개발 및 빌드

# 개발 모드 (HMR)
yarn dev

# 프로덕션 빌드
yarn build

다국어 지원

Vue 컴포넌트에서:

<script setup>
import { __ } from '@/lib/translate';
</script>

<template>
    <h1>{{ __('Welcome') }}</h1>
    <p>{{ __('This is a test message') }}</p>
</template>

언어 파일 (resources/lang/ko.json):

{
  "Welcome": "환영합니다",
  "This is a test message": "이것은 테스트 메시지입니다"
}

중요:

  • ❌ 중첩 JSON 사용 금지
  • ✅ 영문 전체를 키로 사용
  • en.json은 대부분 불필요 (키가 영문)

Pagination 예제:

{
  "Showing :from to :to of :total results": "총 :total개 중 :from부터 :to까지"
}

🛠️ Orchid 레이아웃

중요: 항상 OrbitLayout을 사용하세요! (Orchid의 기본 Layout 사용 금지)

use CmsOrbit\Core\Settings\Extends\OrbitLayout;

public function layout(): iterable
{
    return [
        OrbitLayout::tabs([
            '기본 정보' => [
                Input::make('name')->title('이름'),
                Input::make('email')->title('이메일'),
            ],
            '추가 정보' => [
                Textarea::make('bio')->title('자기소개'),
            ],
        ]),
    ];
}

사용 가능한 레이아웃

Tabs (탭)

OrbitLayout::tabs([
    '탭 1' => [/* 필드들 */],
    '탭 2' => [/* 필드들 */],
]);

Columns (그리드)

OrbitLayout::columns([
    OrbitLayout::component(Input::make('first_name')),
    OrbitLayout::component(Input::make('last_name')),
]);

Accordion (아코디언)

OrbitLayout::accordion([
    '섹션 1' => [/* 필드들 */],
    '섹션 2' => [/* 필드들 */],
]);

Vue Component (Vue 컴포넌트)

OrbitLayout::vue('CustomComponent', [
    'prop1' => 'value1',
    'prop2' => 'value2',
]);

TreeTable (계층 구조)

OrbitLayout::TreeTable(
    'categories',  // 데이터 소스
    [
        'name' => '이름',
        'slug' => 'Slug',
        'order' => '순서',
    ],
    'id'  // 고유 식별자
);

🎯 CLI 명령어

설치 및 설정

# 한 번에 설치
php artisan cms:install

# 관리자 생성
php artisan cms:admin

# 권한 초기화
php artisan cms:fresh-super-admin-role

엔티티 생성

# DynamicModel 엔티티
php artisan cms:entity Product

# DocumentModel 엔티티
php artisan cms:document Blog

# 종속 모델
php artisan cms:model Comment --entity=Blog

테마 관리

# 테마 생성
php artisan cms:theme

# 테마 스크립트 빌드 (Vite 별칭 등록)
php artisan cms:build-theme-scripts

코드 생성

# Orchid Screen (화면)
php artisan cms:screen

# Orchid Rows (테이블 레이아웃)
php artisan cms:rows

# Orchid Presenter (프레젠터)
php artisan cms:presenter

# 커스텀 필드
php artisan cms:field MyField

유틸리티

# 언어 파일 생성
php artisan cms:generate-lang ko

# 파비콘 생성
php artisan cms:favicon-generator

# 마이그레이션 생성
php artisan cms:migration create_products_table

🔌 커스텀 필드 개발

관리자 패널에서 재사용 가능한 커스텀 필드를 만들 수 있습니다.

필드 생성

php artisan cms:field PriceField

생성되는 파일:

  • app/Settings/Fields/PriceField/PriceField.php - 필드 클래스
  • app/Settings/Fields/PriceField/edit.blade.php - Blade 템플릿
  • app/Settings/Fields/PriceField/Components/PriceFieldEdit.vue - Vue 컴포넌트
  • app/Settings/Fields/PriceField/js/edit_controller.js - Stimulus 컨트롤러

필드 클래스

<?php

namespace App\Settings\Fields\PriceField;

use Orchid\Screen\Field;

class PriceField extends Field
{
    protected $view = 'fields::PriceField.edit';
    
    protected $attributes = [
        'currency' => 'KRW',
        'min' => 0,
    ];
    
    public function currency(string $currency): self
    {
        $this->set('currency', $currency);
        return $this;
    }
    
    public function min(int $min): self
    {
        $this->set('min', $min);
        return $this;
    }
}

필드 사용

use App\Settings\Fields\PriceField\PriceField;
use CmsOrbit\Core\Settings\Extends\OrbitLayout;

public function layout(): iterable
{
    return [
        OrbitLayout::rows([
            PriceField::make('price')
                ->title('상품 가격')
                ->currency('KRW')
                ->min(0),
        ]),
    ];
}

📦 패키지 개발

CMS Orbit을 확장하는 패키지를 만들 수 있습니다.

패키지 구조

your-package/
├── composer.json
├── src/
│   ├── YourPackageServiceProvider.php
│   ├── Entities/                      # 엔티티 시스템
│   │   └── YourEntity/
│   │       ├── YourEntity.php         # 모델
│   │       ├── Screens/               # Orchid 화면
│   │       ├── Layouts/               # Orchid 레이아웃
│   │       └── routes/settings.php    # 관리자 라우트
│   ├── Traits/
│   │   └── HasYourFeature.php         # 외부 모델용 Trait
│   └── Http/Controllers/              # API 컨트롤러
├── config/your-package.php            # 설정 파일
├── database/migrations/               # 마이그레이션
├── routes/your-package-api.php        # API 라우트
└── resources/
    ├── js/Components/                 # Vue 컴포넌트
    └── lang/                          # 다국어 파일

ServiceProvider

<?php

namespace YourVendor\YourPackage;

use CmsOrbit\Theme\Console\Commands\BuildThemeScripts;
use CmsOrbit\Core\Lang\LoadLangTrait;
use CmsOrbit\Core\Services\CmsHelper;
use CmsOrbit\Theme\ThemePathRegister;
use Illuminate\Support\ServiceProvider;

class YourPackageServiceProvider extends ServiceProvider
{
    use LoadLangTrait;

    public function register(): void
    {
        // 설정 파일 병합
        $this->mergeConfigFrom(__DIR__.'/../config/your-package.php', 'your-package');

        // 🎯 핵심: 엔티티 자동 등록
        CmsHelper::addEntityPath(
            "YourVendor\\YourPackage\\Entities",
            __DIR__."/Entities"
        );

        // 프론트엔드 경로 등록 (Vite 별칭)
        $frontendPath = new ThemePathRegister(
            '@orbit/your-package',
            __DIR__.'/../resources/js'
        );
        BuildThemeScripts::registerPath($frontendPath);

        // Tailwind CSS 경로
        BuildThemeScripts::registerTailwindBase(
            __DIR__.'/../resources/js/**/**/*.vue'
        );
    }

    public function boot(): void
    {
        // 다국어 파일 로드
        $this->loadJsonLang(__DIR__.'/../resources/lang');

        // 마이그레이션 로드
        $this->loadMigrationsFrom(__DIR__.'/../database/migrations');

        // API 라우트 로드
        $this->loadRoutesFrom(__DIR__.'/../routes/your-package-api.php');

        // 설정 파일 배포
        if ($this->app->runningInConsole()) {
            $this->publishes([
                __DIR__.'/../config/your-package.php' => config_path('your-package.php'),
            ], 'your-package-config');
        }
    }
}

패키지 설치

# 1. 패키지 설치
composer require your-vendor/your-package

# 2. 마이그레이션
php artisan migrate

# 3. 테마 스크립트 빌드 (프론트엔드 자산 등록)
php artisan cms:build-theme-scripts

# 4. 권한 초기화
php artisan cms:fresh-super-admin-role

테마에서 패키지 컴포넌트 사용

<script setup>
// @orbit/your-package 별칭으로 바로 접근
import YourComponent from '@orbit/your-package/Components/YourComponent.vue';

const props = defineProps(['post']);
</script>

<template>
    <div>
        <h1>{{ post.title }}</h1>
        
        <YourComponent
            :target-type="'App\\Entities\\Post\\Post'"
            :target-id="post.id"
        />
    </div>
</template>

⚙️ 설정

환경 변수 (.env)

# CMS 설정
DEFAULT_THEME=default
USE_TENANT=false
SETTINGS_DEMO=true

# 지원 언어
SUPPORTED_LANGUAGES=ko,en

# 전화번호 형식
PHONE_E164_DEFAULT_COUNTRY=KR

설정 파일 (config/cms-orbit.php)

return [
    'central_domain' => env('CENTRAL_DOMAIN', 'localhost'),
    'settings_demo' => env('SETTINGS_DEMO', true),
    'use_tenant' => env('USE_TENANT', false),
    'default_theme' => env('DEFAULT_THEME', 'default'),
    
    'supported_languages' => [
        'ko' => [
            'code' => 'ko',
            'name' => '한국어',
            'flag_emoji' => '🇰🇷',
            'fakerLocale' => 'ko_KR',
        ],
        'en' => [
            'code' => 'en',
            'name' => 'English',
            'flag_emoji' => '🇺🇸',
            'fakerLocale' => 'en_US',
        ],
    ],
];

🏗️ 프로젝트 구조

설치 후 Laravel 프로젝트는 다음과 같은 구조를 가집니다:

your-laravel-app/
├── app/
│   ├── Entities/                # 엔티티 (AppServiceProvider에서 등록)
│   │   ├── User/
│   │   ├── Product/
│   │   └── Blog/
│   ├── Settings/                # 프로젝트별 설정
│   │   ├── Asides/              # 메뉴 정의
│   │   ├── Filters/             # Orchid 필터
│   │   ├── resources/           # 뷰, 언어파일
│   │   └── routes/              # 관리자 라우트
│   └── Providers/
│       └── AppServiceProvider.php      # 엔티티 등록
├── themes/                      # 테마 파일들
│   └── default/
├── config/
│   └── cms-orbit.php           # CMS 설정
├── database/migrations/         # 마이그레이션
├── stubs/                       # 코드 생성 템플릿 (81개)
└── public/assets/               # 공용 에셋

💡 사용 예제

블로그 만들기

# 1. 블로그 엔티티 생성
php artisan cms:document Blog
php artisan migrate
php artisan cms:fresh-super-admin-role

# 2. 관리자 패널에서 포스트 작성
# http://localhost:8000/admin → Blog 메뉴

# 3. 프론트엔드 페이지 생성
# themes/default/Pages/Blog/Index.vue

Index.vue:

<script setup>
import { Link } from '@inertiajs/vue3';
import { __ } from '@/lib/translate';

defineProps({
    blogs: Object
});
</script>

<template>
    <div class="max-w-4xl mx-auto py-8">
        <h1 class="text-3xl font-bold mb-8">{{ __('Blog') }}</h1>
        
        <div class="space-y-6">
            <article 
                v-for="blog in blogs.data" 
                :key="blog.id"
                class="bg-white rounded-lg shadow-md p-6"
            >
                <h2 class="text-xl font-semibold mb-2">
                    <Link :href="route('blog.show', blog.slug)">
                        {{ blog.title }}
                    </Link>
                </h2>
                <p class="text-gray-600">{{ blog.description }}</p>
                <div class="text-sm text-gray-500 mt-4">
                    {{ __('Views') }}: {{ blog.read_count }}
                </div>
            </article>
        </div>
    </div>
</template>

전자상거래 사이트 만들기

# 엔티티 생성
php artisan cms:entity Product
php artisan cms:entity Category
php artisan cms:entity Order

php artisan migrate
php artisan cms:fresh-super-admin-role

🎯 베스트 프랙티스

보안

// ✅ Form Request 사용
public function store(StorePostRequest $request)
{
    $validated = $request->validated();
}

// ✅ Eloquent 또는 Query Builder 사용
Post::where('user_id', $userId)->get();

// ❌ Raw Query 지양
DB::select("SELECT * FROM posts WHERE user_id = $userId");

성능

// ✅ Eager Loading
$posts = Post::with('author')->get();

// ❌ N+1 문제
$posts = Post::all();
foreach ($posts as $post) {
    echo $post->author->name;  // 각 루프마다 쿼리 발생
}

// ✅ 항상 페이지네이션 사용
$posts = Post::paginate(15);

// ❌ 대량 데이터에 get() 사용 금지
$posts = Post::all();

코드 품질

// ✅ getAttribute() 사용 (매직 메서드 지양)
$model->getAttribute('title');
$request->get('name');

// ❌ 매직 프로퍼티 사용 금지
$model->title;
$request->name;

// ✅ 타입 힌트 필수
public function create(array $data): Model

// ✅ Strict typing
declare(strict_types=1);

📚 상세 가이드

엔티티 시스템

DynamicModel vs DocumentModel:

  • DynamicModel: 관리자 패널용 단순 데이터 (제품, 카테고리 등)
  • DocumentModel: 프론트엔드 노출 콘텐츠 (게시판, 블로그, 페이지 등)
  • Eloquent Model: 종속 관계 모델 (댓글, 태그, 평점 등)

권한 시스템

모든 엔티티는 자동으로 권한 시스템에 통합됩니다:

public static function getPermissions(): array
{
    return [
        'settings.entities.products.index' => __('View Products'),
        'settings.entities.products.create' => __('Create Product'),
        'settings.entities.products.edit' => __('Edit Product'),
        'settings.entities.products.delete' => __('Delete Product'),
    ];
}

메뉴 자동 등록

public static function getMenuItems(): array
{
    return [
        [
            'section' => __('Shop'),
            'priority' => 5000,
            'title' => __('Products'),
            'icon' => 'bs.box',
            'route' => 'settings.entities.products.index',
            'permission' => 'settings.entities.products.index',
            'badge' => static::count(),
        ],
    ];
}

🔄 업데이트

패키지 업데이트

# 최신 버전으로 업데이트
composer update cms-orbit/core

# 마이그레이션 실행
php artisan migrate

# 권한 새로고침
php artisan cms:fresh-super-admin-role

# 테마 스크립트 재빌드
php artisan cms:build-theme-scripts

# 캐시 클리어
php artisan optimize:clear

버전 정책

CMS Orbit Core는 Laravel 버전을 따라갑니다:

3.{LaravelVersion}.{Patch}

예시:
3.11.0 - Laravel 11.x 첫 릴리즈
3.11.1 - Laravel 11.x 첫 패치
3.12.0 - Laravel 12.x 첫 릴리즈 (향후)

🚀 빠른 시작 체크리스트

새 프로젝트

  • composer create-project laravel/laravel my-cms
  • cd my-cms
  • composer require cms-orbit/core
  • php artisan cms:install
  • yarn install && yarn dev
  • 브라우저에서 http://localhost:8000/admin 접속
  • 첫 번째 엔티티 생성: php artisan cms:entity Product

기존 Laravel 프로젝트에 추가

  • composer require cms-orbit/core
  • php artisan cms:install
  • php artisan migrate
  • php artisan cms:admin
  • yarn install && yarn build

🎨 프론트엔드 개발

Vue 3 Composition API

<script setup>
import { ref, computed, onMounted } from 'vue';
import { Link } from '@inertiajs/vue3';
import { __ } from '@/lib/translate';
import axios from 'axios';

const props = defineProps({
    post: Object,
});

const comments = ref([]);
const isLoading = ref(false);

const loadComments = async () => {
    isLoading.value = true;
    try {
        const response = await axios.get(`/api/posts/${props.post.id}/comments`);
        comments.value = response.data.data;
    } catch (error) {
        console.error('Failed to load comments:', error);
    } finally {
        isLoading.value = false;
    }
};

onMounted(() => {
    loadComments();
});
</script>

<template>
    <div class="post">
        <h1 class="text-3xl font-bold">{{ post.title }}</h1>
        <div v-html="post.content" class="prose"></div>
        
        <div v-if="isLoading">{{ __('Loading...') }}</div>
        <div v-else class="comments mt-8">
            <h2 class="text-2xl font-semibold mb-4">{{ __('Comments') }}</h2>
            <div v-for="comment in comments" :key="comment.id" class="mb-4">
                {{ comment.content }}
            </div>
        </div>
    </div>
</template>

API 통신

중요: API 라우트는 web 미들웨어를 사용해야 세션 처리 가능!

// routes/api.php
Route::middleware(['web'])->group(function () {
    Route::get('/posts', [PostController::class, 'index']);
    Route::get('/posts/{post}/comments', [CommentController::class, 'index']);
});

🛡️ 보안

입력 검증

// Form Request 사용
public function store(StoreProductRequest $request)
{
    $validated = $request->validated();
    Product::create($validated);
}

XSS 방지

<!-- ✅ 안전 (자동 이스케이프) -->
<div>{{ userInput }}</div>

<!-- ❌ 위험 (v-html 사용 주의) -->
<div v-html="userInput"></div>

CSRF 보호

Axios는 자동으로 CSRF 토큰을 포함합니다:

// resources/js/lib/bootstrap.js에서 설정됨
axios.defaults.headers.common['X-CSRF-TOKEN'] = token;

📖 추가 문서

프로젝트의 AGENTS.md 파일에서 더 자세한 가이드를 확인하세요:

  • 엔티티 시스템 심화
  • Orchid 레이아웃 전체 옵션
  • 커스텀 필드 개발 완전 가이드
  • 테마 시스템 심화
  • 패키지 개발 심화
  • 베스트 프랙티스 및 체크리스트

🤝 기여하기

CMS Orbit Core는 오픈 소스 기여를 환영합니다!

📄 라이선스

CMS Orbit Core는 Proprietary 라이선스입니다. 자세한 내용은 LICENSE 파일을 참조하세요.

🆘 지원

CMS Orbit Team이 ❤️를 담아 제작했습니다

Version 3.11.0 - Laravel 11.x 호환

설치하기문서패키지 개발