73 lines
3.3 KiB
PHP
73 lines
3.3 KiB
PHP
<?php
|
|
|
|
use Illuminate\Foundation\Application;
|
|
use Illuminate\Foundation\Configuration\Exceptions;
|
|
use Illuminate\Foundation\Configuration\Middleware;
|
|
|
|
return Application::configure(basePath: dirname(__DIR__))
|
|
->withRouting(
|
|
web: __DIR__.'/../routes/web.php',
|
|
commands: __DIR__.'/../routes/console.php',
|
|
health: '/up',
|
|
)
|
|
->withMiddleware(function (Middleware $middleware): void {
|
|
$middleware->web(append: [
|
|
\App\Http\Middleware\SecurityHeaders::class,
|
|
]);
|
|
})
|
|
->withExceptions(function (Exceptions $exceptions): void {
|
|
// Renderer amigable para errores en /admin/*: convierte excepciones técnicas
|
|
// (especialmente SQL) en una redirección back() con un mensaje claro que el
|
|
// layout admin muestra como SweetAlert modal. Detalle técnico va al log.
|
|
$exceptions->render(function (\Throwable $e, $request) {
|
|
if (config('app.debug')) {
|
|
return null; // En local/debug mantenemos la pantalla detallada de Laravel.
|
|
}
|
|
if (!$request->is('admin/*')) {
|
|
return null;
|
|
}
|
|
if ($request->expectsJson() || $request->ajax()) {
|
|
return null;
|
|
}
|
|
|
|
// Excepciones que Laravel ya maneja bien (validación, auth, 404, etc.).
|
|
$passthrough = [
|
|
\Illuminate\Validation\ValidationException::class,
|
|
\Illuminate\Auth\AuthenticationException::class,
|
|
\Illuminate\Auth\Access\AuthorizationException::class,
|
|
\Illuminate\Session\TokenMismatchException::class,
|
|
\Symfony\Component\HttpKernel\Exception\HttpException::class,
|
|
\Symfony\Component\HttpKernel\Exception\NotFoundHttpException::class,
|
|
\Illuminate\Database\Eloquent\ModelNotFoundException::class,
|
|
];
|
|
foreach ($passthrough as $cls) {
|
|
if ($e instanceof $cls) return null;
|
|
}
|
|
|
|
if ($e instanceof \Illuminate\Database\QueryException) {
|
|
$code = (int) ($e->errorInfo[1] ?? 0);
|
|
$msg = match (true) {
|
|
$code === 1062 => 'Ya existe un registro con esos datos. Verificá si no fue cargado previamente o si se encuentra en la papelera.',
|
|
in_array($code, [1451, 1452], true) => 'Esta operación no se puede completar porque existen datos relacionados (jugadores, equipos o eventos vinculados).',
|
|
default => 'Hubo un problema con la base de datos. Intentá nuevamente o contactá al administrador.',
|
|
};
|
|
\Log::error('[admin] QueryException', [
|
|
'code' => $code,
|
|
'message' => $e->getMessage(),
|
|
'url' => $request->fullUrl(),
|
|
]);
|
|
return back()->withInput()->with('admin_error_modal', $msg);
|
|
}
|
|
|
|
\Log::error('[admin] Excepción no manejada', [
|
|
'exception' => $e->getMessage(),
|
|
'class' => get_class($e),
|
|
'url' => $request->fullUrl(),
|
|
]);
|
|
return back()->withInput()->with(
|
|
'admin_error_modal',
|
|
'Ocurrió un error inesperado al procesar la solicitud. Intentá nuevamente o contactá al administrador.'
|
|
);
|
|
});
|
|
})->create();
|