Files
sam-manage/app/Http/Controllers/TenantConsoleController.php

63 lines
2.0 KiB
PHP
Raw Normal View History

<?php
namespace App\Http\Controllers;
use App\Models\Tenants\Tenant;
use Illuminate\Http\Request;
use Illuminate\Routing\Router;
use Illuminate\View\View;
class TenantConsoleController extends Controller
{
/**
* 테넌트 콘솔 대시보드 (새창 진입점)
*/
public function index(Request $request, int $tenantId): View
{
$tenant = $request->attributes->get('tenant_console');
return view('tenant-console.index', [
'tenant' => $tenant,
'tenantId' => $tenantId,
]);
}
/**
* Catch-all: 메인 라우트의 컨트롤러를 찾아서 실행
* /tenant-console/{tenantId}/{path} /{path} 매칭되는 메인 라우트 컨트롤러 호출
*/
public function dispatch(Request $request, int $tenantId, string $path)
{
$url = '/' . ltrim($path, '/');
$method = $request->method();
// 메인 라우트에서 매칭되는 라우트 찾기
$fakeRequest = Request::create($url, $method, $request->all());
$fakeRequest->headers->replace($request->headers->all());
try {
$route = app(Router::class)->getRoutes()->match($fakeRequest);
} catch (\Symfony\Component\HttpKernel\Exception\NotFoundHttpException $e) {
abort(404, "라우트를 찾을 수 없습니다: {$url}");
} catch (\Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException $e) {
abort(405, "허용되지 않는 메서드: {$method} {$url}");
}
$action = $route->getAction();
if (! isset($action['uses']) || ! is_string($action['uses'])) {
abort(404);
}
// 라우트 파라미터 바인딩
$route->bind($fakeRequest);
$params = $route->parameters();
// 컨트롤러 실행
[$controllerClass, $controllerMethod] = explode('@', $action['uses']);
$controller = app($controllerClass);
return app()->call([$controller, $controllerMethod], $params);
}
}