Perbandingan Metode Object Binding di Laravel Service Container
| Metode | bind() |
singleton() |
scoped() |
instance() |
|---|---|---|---|---|
| Deskripsi | Membuat instance baru setiap kali diselesaikan (resolved). | Hanya membuat satu instance dan mengembalikan instance yang sama pada permintaan berikutnya. | Hanya membuat satu instance dalam setiap siklus hidup permintaan/job (request/job lifecycle); itu akan dihapus setelah permintaan berakhir. | Mengikat (bind) instance yang sudah ada ke container dan mengembalikan instance tersebut setiap kali diselesaikan. |
| Kelebihan | - Instance baru yang segar untuk setiap permintaan, tidak ada masalah berbagi state - Penggunaan memori bersih - Cocok untuk logika yang memerlukan state independen - Dapat memberikan konfigurasi unik untuk setiap permintaan |
- Menghemat sumber daya sistem dengan hanya membuat instance satu kali - Memastikan konsistensi state - Cocok untuk berbagi konfigurasi dan sumber daya - Performa lebih baik pada situasi konkurensi tinggi (high concurrency) |
- Menyeimbangkan penggunaan memori dan berbagi state - Berbagi state dalam satu permintaan tetapi terisolasi antar permintaan - Cocok untuk skenario Web Request |
- Kontrol penuh atas waktu pembuatan instance - Dapat mengonfigurasi state instance sebelumnya - Cocok untuk layanan yang memerlukan konfigurasi khusus |
| Kekurangan | - Memerlukan lebih banyak sumber daya sistem untuk membuat instance berulang kali - Dapat memengaruhi performa di bawah konkurensi tinggi - Tidak cocok untuk skenario yang memerlukan berbagi state - Dapat menyebabkan masalah performa karena instance baru dibuat setiap saat. |
- Shared state dapat menyebabkan bug yang sulit dilacak - Tidak cocok untuk skenario yang memerlukan state independen - Penggunaan memori bertahan hingga program berakhir - Pengujian memerlukan perhatian khusus pada reset state - Jika instance tersebut memegang state, itu dapat menyebabkan perilaku yang tidak terduga. |
- Dapat menyebabkan masalah dalam tugas yang berjalan lama (long-running tasks) - Memerlukan pemahaman siklus hidup permintaan - Tidak cocok untuk perintah CLI |
- Kurang fleksibel - Tidak dapat menyesuaikan konfigurasi instance secara dinamis - Mungkin menempati memori saat startup - Tidak cocok untuk kasus yang memerlukan lazy loading atau beberapa instance. |
| Kasus Penggunaan | Untuk layanan jangka pendek atau kelas yang memerlukan state independen. | Untuk layanan yang dibagikan secara global, seperti logger atau manajer konfigurasi. | Untuk layanan yang perlu mempertahankan state dalam permintaan tetapi tidak ingin lintas permintaan, seperti koneksi database. | Ketika Anda sudah memiliki instance dan ingin menggunakannya kembali, seperti objek konfigurasi bersama. |
| Contoh | Ketika Anda memiliki kelas Product dan ingin membuat instance Product baru setiap kali data produk yang berbeda diminta. |
Ketika Anda memiliki kelas Logger dan ingin semua operasi penulisan log menggunakan instance yang sama untuk menjaga konsistensi. |
Ketika Anda memiliki kelas ShoppingCart dan perlu berbagi state keranjang belanja dalam permintaan yang sama. |
Ketika Anda memiliki kelas DatabaseConfig dan perlu mengatur parameter koneksi saat aplikasi dimulai. |
Contoh
Menggunakan bind()
$this->app->bind('Product', function () {
return new Product();
});
Setiap kali app('Product') dipanggil, itu akan mengembalikan instance Product baru.
Menggunakan singleton()
$this->app->singleton('Logger', function () {
return new Logger();
});
Setiap kali app('Logger') dipanggil, itu akan mengembalikan instance Logger yang sama.
Menggunakan scoped()
$this->app->scoped(Transistor::class, function (Application $app) {
return new Transistor($app->make(PodcastParser::class));
});
Berbagi instance yang sama dalam siklus hidup permintaan yang sama; permintaan yang berbeda akan membuat instance baru.
Menggunakan instance()
$service = new Transistor(new PodcastParser);
$this->app->instance(Transistor::class, $service);
Secara langsung mengikat instance yang sudah ada ke container.
Ringkasan
Laravel saat ini dapat diterapkan dalam banyak jenis skenario yang berbeda, seperti Web Request, CLI Command, Queue Job, Console Command, dll.
Jadi, ketika memilih metode binding mana yang akan digunakan, Anda perlu mempertimbangkan kebutuhan layanan dalam skenario yang berbeda, dan apakah Anda perlu berbagi state atau konfigurasi.