withRouting( web: __DIR__.'/../routes/web.php', api: __DIR__.'/../routes/api.php', commands: __DIR__.'/../routes/console.php', health: '/up', apiPrefix: '', ) ->withMiddleware(function (Middleware $middleware): void { $middleware->web(append: [ HandleInertiaRequests::class, AddLinkHeadersForPreloadedAssets::class, ]); $middleware->alias([ 'role' => RoleMiddleware::class, 'permission' => PermissionMiddleware::class, 'role_or_permission' => RoleOrPermissionMiddleware::class, 'sanctum.or.trusted' => SanctumOrTrustedOrigin::class, ]); // }) ->withExceptions(function (Exceptions $exceptions): void { $exceptions->render(function (NotFoundHttpException $e, Request $request) { if ($request->getHost() !== config('app.api_domain')) { return null; } if ($e->getPrevious() instanceof ModelNotFoundException) { return response()->json(['message' => 'Resource not found.'], 404); } return response()->json(['message' => 'Not found.'], 404); }); $exceptions->respond(function ($response, Throwable $e, Request $request) { $status = $response->getStatusCode(); // API domain: never touch the response, let Laravel's own JSON rendering stand. if ($request->getHost() === config('app.api_domain')) { return $response; } $errors = [ 403 => [ 'title' => "The Cockpit is Off Limits", 'message' => 'You don\'t have permission to access this page.', ], 404 => [ 'title' => 'You Flight Has Been Cancelled', 'message' => 'The page you are looking for doesn\'t exist or has been moved.', ], 419 => [ 'title' => 'Page Expired', 'message' => 'Your session has expired. Please refresh the page and try again.', ], 429 => [ 'title' => 'Too Many Requests', 'message' => 'You\'re making too many requests. Please slow down and try again.', ], 500 => [ 'title' => 'This Plane Has Made An Emergency Landing', 'message' => 'Something went wrong on our end. Please try again later.', ], 503 => [ 'title' => 'Service Unavailable', 'message' => 'We\'re down for maintenance. Please check back soon.', ], ]; $isLocal = app()->environment(['local', 'testing']); $friendlyErrorsOnLocal = [404, 403]; $shouldHandle = isset($errors[$status]) && ( !$isLocal || in_array($status, $friendlyErrorsOnLocal) ); if (!$shouldHandle) { return $response; } return Inertia::render('Error', [ 'statusCode' => $status, 'statusTitle' => $errors[$status]['title'], 'statusMessage' => $errors[$status]['message'], 'auth' => [ 'user' => $request->user(), 'roles' => $request->user()?->getRoleNames() ?? [], 'permissions' => $request->user()?->getAllPermissions()->pluck('name') ?? [], ], ]) ->toResponse($request) ->setStatusCode($status); }) ->shouldRenderJsonWhen(function ($request, Throwable $e) { if ($request->getHost() === config('app.api_domain')) { return true; } return $request->expectsJson(); }); }) ->create();