phpvms/bootstrap/app.php
Arthur Parienté 7de823a0a7
[8.x] refactor: migrate to the new modern laravel structure (#2207)
* refactor: migrate to the new modern laravel structure

* fix .env.test
2026-05-07 14:58:11 -05:00

114 lines
4.3 KiB
PHP
Executable File

<?php
use App\Exceptions\AbstractHttpException;
use App\Exceptions\AssetNotFound;
use App\Exceptions\Converters\GenericExceptionAbstract;
use App\Exceptions\Converters\SymfonyException;
use App\Exceptions\Converters\ValidationException;
use App\Exceptions\Unauthenticated;
use App\Http\Middleware\ApiAuth;
use App\Http\Middleware\InstalledCheck;
use App\Http\Middleware\SetActiveLanguage;
use App\Http\Middleware\SetActiveTheme;
use App\Http\Middleware\UpdatePending;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Foundation\Application;
use Illuminate\Foundation\Configuration\Exceptions;
use Illuminate\Foundation\Configuration\Middleware;
use Illuminate\Http\Request;
use Illuminate\Session\TokenMismatchException;
use Illuminate\Validation\ValidationException as IlluminateValidationException;
use Spatie\Permission\Middleware\PermissionMiddleware;
use Spatie\Permission\Middleware\RoleMiddleware;
use Spatie\Permission\Middleware\RoleOrPermissionMiddleware;
use Symfony\Component\HttpKernel\Exception\HttpException as SymfonyHttpException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
return Application::configure(basePath: dirname(__DIR__))
->withRouting(
web: __DIR__.'/../routes/web.php',
api: __DIR__.'/../routes/api.php',
commands: __DIR__.'/../routes/console.php',
health: '/up',
)
->withMiddleware(function (Middleware $middleware): void {
$middleware->appendToGroup('web', [
InstalledCheck::class,
SetActiveTheme::class,
SetActiveLanguage::class,
]);
$middleware->alias([
'api.auth' => ApiAuth::class,
'update_pending' => UpdatePending::class,
'role' => RoleMiddleware::class,
'permission' => PermissionMiddleware::class,
'role_or_permission' => RoleOrPermissionMiddleware::class,
]);
})
->withExceptions(function (Exceptions $exceptions): void {
$exceptions->dontReport([
AbstractHttpException::class,
IlluminateValidationException::class,
ModelNotFoundException::class,
SymfonyHttpException::class,
TokenMismatchException::class,
]);
// Custom Rendering Logic
$exceptions->render(function (Throwable $exception, Request $request) {
// Handle API Errors
if ($request->is('api/*')) {
Log::error('API Error: '.$exception->getMessage(), $exception->getTrace());
if ($exception instanceof AbstractHttpException) {
return $exception->getResponse();
}
if ($exception instanceof ModelNotFoundException || $exception instanceof NotFoundHttpException) {
return (new AssetNotFound($exception))->getResponse();
}
if ($exception instanceof SymfonyHttpException) {
return (new SymfonyException($exception))->getResponse();
}
if ($exception instanceof IlluminateValidationException) {
return (new ValidationException($exception))->getResponse();
}
return (new GenericExceptionAbstract($exception))->getResponse();
}
// Handle Web Errors (Theme & Auth)
(new SetActiveTheme())->setTheme($request);
if ($exception instanceof AbstractHttpException && $exception->getStatusCode() === 403) {
return redirect()->guest('login');
}
// Return null to let the default Laravel handler take over for other cases
return null;
});
// 3. Custom Unauthenticated Logic
$exceptions->respond(function ($response, Throwable $exception, Request $request) {
if (!$exception instanceof AuthenticationException) {
return $response;
}
if ($request->expectsJson() || $request->is('api/*')) {
return (new Unauthenticated())->getResponse();
}
return $response;
});
})
->withEvents([
__DIR__.'/../app/Cron',
__DIR__.'/../app/Listeners',
])
->create();