laravelartisancliMahir3 mnt baca

Artisan Command Kustom

Buat perintah CLI sendiri dengan signature, argumen, opsi, dan jadwalkan otomatis.

Membuat command

Banyak tugas tidak butuh browser: impor CSV, bersihkan data lama, kirim laporan harian. Bungkus jadi Artisan command:

bash
php artisan make:command KirimLaporanHarian
php
// app/Console/Commands/KirimLaporanHarian.php
namespace App\Console\Commands;

use Illuminate\Console\Command;

class KirimLaporanHarian extends Command
{
    protected $signature = 'laporan:harian {--tanggal=} {--kirim}';
    protected $description = 'Kirim laporan harian ke admin';

    public function handle(): int
    {
        $tanggal = $this->option('tanggal') ?? now()->toDateString();

        $this->info("Membuat laporan untuk {$tanggal}...");

        $total = \App\Models\Post::whereDate('created_at', $tanggal)->count();

        if ($this->option('kirim')) {
            // kirim email di sini
            $this->info("Laporan dikirim: {$total} post.");
        } else {
            $this->warn('Mode dry-run, tidak dikirim. Tambahkan --kirim.');
        }

        return self::SUCCESS;
    }
}

Jalankan: php artisan laporan:harian --tanggal=2024-01-01 --kirim.

Interaksi dengan user

php
$nama = $this->ask('Siapa nama admin?');
$setuju = $this->confirm('Lanjut kirim laporan?');

$this->table(['Kolom', 'Jumlah'], [['Post', 10], ['User', 5]]);
$this->error('Gagal!'); $this->info('OK'); $this->warn('Hati-hati');

Progress bar untuk proses panjang:

php
$bar = $this->output->createProgressBar(count($users));
foreach ($users as $user) {
    // proses...
    $bar->advance();
}
$bar->finish();

Penjadwalan otomatis

Di Laravel 11, jadwal ditulis di routes/console.php (bukan Kernel lagi):

php
// routes/console.php
use Illuminate\Support\Facades\Schedule;

Schedule::command('laporan:harian --kirim')->dailyAt('07:00');
Schedule::command('queue:prune-failed --hours=48')->daily();

Lalu di server, daftarkan SATU cron yang menjalankan scheduler tiap menit:

bash
* * * * * cd /path/to/blogku && php artisan schedule:run >> /dev/null 2>&1

Catatan teknis: schedule:run hanya mengeksekusi jadwal yang waktunya tiba. Kalau cron server tidak dipasang, jadwal tidak akan pernah jalan walau kodenya benar. Selalu verifikasi dengan php artisan schedule:list dan cek log cron setelah deploy.