Configuración de logs y channels en Laravel

Clase 21 de 33Curso Avanzado de Laravel

Contenido del curso

Laravel y Base de Datos

    Resumen

    Aprende a configurar logging por canales en Laravel, registrar eventos con el helper logger, y controlar la aprobación de calificaciones con Gates y Resources. Aquí verás cómo ajustar .env, proteger rutas y filtrar listados por estado aprobado, con ejemplos claros y listos para aplicar.

    ¿Cómo configurar el logging por canales en Laravel?

    Laravel organiza los logs por canales asociados a un driver. En config/logging.php, la variable de entorno LOG_CHANNEL define el canal por defecto: usualmente stack con driver stack, que centraliza todo en un único archivo dentro de storage/logs.

    • Cambia a daily para un archivo de log por día.
    • Ubicación de archivos: storage/logs.
    • Configuración de entorno: .env con LOG_CHANNEL.

    Ejemplo para activar el driver diario:

    # .env LOG_CHANNEL=daily

    Para escribir mensajes, usa el helper logger() desde consola con php artisan tinker y los métodos de nivel: error, info, warning.

    php artisan tinker >>> logger()->error('Soy un error'); >>> logger()->info('Soy un mensaje');

    Claves que debes retener:

    • Canales y drivers: cada canal usa un driver específico.
    • stack vs daily: un archivo único vs un archivo por día.
    • Niveles de log: error, info, warning, etc.

    ¿Cómo proteger la aprobación con gates y controladores?

    La aprobación de calificaciones queda restringida a usuarios administradores mediante un Gate. En AuthServiceProvider, define la política admin que recibe el usuario y valida que is_admin sea true.

    // AuthServiceProvider Gate::define('admin', function ($user) { return $user->is_admin === true; });

    En el controlador que aprueba, autoriza con Gate::authorize antes de ejecutar la lógica. El método establece la fecha de aprobación con Carbon::now() y persiste.

    // RatingController public function approve(Rating $rating) { Gate::authorize('admin', $rating); $rating->approved_at = Carbon::now(); $rating->save(); return response()->json([], 200); }

    Declara una ruta POST protegida por autenticación para rating/{id}/approve que apunte a approve.

    // routes/api.php Route::post('rating/{id}/approve', [RatingController::class, 'approve']); // protegida por autenticación

    Puntos críticos:

    • Gate admin: autoriza solo si is_admin está en true.
    • Controlador approve: asigna approved_at con Carbon::now() y devuelve 200.
    • Ruta protegida: requiere usuario autenticado con token válido antes de aprobar.

    ¿Qué hacer si recibes 403 al aprobar?

    • Verifica que el usuario logueado tenga is_admin en true en la base de datos.
    • Asegura que inicias sesión con el correo correcto y usas el token emitido para ese usuario.

    ¿Cómo listar y filtrar ratings aprobados con resources?

    Agrega en tu configuración un campo que permita requerir aprobación:

    // config/*.php 'require_approval' => true,

    Crea un método list en el controlador (por ejemplo, ProductRatingController) que solo sea visible para administradores. Construye la consulta con un builder del modelo Rating y devuelve una colección con un resource.

    // ProductRatingController public function list(Request $request) { Gate::authorize('admin'); $builder = Rating::query(); if ($request->approved) { $builder->whereNotNull('approved_at'); } if ($request->not_approved) { $builder->whereNull('approved_at'); } return RatingResource::collection($builder->get()); }

    Define la ruta GET para el listado y pasa filtros como parámetros de consulta: ?approved=true o ?not_approved=true.

    // routes/api.php Route::get('rating', [ProductRatingController::class, 'list']);

    El resource controla el formato de salida y expone solo los campos necesarios.

    // app/Http/Resources/RatingResource.php class RatingResource extends JsonResource { public function toArray($request) { return [ 'id' => $this->id, 'rate' => $this->score, 'comments' => $this->comments, 'ratable' => $this->ratable, 'qualifier' => $this->qualifier, 'created_at' => $this->created_at, 'approved_at' => $this->approved_at, ]; } }

    Buenas prácticas destacadas:

    • GET con filtros por query: usa ?approved=true o ?not_approved=true.
    • Resources para colecciones: RatingResource::collection($builder->get()).
    • Separación de responsabilidades: Gate para autorización, controlador para lógica y resource para respuesta.

    ¿Qué habilidades y conceptos clave refuerzas?

    • Configuración de canales de logging y uso de driver daily.
    • Uso del helper logger() con niveles: error, info, warning.
    • Definición de Gates en AuthServiceProvider y autorización con Gate::authorize.
    • Implementación de ruta protegida para aprobar rating/{id}/approve.
    • Actualización de estados con approved_at usando Carbon.
    • Listado con query builder, filtros condicionales y Resources para respuestas limpias.
    • Manejo de errores con la clase Handler y creación de excepciones con mensajes propios.

    ¿Te gustaría ver ejemplos adicionales de filtros o transformar más campos en el Resource? Comparte tus dudas y casos de uso en los comentarios.

        Configuración de logs y channels en Laravel