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:
| Perintah | Hasil |
|---|---|
php artisan make:model NamaModel | Model Eloquent di app/Models/ |
php artisan make:controller NamaController | Controller di app/Http/Controllers/ |
php artisan make:middleware NamaMiddleware | Middleware di app/Http/Middleware/ |
php artisan make:request NamaRequest | Form Request di app/Http/Requests/ |
php artisan make:policy NamaPolicy | Policy di app/Policies/ |
php artisan make:migration nama_migrasi | File migrasi di database/migrations/ |
php artisan make:seeder NamaSeeder | Seeder di database/seeders/ |
php artisan make:command NamaCommand | Custom 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:
-
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. -
Command interaktif — Buat command
catatan:buatyang memandu pengguna membuat catatan baru melalui CLI menggunakan$this->ask()untuk judul dan isi, serta$this->choice()untuk pilihan prioritas. Simpan hasilnya ke database. -
Artisan dari controller — Tambahkan endpoint di
AdminControlleryang memanggilphp artisan route:listviaArtisan::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.