BAB 15: Artisan Commands

Menggunakan CLI Artisan untuk generate file, menjalankan migrasi, dan berbagai tugas pengembangan lainnya.

Sepanjang bab-bab sebelumnya, kita sudah berkali-kali mengetik perintah seperti php artisan make:policy, php artisan make:controller, dan php artisan migrate tanpa benar-benar berhenti untuk memahami apa yang sebenarnya terjadi di balik layar. Artisan yang selama ini kita pakai secara kasual ternyata jauh lebih dalam dari sekadar generator file.

Artisan adalah command-line interface bawaan Laravel — sebuah alat yang dirancang untuk membuat pekerjaan pengembangan lebih cepat, konsisten, dan bebas dari repetisi manual. Di bab ini kita akan menjelajahi kemampuannya secara lebih serius, termasuk cara membuat command kita sendiri.

Anatomi Artisan

Artisan adalah sebuah file PHP yang tinggal di root proyek Laravel dengan nama artisan. Ketika menjalankan php artisan [perintah], PHP mengeksekusi file itu, yang kemudian memuat seluruh framework dan meneruskan perintah ke kelas yang bertanggung jawab.

Untuk melihat semua perintah yang tersedia:

php artisan list

Untuk mendapatkan bantuan tentang perintah tertentu:

php artisan help make:model

Output help menampilkan signature lengkap perintah, termasuk semua argumen dan opsi yang tersedia beserta penjelasannya.

Perintah yang Paling Sering Dipakai

Kelompok perintah make:* adalah yang paling sering digunakan saat pengembangan. Setiap perintah membuat file baru di lokasi yang tepat dengan boilerplate yang sudah benar.

Berikut perintah-perintah yang akan sering kamu temui:

PerintahHasil
php artisan make:model NamaModelModel Eloquent di app/Models/
php artisan make:controller NamaControllerController di app/Http/Controllers/
php artisan make:middleware NamaMiddlewareMiddleware di app/Http/Middleware/
php artisan make:request NamaRequestForm Request di app/Http/Requests/
php artisan make:policy NamaPolicyPolicy di app/Policies/
php artisan make:migration nama_migrasiFile migrasi di database/migrations/
php artisan make:seeder NamaSeederSeeder di database/seeders/
php artisan make:command NamaCommandCustom command di app/Console/Commands/

Banyak dari perintah make:* mendukung flag tambahan untuk menghasilkan file sekaligus. Contohnya, make:model bisa membuat model beserta migrasi, controller, seeder, dan factory dalam satu langkah:

php artisan make:model Artikel --migration --controller --seeder

Atau dengan shorthand flag:

php artisan make:model Artikel -mcs

Perintah Database

Selain generator, Artisan menyediakan perintah-perintah untuk mengelola database:

# Menjalankan semua migrasi yang belum dijalankan
php artisan migrate

# Rollback migrasi terakhir
php artisan migrate:rollback

# Rollback semua migrasi, lalu jalankan ulang dari awal
php artisan migrate:fresh

# Sama seperti fresh, tapi juga menjalankan semua seeder
php artisan migrate:fresh --seed

# Melihat status semua migrasi
php artisan migrate:status

# Menjalankan seeder
php artisan db:seed

# Menjalankan seeder tertentu
php artisan db:seed --class=CatatanSeeder

migrate:fresh akan menghapus semua tabel yang ada dan membuat ulang dari nol. Jangan jalankan di environment production yang berisi data nyata.

Tinker — REPL untuk Laravel

php artisan tinker membuka sesi REPL (Read-Eval-Print Loop) interaktif yang langsung terhubung ke aplikasi Laravel. Di sini kamu bisa bereksperimen dengan model, menguji query, atau mengeksekusi kode PHP apa pun sambil memanfaatkan seluruh konteks aplikasi.

php artisan tinker

Setelah masuk, coba beberapa hal ini:

// Membuat catatan baru langsung dari CLI
App\Models\Catatan::create([
    'judul' => 'Catatan dari Tinker',
    'isi' => 'Ini dibuat langsung dari command line.',
    'user_id' => 1,
]);

// Menghitung jumlah catatan
App\Models\Catatan::count();

// Mencari catatan berdasarkan kondisi
App\Models\Catatan::where('prioritas', 'tinggi')->get();

// Melihat data user pertama
App\Models\User::first();

Tinker sangat berguna untuk debugging cepat tanpa harus membuat halaman atau route baru hanya untuk menguji sepotong logika.

Membuat Custom Command

Inilah bagian yang membuat Artisan benar-benar powerful. Kita bisa membuat perintah sendiri untuk mengotomasi tugas-tugas yang spesifik di aplikasi kita.

Bayangkan kita ingin membuat perintah untuk membersihkan catatan-catatan lama yang sudah lebih dari 30 hari tidak diperbarui. Mulai dengan membuat file command:

php artisan make:command BersihkanCatatanLama

Laravel membuat file di app/Console/Commands/BersihkanCatatanLama.php. Mari kita isi:

<?php
// app/Console/Commands/BersihkanCatatanLama.php

namespace App\Console\Commands;

use App\Models\Catatan;
use Carbon\Carbon;
use Illuminate\Console\Command;

class BersihkanCatatanLama extends Command
{
    protected $signature = 'catatan:bersihkan {--hari=30 : Catatan yang tidak diperbarui selama berapa hari}';

    protected $description = 'Menghapus catatan yang tidak diperbarui melebihi batas hari yang ditentukan';

