2
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
<?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();
|
||||
Reference in New Issue
Block a user