Laravel Artisan adalah command-line interface (CLI) bawaan Laravel yang sangat powerful. Selain ratusan command built-in seperti php artisan migrate atau php artisan make:model, kamu juga bisa membuat command sendiri. Custom Artisan command sangat berguna untuk mengotomasi tugas rutin seperti membersihkan data lama, mengirim laporan harian, atau sinkronisasi data dari API eksternal.
Membuat Command Baru
Gunakan Artisan untuk membuat skeleton command baru:
php artisan make:command SendDailyReport
File akan dibuat di app/Console/Commands/SendDailyReport.php. Laravel 11 secara otomatis mendiscover command di folder ini, jadi tidak perlu registrasi manual.
Anatomi Command Laravel
Buka file yang baru dibuat dan pahami strukturnya:
<?php
namespace App\Console\Commands;
use Illuminate\Console\Command;
class SendDailyReport extends Command
{
// Signature: nama command dan argumen/option-nya
protected $signature = 'report:daily
{type : Tipe laporan (sales/inventory)}
{--email= : Alamat email tujuan}
{--dry-run : Jalankan tanpa benar-benar kirim email}';
// Deskripsi yang muncul di php artisan list
protected $description = 'Kirim laporan harian ke admin via email';
// Logic utama command
public function handle(): int
{
$type = $this->argument('type');
$email = $this->option('email') ?? 'admin@example.com';
$dryRun = $this->option('dry-run');
$this->info("Menyiapkan laporan tipe: {$type}");
if (! in_array($type, ['sales', 'inventory'])) {
$this->error("Tipe laporan tidak valid. Gunakan 'sales' atau 'inventory'.");
return Command::FAILURE;
}
// Simulasi generate laporan
$this->withProgressBar(range(1, 5), function ($step) {
sleep(1); // Simulasi proses
});
$this->newLine();
if ($dryRun) {
$this->warn("Mode dry-run: email tidak dikirim ke {$email}");
} else {
$this->info("Laporan {$type} berhasil dikirim ke: {$email}");
// Di sini kamu panggil Mailable atau Notification
}
return Command::SUCCESS;
}
}
Argumen dan Option pada Signature
Format signature mengikuti aturan berikut:
{nama}โ argumen wajib.{nama?}โ argumen opsional.{nama=default}โ argumen dengan nilai default.{--option}โ flag boolean (ada/tidak ada).{--option=}โ option dengan nilai string.{--option=default}โ option dengan nilai default.
Menjalankan Command
# Argumen wajib
php artisan report:daily sales
# Dengan option
php artisan report:daily inventory --email=budi@example.com
# Dengan flag dry-run
php artisan report:daily sales --dry-run
Interaksi dengan User
Command Laravel menyediakan berbagai method untuk berinteraksi dengan user di terminal:
public function handle(): int
{
// Tanya konfirmasi
if (! $this->confirm('Yakin ingin menghapus data lama?')) {
$this->line('Operasi dibatalkan.');
return Command::SUCCESS;
}
// Tanya input dari user
$name = $this->ask('Masukkan nama laporan:');
// Pilihan dari daftar
$format = $this->choice('Format output:', ['PDF', 'Excel', 'CSV'], 0);
// Tanya password (tersembunyi)
$secret = $this->secret('Masukkan API key:');
// Output berwarna
$this->info('Info (hijau)');
$this->warn('Peringatan (kuning)');
$this->error('Error (merah)');
// Tampilkan tabel
$this->table(
['ID', 'Nama', 'Email'],
User::select('id', 'name', 'email')->limit(5)->get()->toArray()
);
return Command::SUCCESS;
}
Contoh Nyata: Command Hapus Data Lama
<?php
namespace App\Console\Commands;
use App\Models\Log;
use Illuminate\Console\Command;
class PruneOldLogs extends Command
{
protected $signature = 'logs:prune {--days=30 : Hapus log lebih tua dari N hari}';
protected $description = 'Hapus log lama dari database';
public function handle(): int
{
$days = (int) $this->option('days');
$cutoff = now()->subDays($days);
$count = Log::where('created_at', '<', $cutoff)->count();
if ($count === 0) {
$this->info('Tidak ada log lama yang perlu dihapus.');
return Command::SUCCESS;
}
if ($this->confirm("Akan menghapus {$count} log sebelum {$cutoff->toDateString()}. Lanjutkan?")) {
Log::where('created_at', '<', $cutoff)->delete();
$this->info("{$count} log berhasil dihapus.");
}
return Command::SUCCESS;
}
}
Menjadwalkan Command dengan Scheduler
Agar command berjalan otomatis secara terjadwal, daftarkan di routes/console.php (Laravel 11) atau app/Console/Kernel.php (Laravel 10):
// Laravel 11 โ routes/console.php
use Illuminate\Support\Facades\Schedule;
Schedule::command('report:daily sales --email=admin@site.com')->dailyAt('07:00');
Schedule::command('logs:prune --days=30')->weekly();
// Tambahkan cron entry di server:
// * * * * * cd /path-to-project && php artisan schedule:run >> /dev/null 2>&1
Kesimpulan
Membuat Artisan command custom di Laravel adalah cara terbaik untuk mengotomasi tugas-tugas rutin yang tidak perlu dilakukan manual. Dengan argumen, option, interaksi terminal yang kaya, dan integrasi scheduler, command Laravel bisa menjadi tulang punggung proses background aplikasimu. Mulai dari command sederhana seperti membersihkan cache hingga yang kompleks seperti generate laporan PDF โ semuanya bisa dilakukan dengan elegan menggunakan Artisan.