File: /home/dnlightw-124/dn.lightweb.kr/config/tenancy.php
<?php
declare(strict_types=1);
use Database\Seeders\TenantSeeder;
use Stancl\Tenancy\Bootstrappers;
use Stancl\Tenancy\Middleware;
use Stancl\Tenancy\Resolvers;
use Stancl\Tenancy\UniqueIdentifierGenerators;
return [
// v3 requires these top-level keys
'tenant_model' => App\Settings\Entities\Tenant\Tenant::class,
'domain_model' => \App\Settings\Entities\Tenant\TenantDomain::class,
'central_domains' => [
env('CENTRAL_DOMAIN'),
],
/**
* Tenancy에 사용되는 모델에 대한 설정.
*/
'models' => [
'tenant' => App\Settings\Entities\Tenant\Tenant::class,
'domain' => \App\Settings\Entities\Tenant\TenantDomain::class,
'tenant_key_column' => 'tenant_id',
'id_generator' => UniqueIdentifierGenerators\UUIDGenerator::class,
],
'identification' => [
'central_domains' => [
env('CENTRAL_DOMAIN'),
],
'default_middleware' => Middleware\InitializeTenancyByDomainOrSubdomain::class,
'middleware' => [
Middleware\InitializeTenancyByDomainOrSubdomain::class,
Middleware\InitializeTenancyByPath::class,
Middleware\InitializeTenancyByRequestData::class,
Middleware\InitializeTenancyByOriginHeader::class,
],
/**
* 도메인 식별 미들웨어로 인식되는 식별 미들웨어입니다.
*
* 이는 액세스 방지 미들웨어를 건너뛰어야 하는지 여부를 결정하는 데 사용됩니다.
* PreventAccessFromUnwantedDomains은 여기에 포함된 미들웨어와 함께 사용될 때만 사용할 수 있습니다.
* 다른 식별 미들웨어와 함께 사용되는 경우 이를 건너뛰게 됩니다.
*
* 사용자 정의 도메인 식별 미들웨어를 사용하는 경우, 여기에 추가하세요.
*
* @see \Stancl\Tenancy\Concerns\UsableWithEarlyIdentification
* @see \Stancl\Tenancy\Middleware\PreventAccessFromUnwantedDomains
*/
'domain_identification_middleware' => [
Middleware\InitializeTenancyByDomainOrSubdomain::class,
],
/**
* 경로 식별 미들웨어로 인식되는 식별 미들웨어입니다.
*
* 경로 식별 사용 중 특정 작업(예: ForgetTenantParameter에서 테넌트 매개변수 삭제)을 수행할 때
* 경로 식별이 사용되는지 결정하는 데 사용됩니다.
*
* 사용자 정의 경로 식별 미들웨어를 사용하는 경우, 여기에 추가하세요.
*
* @see \Stancl\Tenancy\Actions\CloneRoutesAsTenant
* @see \Stancl\Tenancy\Listeners\ForgetTenantParameter
*/
'path_identification_middleware' => [
Middleware\InitializeTenancyByPath::class,
],
/**
* 패키지에서 사용하는 테넌트 리졸버입니다.
*
* CachedTenantResolver 계약을 구현하는 리졸버는 캐싱 세부사항을 구성할 수 있는 옵션이 있습니다.
* 사용자 정의 리졸버를 추가하는 경우, 리졸버가 CachedTenantResolver를 기반으로 하지 않는 한 'cache' 키를 추가하지 마세요.
*/
'resolvers' => [
Resolvers\DomainTenantResolver::class => [
'cache' => false,
'cache_ttl' => 3600, // 초 단위
'cache_store' => null, // null = 기본값
],
Resolvers\PathTenantResolver::class => [
'tenant_parameter_name' => 'tenant',
'tenant_model_column' => 'host',
'allowed_extra_model_columns' => [], // 라우트 필드 바인딩에 사용됨
'cache' => false,
'cache_ttl' => 3600, // 초 단위
'cache_store' => null, // null = 기본값
],
Resolvers\RequestDataTenantResolver::class => [
'cache' => false,
'cache_ttl' => 3600, // 초 단위
'cache_store' => null, // null = 기본값
],
],
// todo@docs 통합 가이드를 Stancl\Tenancy::defaultMiddleware() 사용으로 업데이트
],
/**
* 테넌시 부트스트래퍼는 테넌시가 초기화될 때 실행됩니다.
* Laravel 기능을 테넌트 인식 가능하게 만드는 역할을 합니다.
*
* 동작을 구성하려면 아래의 구성 키를 참조하세요.
*/
'bootstrappers' => [
// 기본 Laravel 기능
Bootstrappers\DatabaseTenancyBootstrapper::class,
Bootstrappers\CacheTenancyBootstrapper::class,
// Bootstrappers\CacheTagsBootstrapper::class, // CacheTenancyBootstrapper의 대안
Bootstrappers\FilesystemTenancyBootstrapper::class,
Bootstrappers\QueueTenancyBootstrapper::class,
// Bootstrappers\RedisTenancyBootstrapper::class, // 참고: phpredis 필요
// 특수 사례 지원
Bootstrappers\DatabaseSessionBootstrapper::class,
Bootstrappers\JobBatchBootstrapper::class,
// 구성 가능한 부트스트래퍼
// Bootstrappers\RootUrlBootstrapper::class,
// Bootstrappers\UrlGeneratorBootstrapper::class,
// Bootstrappers\MailConfigBootstrapper::class, // 참고: 메일 큐 사용에는 $forceRefresh가 true로 설정된 QueueTenancyBootstrapper 필요
// Bootstrappers\BroadcastingConfigBootstrapper::class,
// Bootstrappers\BroadcastChannelPrefixBootstrapper::class,
// 통합 부트스트래퍼
// Bootstrappers\Integrations\FortifyRouteBootstrapper::class,
// Bootstrappers\Integrations\ScoutPrefixBootstrapper::class,
// Bootstrappers\PostgresRLSBootstrapper::class,
],
'database' => [
'central_connection' => env('DB_CONNECTION', 'mariadb'),
/**
* 동적으로 생성된 테넌트 데이터베이스 연결의 "템플릿"으로 사용되는 연결.
* 참고: 템플릿 연결 이름을 tenant로 설정하지 마세요. 해당 이름은 패키지에서 예약되었습니다.
*/
'template_tenant_connection' => 'mariadb_tenant',
/**
* 테넌트 데이터베이스 생성 및 삭제에 사용되는 임시 연결 이름.
*/
'tenant_host_connection_name' => 'tenant_host_connection',
/**
* 테넌트 데이터베이스 이름은 아래와 같은 방식으로 생성됩니다:
* prefix + tenant_id + suffix.
*/
'prefix' => env('DB_DATABASE') . '_',
'suffix' => '',
/**
* TenantDatabaseManagers는 테넌트 데이터베이스 생성 및 삭제를 처리하는 클래스입니다.
*/
'managers' => [
'sqlite' => Stancl\Tenancy\Database\TenantDatabaseManagers\SQLiteDatabaseManager::class,
'mysql' => Stancl\Tenancy\Database\TenantDatabaseManagers\MySQLDatabaseManager::class,
'mariadb' => Stancl\Tenancy\Database\TenantDatabaseManagers\MySQLDatabaseManager::class,
'pgsql' => Stancl\Tenancy\Database\TenantDatabaseManagers\PostgreSQLDatabaseManager::class,
'sqlsrv' => Stancl\Tenancy\Database\TenantDatabaseManagers\MicrosoftSQLDatabaseManager::class,
/**
* 각 테넌트 데이터베이스에 대해 DB 사용자를 생성하려면 이 데이터베이스 매니저를 사용하세요.
* 부여되는 권한을 변경하려면 $grants 속성을 수정할 수 있습니다.
*/
// 'mysql' => Stancl\Tenancy\Database\TenantDatabaseManagers\PermissionControlledMySQLDatabaseManager::class,
// 'mariadb' => Stancl\Tenancy\Database\TenantDatabaseManagers\PermissionControlledMySQLDatabaseManager::class,
// 'sqlsrv' => Stancl\Tenancy\TenantDatabaseManagers\PermissionControlledMicrosoftSQLServerDatabaseManager::class,
/**
* 위의 pgsql 매니저를 비활성화하고 아래의 매니저를 활성화하면
* 데이터베이스가 아닌 스키마를 통해 테넌트 DB를 분리할 수 있습니다.
*/
// 'pgsql' => Stancl\Tenancy\Database\TenantDatabaseManagers\PostgreSQLSchemaManager::class, // 데이터베이스 대신 스키마로 분리
],
// todo@docblock
'drop_tenant_databases_on_migrate_fresh' => false,
],
/**
* 단일 데이터베이스 테넌시와 함께 PostgreSQL 필요.
*/
'rls' => [
/**
* 정책 생성을 위한 쿼리를 생성하는 RLS 매니저.
*
* @see Stancl\Tenancy\RLS\PolicyManagers\TableRLSManager
* @see Stancl\Tenancy\RLS\PolicyManagers\TraitRLSManager
*/
'manager' => Stancl\Tenancy\RLS\PolicyManagers\TableRLSManager::class,
/**
* 테넌트 데이터베이스 사용자에 대한 자격 증명 (모든 테넌트에 대해 하나의 사용자, 각 테넌트에 대한 사용자가 아님).
*/
'user' => [
'username' => env('TENANCY_RLS_USERNAME'),
'password' => env('TENANCY_RLS_PASSWORD'),
],
/**
* 현재 테넌트 키를 저장하는 데 사용되는 Postgres 세션 변수.
*
* 변수 이름에는 네임스페이스(예: 'my.')가 포함되어야 합니다.
* 전역 네임스페이스는 서버 설정용으로 예약되어 있으므로 네임스페이스가 필요합니다.
*/
'session_variable_name' => 'my.current_tenant',
],
/**
* 캐시 테넌시 구성. CacheTenancyBootstrapper, CacheTagsBootstrapper 및 사용자 정의 CacheManager에서 사용됩니다.
*
* 이것은 모든 Cache 퍼사드 호출, cache() 헬퍼 호출 및 주입된 캐시 스토어에 대한 직접 호출에 작동합니다.
*
* CacheTenancyBootstrapper:
* `cache.prefix` 구성을 사용하여 *전역적으로* 접두사가 적용됩니다. 이는 한 테넌트의 캐시를 다른 테넌트와 분리합니다.
* 스토어 목록은 `cache.prefix` 구성에서 접두사를 다시 로드하도록 새로 고치는 데 사용됩니다.
*
* CacheTagsBootstrapper:
* 캐시의 모든 키에는 태그가 적용됩니다. 이 태그는 기록 시뿐만 아니라 읽을 때도 캐시를 범위 내로 사용합니다.
*
* 태그를 지정하여 선택적으로 캐시를 지울 수 있습니다.
*/
'cache' => [
'prefix' => 'tenant_%tenant%_', // 이 포맷은 %tenant%가 테넌트 키로 대체되고, 원래의 스토어 접두사로 앞에 추가됩니다. 이는 모든 캐시 키에 사용되는 캐시 접두사를 형성합니다.
'stores' => [
env('CACHE_STORE'),
],
/*
* 세션이 테넌트 인식 가능해야 하는지 여부 (세션 드라이버가 캐시 기반일 때만 사용).
*
* 참고: 이는 구성된 세션 스토어를 위의 접두사 스토어 목록에 암시적으로 추가합니다.
*/
'scope_sessions' => true,
'tag_base' => 'tenant', // 이 tag_base 뒤에 tenant_id가 따라와 모든 캐시 호출에 적용될 태그를 형성합니다.
],
/**
* 파일 시스템 테넌시 구성. FilesystemTenancyBootstrapper에서 사용됩니다.
* https://tenancyforlaravel.com/docs/v3/tenancy-bootstrappers/#filesystem-tenancy-boostrapper.
*/
'filesystem' => [
/**
* 'disks' 배열에 나열된 각 디스크는 tenant_id 뒤에 suffix_base가 추가됩니다.
*/
'suffix_base' => 'tenant',
'disks' => [
'local',
'public',
// 's3',
],
/**
* 로컬 디스크에 대해 이 옵션을 사용하십시오.
*
* 자세한 내용은 https://tenancyforlaravel.com/docs/v3/tenancy-bootstrappers/#filesystem-tenancy-boostrapper를 참조하십시오.
*/
'root_override' => [
// storage_path()가 접미사로 추가된 후 루트가 재정의되어야 하는 디스크.
'local' => '%storage_path%/app/',
'public' => '%storage_path%/app/public/',
],
/*
* 특정 로컬 디스크에 대해 테넌트 인식 가능한 Storage::disk()->url()을 활성화하려면 여기에서 디스크 이름을 '%tenant%'가 포함된 이름으로 매핑하십시오
* (이는 디스크의 공용 이름으로 사용됩니다). 이렇게 하면 현재 테넌트의 키가 포함된 URL로 디스크의 기본 URL을 재정의합니다.
*
* 예를 들어, 기본적으로 Storage::disk('public')->url('')은 https://your-app.test/storage로 반환됩니다.
* 'url_override'에 'public' => 'public-%tenant%'를 추가한 후,
* 반환되는 URL은 https://your-app.test/public-1/이 됩니다 (%tenant%가 현재 테넌트의 키로 치환).
*
* 테넌트의 스토리지를 공개 디렉토리로의 심볼릭 링크를 생성하려면 `php artisan tenants:link`를 사용하십시오.
*/
'url_override' => [
// tenancy.filesystem.root_override 구성에서 제외되지 않은 로컬 디스크를 추가해야 함
// todo@v4 'url_override'에 더 설명적인 이름으로 바꾸기
'public' => 'public-%tenant%',
],
/*
* 'file' 캐시 드라이버가 테넌트 인식 가능해야 하는지 여부.
*
* 이 옵션을 활성화하면 캐시 파일은 storage/{tenant}/framework/cache에 저장됩니다.
*/
'scope_cache' => true,
/*
* 'file' 세션 드라이버가 테넌트 인식 가능해야 하는지 여부.
*
* 이 옵션을 활성화하면 세션 파일은 storage/{tenant}/framework/sessions에 저장됩니다.
*/
'scope_sessions' => true,
/**
* storage_path()에 접미사를 추가해야 하는지 여부.
*
* 참고: 이 기능을 비활성화하면 로컬 디스크 테넌시가 깨질 가능성이 있습니다. S3와 같은 외부 파일 저장 서비스를 사용하는 경우에만 비활성화하십시오.
*
* 대부분의 애플리케이션에서는 이 기능을 활성화해야 합니다. 그러나 일부 극단적인 경우에는 문제가 발생할 수 있으므로
* (예: Vapor와 Passport를 사용하는 경우 - #196 참조),
* 이러한 극단적인 문제를 경험하는 경우 이 기능을 비활성화해야 할 수 있습니다.
*/
'suffix_storage_path' => true,
/**
* 이를 true로 설정하면 asset() 호출이 멀티 테넌트가 됩니다. global_asset() 및 mix()를
* 글로벌, 비 테넌트별 자산에 사용할 수 있습니다. 그러나 테넌트 앱 내에서
* asset() 호출을 사용하는 패키지를 사용할 때 문제가 발생할 수 있습니다.
* 이러한 문제가 발생하지 않도록 asset() 헬퍼 테넌시를 비활성화하고 특정
* 테넌트별 자산(예: 제품 이미지, 아바타 등)을 사용하려는 곳에서 명시적으로 tenant_asset() 호출을 사용할 수 있습니다.
*/
'asset_helper_tenancy' => false, // todo@rename asset_helper_override?
],
/**
* Redis 테넌시 구성. RedisTenancyBootstrapper에서 사용됩니다.
*
* 참고: Redis 테넌시를 사용하려면 phpredis가 필요합니다.
*
* 참고: Redis를 캐시에만 사용 중인 경우 이를 사용할 필요는 없습니다. Redis 테넌시는
* Redis 퍼사드 호출을 하거나 이를 주입된 종속성으로 사용하는 경우에만 관련이 있습니다.
*/
'redis' => [
'prefix' => 'tenant_%tenant%_', // Redis의 각 키에는 이 접두사 포맷이 앞에 추가되며, %tenant%는 테넌트 키로 대체됩니다.
'prefixed_connections' => [ // 하나의 테넌트 키를 다른 테넌트의 키와 분리하기 위해 키에 접두사를 붙이는 Redis 연결.
'default',
// 'cache', // RedisTenancyBootstrapper를 사용하여 캐시를 범위화하려면 이를 활성화하십시오.
],
],
/**
* 기능은 테넌시 초기화 여부에 상관없이 실행되는 기능입니다.
* 테넌시 부트스트래핑에 필요하지 않은 추가 기능을 제공합니다.
*
* 각 클래스에 대한 문서 페이지를 참조하여 필요한 기능을 선택하십시오.
*/
'features' => [
// Stancl\Tenancy\Features\UserImpersonation::class,
// Stancl\Tenancy\Features\TelescopeTags::class,
// Stancl\Tenancy\Features\TenantConfig::class,
// Stancl\Tenancy\Features\CrossDomainRedirect::class,
// Stancl\Tenancy\Features\ViteBundler::class,
],
/**
* 테넌시 라우트를 등록해야 하는지 여부.
*
* 테넌시 라우트에는 테넌트 자산 라우트가 포함됩니다. 기본적으로 이 라우트는 활성화되어 있습니다.
* 그러나 외부 저장소(S3, Dropbox 등)를 사용하거나 사용자 정의 자산 컨트롤러를 사용하는 경우 이를 비활성화하는 것이 유용할 수 있습니다.
*/
'routes' => true,
/**
* 기본적으로 모든 라우트를 중앙, 테넌트 또는 유니버설로 만듭니다.
*
* 기본 라우트 모드를 무시하려면 다른 라우트 모드('central', 'tenant', 'universal')의 미들웨어를 라우트에 적용하십시오.
*/
'default_route_mode' => 'central',
/**
* 보류 중인 테넌트 구성.
* 항상 사용 가능한 테넌트를 준비하는 방법을 찾고 있다면 유용할 수 있습니다.
*/
'pending' => [
/**
* 비활성화된 경우 보류 중인 테넌트는 모든 테넌트 쿼리에서 제외됩니다.
* 여전히 ::withPending(), ::withoutPending(), ::onlyPending()을 사용하여 테넌트를 포함하거나
* 제외할 수 있습니다. 참고: 비활성화된 경우, 이는
* 테넌트 명령(마이그레이션, 씨드 등)을 실행할 때도 보류 중인 테넌트를 무시합니다.
*/
'include_in_queries' => true,
/**
* 보류 중인 테넌트 풀에 준비할 보류 중인 테넌트 수를 정의합니다.
* 생성하는 테넌트의 볼륨에 따라 달라집니다.
*/
'count' => env('TENANCY_PENDING_COUNT', 5),
],
/**
* tenants:migrate 명령에 사용되는 매개변수.
*/
'migration_parameters' => [
'--force' => true, // 프로덕션에서 마이그레이션을 실행하려면 true로 설정해야 합니다.
'--path' => [
database_path('migrations'),
database_path('migrations/tenant')
],
'--schema-path' => database_path('schema/tenant-schema.dump'),
'--realpath' => true,
],
/**
* tenants:seed 명령에 사용되는 매개변수.
*/
'seeder_parameters' => [
'--class' => TenantSeeder::class,
// '--force' => true,
],
];