Manejo de excepciones HTTP con abort en Laravel

Clase 20 de 33Curso Avanzado de Laravel

Resumen

Aprende a manejar excepciones HTTP en Laravel con el helper abort, personalizar mensajes tanto en vistas como en API, e impulsar tu debugging con Laravel Telescope. Además, configura tus tablas para que usuarios administradores aprueben calificaciones con un flujo claro y mantenible.

¿Cómo manejar excepciones HTTP en Laravel con abort?

Dominar las respuestas de error mejora la experiencia y acelera el soporte. Con abort, puedes disparar errores HTTP desde cualquier lugar y ver pistas personalizables.

¿Qué códigos de error se mencionan?

  • 404: página no encontrada.
  • 401: no autorizado.
  • 500: error del servidor (provocado por el desarrollador).

¿Cómo generar respuestas de error con el helper abort?

  • Declara una ruta GET, por ejemplo, server_error.
  • Usa abort(código) para devolver el estado HTTP deseado.
  • Pasa un segundo parámetro para un mensaje personalizado.
// routes/web.php
use Illuminate\Support\Facades\Route;

Route::get('server_error', function () {
    abort(500);
});

// En API puedes incluir mensaje personalizado
// routes/api.php
Route::get('server_error', function () {
    abort(500, 'Mensaje de error');
});

¿Cómo personalizar las vistas de errores en Blade?

  • Publica las vistas de errores con el comando de Artisan y el tag de los errores de Laravel.
  • Se crearán archivos en resources/views/errors identificados por código HTTP, como 500.blade.php.
  • Edita el contenido (por ejemplo, el mensaje) y verás el cambio en el navegador.
php artisan vendor publish  # con el tag de los errores de Laravel

¿Cómo personalizar la respuesta de errores en API con JSON?

En escenarios API, es clave responder en JSON. Desde tu handler, verifica si la petición espera JSON y devuelve una estructura clara con la clave error y el mensaje de la excepción. Además, si usas abort(código, 'mensaje'), podrás controlar el texto enviado al cliente.

¿Cómo detectar si la petición espera JSON?

  • Comprueba si la petición espera JSON.
  • Retorna una respuesta en JSON con la clave error y el mensaje de la excepción.
// App/Exceptions/Handler.php (ejemplo de lógica)
public function render($request, Throwable $exception)
{
    if ($request->expectsJson()) {
        return response()->json([
            'error' => $exception->getMessage(),
        ], 500);
    }

    return parent::render($request, $exception);
}

¿Cómo potenciar el debugging con Laravel Telescope y agregar aprobación de ratings?

Observa peticiones, excepciones y queries con una interfaz clara usando Laravel Telescope. Luego, suma lógica de negocio: marca usuarios como administradores y exige que las calificaciones sean aprobadas con un campo approved_at.

¿Cómo instalar Laravel Telescope paso a paso?

  • Instala el paquete con Composer. Puedes indicar versión si lo deseas.
  • Ejecuta el comando de instalación de Telescope.
  • Corre la migración generada.
  • Accede a la interfaz en /telescope.
composer require Laravel Telescope
Telescope install
php artisan migrate

Lo que podrás ver en la interfaz: - Peticiones y su trazabilidad. - Excepciones y logs. - Queries ejecutadas. - Eventos útiles para debugging.

¿Cómo preparar las migraciones y el state admin?

  • Agrega a ratings un campo approved_at de tipo datetime.
  • Agrega a users un booleano is_admin con valor por defecto en falso.
  • Marca el primer usuario como administrador y persiste.
  • Crea un state en el UserFactory llamado admin para generar usuarios con is_admin en true.
// database/migrations/XXXX_add_approved_at_to_ratings.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration {
    public function up(): void
    {
        Schema::table('ratings', function (Blueprint $table) {
            $table->dateTime('approved_at');
        });
    }

    public function down(): void
    {
        Schema::table('ratings', function (Blueprint $table) {
            $table->dropColumn('approved_at');
        });
    }
};
// database/migrations/XXXX_add_is_admin_to_users.php
return new class extends Migration {
    public function up(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->boolean('is_admin')->default(false);
        });
    }

    public function down(): void
    {
        Schema::table('users', function (Blueprint $table) {
            $table->dropColumn('is_admin');
        });
    }
};
// Marcar al primer usuario como admin (ejemplo en un seeder o tinker)
use App\Models\User;

$user = User::first();
if ($user) {
    $user->is_admin = 1;
    $user->save();
}
// database/factories/UserFactory.php
use Illuminate\Database\Eloquent\Factories\Factory;

class UserFactory extends Factory
{
    public function admin(): self
    {
        return $this->state(fn () => [
            'is_admin' => true,
        ]);
    }
}

¿Te gustaría ver un ejemplo de aprobación de calificaciones con un flujo completo de controlador y políticas? Cuéntame en comentarios qué partes quieres profundizar.