Laravel 11 memperkenalkan fungsi revolusioner bernama defer()
yang dirancang untuk menangani tugas-tugas yang memakan waktu secara asinkron tanpa mengganggu alur utama aplikasi. Fitur ini membawa efisiensi baru dalam pengelolaan tugas sederhana di latar belakang tanpa perlu konfigurasi kompleks.
Apa Itu defer()
?
defer()
adalah helper baru yang memungkinkan Kamu menjalankan tugas sederhana secara asinkron di latar belakang. Fitur ini memastikan aplikasi tetap responsif dengan menjalankan tugas setelah respon HTTP dikirimkan ke pengguna.
Apa Bedanya dengan Queued Job?
Lebih sederhana! Tidak perlu konfigurasi job, worker, atau kelas tambahan. Hanya sebuah callback yang dieksekusi setelah permintaan utama selesai.
Cara Kerja defer()
Saat Kamu menggunakan defer()
, kode dalam callback akan "menunggu" hingga permintaan utama selesai dengan sukses (kode status HTTP di bawah 400). Setelah itu, tugas yang ditunda akan dijalankan.
Contoh Penggunaan
- Mengirim Email Selamat Datang
Saat pengguna baru dibuat, email dikirimkan di latar belakang:
// app/Services/UserService.php
namespace App\Services;
use App\Models\User;
use App\Services\Notifications;
use function Illuminate\Support\defer;
class UserService
{
public function createUser(array $userData)
{
$user = User::create($userData);
defer(fn () => Notifications::sendWelcomeEmail($user));
return $user;
}
}
- Menghasilkan Laporan di Latar Belakang
Saat endpoint/report
dipanggil, laporan akan dibuat secara asinkron:
Route::post('/report', function (ReportRequest $request) {
$reportData = $request->validated();
defer(fn () => ReportService::generateReport($reportData));
return response()->json([
'status' => 'Laporan sedang dibuat'
], 200);
});
- Membatalkan Tugas yang Ditunda
Kamu dapat membatalkan tugas tertentu menggunakan nama unik:
// app/Services/UserService.php
namespace App\Services;
use App\Models\User;
use App\Services\Notifications;
use function Illuminate\Support\defer;
class UserService
{
public function createUser(array $userData)
{
$user = User::create($userData);
defer(fn () => Notifications::sendWelcomeEmail($user), 'welcomeMail');
if (!$this->postCreateVerification($user)) {
defer()->forget('welcomeMail');
}
return $user;
}
private function postCreateVerification(User $user): bool
{
// Verifikasi tambahan
return true;
}
}
Kapan Menggunakan defer()
?
defer()
cocok untuk tugas sederhana yang:
Dapat dijalankan cepat di latar belakang.
Tidak memerlukan pengelolaan task seperti antrian atau cache.
Membutuhkan eksekusi cepat tanpa kompleksitas tambahan.
Batasan defer()
Tidak Ada Persistensi
Jika proses terganggu, tugas tidak akan selesai, sehingga ada risiko kehilangan data.Skalabilitas
Pada skenario volume tinggi, seperti mengirim email masal,defer()
dapat membebani server karena bergantung pada runtime permintaan.Monitoring dan Kontrol Terbatas
Tidak ada pengelolaan task seperti retry, monitoring, atau fleksibilitas seperti pada antrian berbasis Redis.
Kesimpulan
Fungsi defer()
adalah solusi ideal untuk tugas latar belakang yang sederhana dan cepat tanpa konfigurasi kompleks. Namun, untuk kebutuhan skalabilitas atau kontrol lebih lanjut, antrian tradisional seperti Redis tetap menjadi pilihan yang lebih handal.
Apakah Kamu sudah siap mencoba defer()
di Laravel 11? 🚀