Todos los que usamos Laravel conocemos y amamos la línea de comandos Artisan. Comandos como php artisan make:model
o php artisan migrate
nos ahorran una cantidad increíble de tiempo. Pero, ¿sabías que puedes crear tus propios comandos para automatizar las tareas específicas de tu aplicación? ¡Hoy aprenderás cómo!
¿Por qué crear un comando personalizado?
Imagina que tienes que realizar una tarea de mantenimiento cada noche, como por ejemplo:
- Limpiar usuarios inactivos que no han iniciado sesión en el último año.
- Enviar un reporte diario de ventas por correo electrónico.
- Eliminar registros "soft-deleted" que tienen más de 30 días.
Hacer esto manualmente es tedioso y propenso a errores. Creando un comando Artisan, puedes encapsular toda esa lógica en un solo lugar y luego programarlo para que se ejecute automáticamente. Es la definición de trabajar de forma inteligente.
Paso 1: Crear el archivo del comando
Laravel hace que esto sea increíblemente fácil. Abre tu terminal y ejecuta el siguiente comando:
php artisan make:command CleanUpOldUsers
Laravel creará un nuevo archivo en app/Console/Commands/CleanUpOldUsers.php
. ¡Vamos a explorarlo!
Paso 2: Configurar la "firma" y la descripción
Dentro del archivo, verás varias propiedades. Las más importantes para empezar son $signature
y $description
.
$signature
: Es el nombre que usarás para llamar a tu comando desde la terminal.$description
: Una breve explicación de lo que hace tu comando. Aparecerá cuando ejecutesphp artisan list
.
Vamos a modificarlas para nuestro ejemplo:
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'app:cleanup-old-users {--days=365}';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Elimina usuarios que no han iniciado sesión en un número determinado de días';
¡Un detalle importante! Hemos añadido {--days=365}
a la firma. Esto crea una "opción" que nos permitirá personalizar el número de días. El valor por defecto será 365.
Paso 3: Escribir la lógica en el método `handle()`
El método handle()
es el corazón de tu comando. Aquí es donde pondrás toda la lógica que se debe ejecutar.
Nuestro objetivo es eliminar usuarios que no han iniciado sesión en los últimos 'X' días. La lógica sería así:
use App\Models\User;
use Carbon\Carbon;
public function handle()
{
// 1. Obtenemos el valor de la opción --days
$days = $this->option('days');
$this->info("Buscando usuarios inactivos por más de {$days} días...");
// 2. Calculamos la fecha límite
$limitDate = Carbon::now()->subDays($days);
// 3. Buscamos los usuarios con Eloquent
$inactiveUsers = User::where('last_login_at', '<', $limitDate);
$count = $inactiveUsers->count();
if ($count === 0) {
$this->info('No se encontraron usuarios para eliminar. ¡Todo limpio!');
return 0; // Termina el comando con éxito
}
// 4. Pedimos confirmación antes de una acción destructiva
if ($this->confirm("Se encontraron {$count} usuarios inactivos. ¿Deseas eliminarlos?")) {
// 5. Eliminamos los usuarios
$inactiveUsers->delete();
$this->info("¡Éxito! Se han eliminado {$count} usuarios.");
} else {
$this->warn('Operación cancelada por el usuario.');
}
return 0;
}
Hemos usado métodos como $this->info()
, $this->warn()
y $this->confirm()
para interactuar con el usuario en la terminal, proporcionando una experiencia mucho más rica.
Paso 4: Registrar y ejecutar el comando
¡Tu comando ya está listo! No es necesario registrarlo en versiones modernas de Laravel, ya que se auto-descubre. Simplemente ve a tu terminal y ejecútalo:
# Usando el valor por defecto (365 días)
php artisan app:cleanup-old-users
# Especificando un número de días diferente
php artisan app:cleanup-old-users --days=30
El comando te hará la pregunta de confirmación y, si aceptas, realizará la limpieza.
Bonus: Automatización con el Programador de Tareas (Scheduler)
El verdadero poder se desata cuando programas este comando. Ve al archivo app/Console/Kernel.php
y, dentro del método schedule
, añade esta línea:
protected function schedule(Schedule $schedule)
{
// Ejecuta nuestro comando todos los días a medianoche
$schedule->command('app:cleanup-old-users')->daily();
}
Configurando un Cron Job en tu servidor para que ejecute php artisan schedule:run
cada minuto, Laravel se encargará de lanzar tu comando exactamente cuando le dijiste. ¡Automatización completa!
Has aprendido a crear, configurar y ejecutar tu propio comando Artisan. Esta es una herramienta increíblemente poderosa para automatizar tareas, mantener tu aplicación limpia y, en última instancia, ahorrarte tiempo y esfuerzo. Piensa en las tareas repetitivas de tus proyectos... ¿cuál será el primer comando que crearás?