    public function handle(): int
    {
        $hari = (int) $this->option('hari');
        $batasWaktu = Carbon::now()->subDays($hari);

        $jumlah = Catatan::where('updated_at', '<', $batasWaktu)->count();

        if ($jumlah === 0) {
            $this->info("Tidak ada catatan yang lebih lama dari {$hari} hari.");
            return Command::SUCCESS;
        }

        if (! $this->confirm("Ditemukan {$jumlah} catatan. Hapus semuanya?")) {
            $this->warn('Operasi dibatalkan.');
            return Command::SUCCESS;
        }

        Catatan::where('updated_at', '<', $batasWaktu)->delete();

        $this->info("{$jumlah} catatan berhasil dihapus.");
        return Command::SUCCESS;
    }
}

Jalankan dengan:

php artisan catatan:bersihkan

Atau dengan opsi kustom:

php artisan catatan:bersihkan --hari=60

Memahami Signature

$signature adalah deklarasi antarmuka command kita. Format dasarnya adalah nama:perintah {argumen} {--opsi}.

Beberapa variasi yang bisa digunakan:

// Argumen wajib
protected $signature = 'catatan:ekspor {format}';

// Argumen opsional dengan nilai default
protected $signature = 'catatan:ekspor {format=csv}';

// Opsi boolean (flag)
protected $signature = 'catatan:ekspor {--tanpa-header}';

// Opsi dengan nilai
protected $signature = 'catatan:ekspor {--separator=,}';

Nilai argumen dan opsi diambil di handle() menggunakan $this->argument() dan $this->option():

public function handle(): int
{
    $format = $this->argument('format');
    $separator = $this->option('separator');
    $tanpaHeader = $this->option('tanpa-header');

    // ...
}

Output yang Informatif

Method output Artisan membuat feedback dari command terasa profesional:

$this->info('Operasi berhasil.');    // Teks hijau
$this->error('Terjadi kesalahan.');  // Teks merah
$this->warn('Perhatian: ...');       // Teks kuning
$this->line('Teks biasa.');

// Menampilkan data dalam format tabel
$this->table(
    ['ID', 'Judul', 'Prioritas'],
    Catatan::select('id', 'judul', 'prioritas')->get()->toArray()
);

// Progress bar untuk operasi batch
$catatan = Catatan::all();
$this->withProgressBar($catatan, function (Catatan $item) {
    // proses setiap item
    sleep(0);
});

Menjalankan Command dari Kode

Terkadang kita perlu memicu Artisan command dari dalam aplikasi — misalnya dari controller atau setelah event tertentu terjadi. Laravel menyediakan facade Artisan untuk keperluan ini:

<?php
// app/Http/Controllers/AdminController.php

use Illuminate\Support\Facades\Artisan;

class AdminController extends Controller
{
    public function bersihkanData(): RedirectResponse
    {
        $this->authorize('akses-admin');

        Artisan::call('catatan:bersihkan', [
            '--hari' => 90,
        ]);

        $output = Artisan::output();

        return redirect()->back()->with('sukses', 'Pembersihan selesai: ' . trim($output));
    }
}

Artisan::call() mengembalikan exit code (0 berarti sukses), dan Artisan::output() mengambil teks output dari command yang terakhir dijalankan.

Perintah Berguna Lainnya

Beberapa perintah yang sering berguna di luar kategori sebelumnya:

# Melihat semua route yang terdaftar
php artisan route:list

# Cache konfigurasi untuk performa lebih baik (production)
php artisan config:cache

# Bersihkan cache konfigurasi (development)
php artisan config:clear

# Cache route
php artisan route:cache

# Bersihkan semua cache sekaligus
php artisan optimize:clear

# Masuk ke mode maintenance
php artisan down

# Keluar dari mode maintenance
php artisan up

php artisan route:list sangat membantu saat debugging routing. Tambahkan --path=catatan untuk memfilter hanya route yang mengandung kata “catatan”, atau --method=POST untuk menyaring berdasarkan HTTP method.

Latihan

Coba kerjakan pengembangan berikut:

  1. Command dengan argumen — Buat command catatan:ringkas {user_id} yang menampilkan ringkasan statistik catatan milik user tertentu: total catatan, catatan berprioritas tinggi, dan tanggal catatan terakhir dibuat. Gunakan $this->table() untuk output.

  2. Command interaktif — Buat command catatan:buat yang memandu pengguna membuat catatan baru melalui CLI menggunakan $this->ask() untuk judul dan isi, serta $this->choice() untuk pilihan prioritas. Simpan hasilnya ke database.

  3. Artisan dari controller — Tambahkan endpoint di AdminController yang memanggil php artisan route:list via Artisan::call() dan menampilkan hasilnya di halaman admin sederhana.

Penutup Bab

Artisan bukan sekadar alat generate file — ini adalah infrastruktur untuk mengotomasi apapun yang berulang di siklus pengembangan kita. Command yang kita buat sendiri bisa berjalan terjadwal, dipicu dari controller, atau dijalankan manual sesuai kebutuhan.

Dengan fondasi aplikasi yang sekarang sudah lengkap — routing, middleware, controller, views, validasi, autentikasi, authorization, dan tooling — kita siap bergerak ke lapisan yang paling banyak menghabiskan waktu developer: database. Di bab berikutnya kita mulai dari awal: memahami bagaimana Laravel mengatur koneksi ke database dan fitur-fitur apa saja yang tersedia sebelum kita menyentuh ORM.

Referensi

  1. 1Artisan Console — Laravel 12.x Documentation
  2. 2Task Scheduling — Laravel 12.x Documentation