Cara Membuat Command Artisan Custom di Laravel

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, ka...

Cara Membuat Command Artisan Custom di Laravel

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.

artisan command laravel custom artisan command laravel console command laravel schedule artisan membuat command laravel php artisan custom
Bagikan artikel
Kembali

Komentar (0)

Punya pertanyaan atau tambahan? Tulis di bawah โ€” tak perlu login.

Membalas komentarโ€ฆ batal

Belum ada komentar. Jadilah yang pertama!

๐Ÿš€ Partner Recommendation

Butuh Source Code & Aplikasi Premium?

Download aplikasi Laravel, POS, Sekolah, Klinik, ERP, dan source code siap pakai di GudangCode.

GudangCode
  • โœ” Source Code Premium
  • โœ” Sistem Siap Pakai
  • โœ” Lifetime Update
  • โœ” Membership Lifetime
  • โœ” Update Aplikasi Harian
Daftar Membership โ†’