- 기초관리: 목록(13컬럼) + 폼(기본정보 + 케이스전용 + 절곡테이블 + 이미지) - 절곡품: 가이드레일/케이스/하단마감재 타입별 목록 + 폼 - 부품 추가(기초관리 검색 모달) + 삭제 + 수량/품명/재질 편집 - 절곡테이블 inline 편집 + 재질별 폭합 자동계산 - 작업지시서 레거시 포맷 인쇄 모달 - 원본수정 버튼 sam_item_id 직접 링크 - DB 메뉴 등록 (기초관리 + 절곡품 + 케이스 + 하단마감재)
142 lines
4.3 KiB
PHP
142 lines
4.3 KiB
PHP
<?php
|
|
|
|
namespace App\Helpers;
|
|
|
|
/**
|
|
* 테넌트 컨텍스트 헬퍼
|
|
*
|
|
* 테넌트 콘솔(새창)에서는 URL의 tenantId를,
|
|
* 메인 관리자 페이지에서는 세션의 selected_tenant_id를 사용
|
|
*/
|
|
class TenantHelper
|
|
{
|
|
/**
|
|
* 메인 라우트명 → 테넌트 콘솔 라우트명 매핑 (미사용, catch-all 방식 전환)
|
|
* @deprecated catch-all 방식으로 URL 직접 생성
|
|
*/
|
|
private static array $routeMap = [];
|
|
|
|
/**
|
|
* 현재 유효한 테넌트 ID 반환
|
|
*
|
|
* 우선순위:
|
|
* 1. request attributes (tenant_console_id) - 테넌트 콘솔 새창
|
|
* 2. Referer 헤더의 tenant-console URL - API 호출 시
|
|
* 3. session (selected_tenant_id) - 메인 관리자 페이지
|
|
*/
|
|
public static function getEffectiveTenantId(?int $default = null): ?int
|
|
{
|
|
// 테넌트 콘솔 컨텍스트 우선
|
|
$consoleTenantId = request()->attributes->get('tenant_console_id');
|
|
if ($consoleTenantId) {
|
|
return (int) $consoleTenantId;
|
|
}
|
|
|
|
// API 호출 시 Referer 헤더에서 tenant-console 컨텍스트 감지
|
|
$refererTenantId = self::getTenantIdFromReferer();
|
|
if ($refererTenantId) {
|
|
return $refererTenantId;
|
|
}
|
|
|
|
// 메인 관리자 페이지: 세션 기반
|
|
$sessionTenantId = session('selected_tenant_id');
|
|
if ($sessionTenantId && $sessionTenantId !== 'all') {
|
|
return (int) $sessionTenantId;
|
|
}
|
|
|
|
return $default;
|
|
}
|
|
|
|
/**
|
|
* 세션의 raw 값 반환 (all 포함)
|
|
* 메인 관리자에서 "전체" 선택 여부 판단 시 사용
|
|
*/
|
|
public static function getRawTenantId(): mixed
|
|
{
|
|
$consoleTenantId = request()->attributes->get('tenant_console_id');
|
|
if ($consoleTenantId) {
|
|
return (int) $consoleTenantId;
|
|
}
|
|
|
|
// API 호출 시 Referer에서 감지
|
|
$refererTenantId = self::getTenantIdFromReferer();
|
|
if ($refererTenantId) {
|
|
return $refererTenantId;
|
|
}
|
|
|
|
return session('selected_tenant_id');
|
|
}
|
|
|
|
/**
|
|
* 테넌트 콘솔(새창) 컨텍스트인지 확인
|
|
*
|
|
* API 호출 시에는 Referer 헤더로 tenant-console 컨텍스트를 감지
|
|
*/
|
|
public static function isTenantConsole(): bool
|
|
{
|
|
if (request()->attributes->get('tenant_console_id')) {
|
|
return true;
|
|
}
|
|
|
|
// API 호출 시 Referer 헤더에서 tenant-console 컨텍스트 감지
|
|
return (bool) self::getTenantIdFromReferer();
|
|
}
|
|
|
|
/**
|
|
* Referer 헤더에서 tenant-console의 tenantId 추출
|
|
*/
|
|
private static function getTenantIdFromReferer(): ?int
|
|
{
|
|
$referer = request()->header('Referer', '');
|
|
if (preg_match('#/tenant-console/(\d+)#', $referer, $matches)) {
|
|
return (int) $matches[1];
|
|
}
|
|
|
|
return null;
|
|
}
|
|
|
|
/**
|
|
* 컨텍스트 인식 라우트 URL 생성
|
|
*
|
|
* 테넌트 콘솔이면 메인 라우트 URL에 /tenant-console/{tenantId} 프리픽스 추가,
|
|
* 메인이면 기존 라우트 URL 그대로 반환
|
|
*
|
|
* @param string $name 메인 라우트명 (예: 'common-codes.index')
|
|
* @param array $parameters 추가 파라미터
|
|
*/
|
|
public static function route(string $name, mixed $parameters = []): string
|
|
{
|
|
// 메인 라우트 URL 생성
|
|
$mainUrl = route($name, $parameters);
|
|
|
|
if (! self::isTenantConsole()) {
|
|
return $mainUrl;
|
|
}
|
|
|
|
// 테넌트 콘솔: 메인 URL의 path에 프리픽스 추가
|
|
$tenantId = self::getEffectiveTenantId();
|
|
$parsed = parse_url($mainUrl);
|
|
$path = $parsed['path'] ?? '/';
|
|
$query = isset($parsed['query']) ? '?' . $parsed['query'] : '';
|
|
|
|
$consoleUrl = '/tenant-console/' . $tenantId . $path . $query;
|
|
|
|
// 절대 URL이면 호스트 포함
|
|
if (isset($parsed['scheme'])) {
|
|
return $parsed['scheme'] . '://' . $parsed['host']
|
|
. (isset($parsed['port']) ? ':' . $parsed['port'] : '')
|
|
. $consoleUrl;
|
|
}
|
|
|
|
return $consoleUrl;
|
|
}
|
|
|
|
/**
|
|
* 컨텍스트 인식 리다이렉트
|
|
*/
|
|
public static function redirect(string $name, array $parameters = []): \Illuminate\Http\RedirectResponse
|
|
{
|
|
return redirect(self::route($name, $parameters));
|
|
}
|
|
}
|