Files
sam-manage/app/Helpers/TenantHelper.php
강영보 d03c7ed870 feat: [bending] 절곡품 관리 MNG 화면
- 기초관리: 목록(13컬럼) + 폼(기본정보 + 케이스전용 + 절곡테이블 + 이미지)
- 절곡품: 가이드레일/케이스/하단마감재 타입별 목록 + 폼
- 부품 추가(기초관리 검색 모달) + 삭제 + 수량/품명/재질 편집
- 절곡테이블 inline 편집 + 재질별 폭합 자동계산
- 작업지시서 레거시 포맷 인쇄 모달
- 원본수정 버튼 sam_item_id 직접 링크
- DB 메뉴 등록 (기초관리 + 절곡품 + 케이스 + 하단마감재)
2026-03-19 21:08:57 +09:00

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));
}
}