Pada artikel ini, kita akan membahas penggunaan Observer pada Laravel 11 dan bagaimana penerapannya dalam proyek website sewa rumah. Observer merupakan fitur Laravel yang memudahkan kita untuk menangani event yang terjadi pada model, seperti saat data disimpan, diperbarui, atau dihapus. Dengan Observer, kita dapat mengeksekusi kode tertentu secara otomatis ketika ada perubahan pada model, sehingga proses pengembangan menjadi lebih rapi dan efisien.
Analogi sederhana untuk memahami Observer adalah seperti seorang pengelola properti yang bertugas mencatat setiap perubahan yang terjadi di kompleks perumahan. Ketika ada penyewa baru yang masuk, pengelola ini akan mencatat data penyewa, mengirim notifikasi kepada pemilik rumah, dan memperbarui status rumah secara otomatis. Dengan menggunakan Observer, kita bisa memastikan semua proses berjalan tanpa perlu menambah kode secara manual di berbagai tempat.
Namun, apa bedanya menggunakan Observer dengan tidak menggunakan Observer? Jika kita tidak menggunakan Observer, setiap event yang terjadi pada model harus ditangani di berbagai tempat seperti di controller atau service layer.
Hal ini dapat menyebabkan kode menjadi berantakan, sulit dirawat, dan rawan kesalahan. Sementara dengan Observer, kita bisa memusatkan logika bisnis yang berkaitan dengan event pada satu tempat saja, sehingga kode lebih terstruktur dan mudah dikelola.
Berikut ini adalah lima contoh penggunaan Observer Laravel 11 pada proyek website sewa rumah, lengkap dengan kode dan penjelasan.
Perbedaan Menggunakan Observer dan Tidak Menggunakan Observer
Tanpa Observer: Ketika kita tidak menggunakan Observer, kita harus menulis logika bisnis terkait event pada model di berbagai tempat, misalnya di controller atau service layer. Misalnya, jika kita ingin mencatat riwayat penyewaan setiap kali ada penyewa baru, kita perlu menambahkan kode pencatatan ini di setiap controller yang menangani penyewaan.
// Controller Penyewaan
public function store(Request $request)
{
$penyewaan = Penyewaan::create($request->all());
// Menyimpan riwayat penyewaan di sini
RiwayatPenyewaan::create([
'penyewaan_id' => $penyewaan->id,
'rumah_id' => $penyewaan->rumah_id,
'penyewa_id' => $penyewaan->penyewa_id,
'tanggal_mulai' => $penyewaan->tanggal_mulai,
'tanggal_selesai' => $penyewaan->tanggal_selesai,
'status' => 'Penyewaan baru'
]);
// Logika lainnya...
}
Kode di atas harus diulang setiap kali kita ingin menyimpan riwayat penyewaan, baik di controller lain atau pada fungsi lain yang menangani penyewaan. Ini akan membuat kode menjadi sulit dikelola dan rentan kesalahan jika kita lupa menambahkan logika ini di tempat lain.
Dengan Observer: Menggunakan Observer memungkinkan kita memusatkan logika bisnis yang berkaitan dengan event pada satu tempat, sehingga kode lebih terstruktur dan terorganisir.
// Observer Penyewaan
namespace App\\\\Observers;
use App\\\\Models\\\\Penyewaan;
use App\\\\Models\\\\RiwayatPenyewaan;
class PenyewaanObserver
{
public function created(Penyewaan $penyewaan)
{
RiwayatPenyewaan::create([
'penyewaan_id' => $penyewaan->id,
'rumah_id' => $penyewaan->rumah_id,
'penyewa_id' => $penyewaan->penyewa_id,
'tanggal_mulai' => $penyewaan->tanggal_mulai,
'tanggal_selesai' => $penyewaan->tanggal_selesai,
'status' => 'Penyewaan baru'
]);
}
}
Dengan Observer, kita cukup menulis logika bisnis ini satu kali di PenyewaanObserver
dan mendaftarkannya di AppServiceProvider
, sehingga akan otomatis berjalan setiap kali ada event created
pada model Penyewaan
. Kode ini lebih mudah dikelola dan lebih rapi.
Contoh Penerapan Observer pada Proyek Website Sewa Rumah
1. Menyimpan Riwayat Penyewaan Ketika Ada Transaksi Baru
Setiap kali ada transaksi penyewaan baru, kita bisa menggunakan Observer untuk menyimpan riwayat penyewaan secara otomatis.
php artisan make:observer PenyewaanObserver --model=Penyewaan
namespace App\\\\Observers;
use App\\\\Models\\\\Penyewaan;
use App\\\\Models\\\\RiwayatPenyewaan;
class PenyewaanObserver
{
public function created(Penyewaan $penyewaan)
{
RiwayatPenyewaan::create([
'penyewaan_id' => $penyewaan->id,
'rumah_id' => $penyewaan->rumah_id,
'penyewa_id' => $penyewaan->penyewa_id,
'tanggal_mulai' => $penyewaan->tanggal_mulai,
'tanggal_selesai' => $penyewaan->tanggal_selesai,
'status' => 'Penyewaan baru'
]);
}
}
Daftarkan observer ini di AppServiceProvider
agar dapat dijalankan otomatis.
public function boot()
{
Penyewaan::observe(PenyewaanObserver::class);
}
2. Mengirim Notifikasi Email Ketika Penyewaan Akan Berakhir
Observer ini berguna untuk mengirimkan notifikasi kepada penyewa dan pemilik rumah ketika masa penyewaan hampir berakhir.
php artisan make:observer PenyewaanObserver --model=Penyewaan
namespace App\\\\Observers;
use App\\\\Models\\\\Penyewaan;
use App\\\\Mail\\\\PenyewaanBerakhir;
use Illuminate\\\\Support\\\\Facades\\\\Mail;
class PenyewaanObserver
{
public function updated(Penyewaan $penyewaan)
{
if ($penyewaan->tanggal_selesai->isToday()) {
Mail::to($penyewaan->penyewa->email)->send(new PenyewaanBerakhir($penyewaan));
Mail::to($penyewaan->rumah->pemilik->email)->send(new PenyewaanBerakhir($penyewaan));
}
}
}
Pastikan observer ini terdaftar agar aktif pada saat aplikasi berjalan.
public function boot()
{
Penyewaan::observe(PenyewaanObserver::class);
}
3. Menghitung Harga Sewa Diskon Ketika Promo Diberlakukan
Observer ini akan menghitung harga sewa rumah secara otomatis ketika ada promo atau diskon yang diberikan.
php artisan make:observer PromoObserver --model=Promo
namespace App\\\\Observers;
use App\\\\Models\\\\Promo;
use App\\\\Models\\\\Rumah;
class PromoObserver
{
public function saving(Promo $promo)
{
$rumah = Rumah::find($promo->rumah_id);
if ($promo->diskon > 0) {
$rumah->harga_diskon = $rumah->harga_sewa - ($rumah->harga_sewa * $promo->diskon / 100);
$rumah->save();
}
}
}
Daftarkan observer ini di AppServiceProvider
.
public function boot()
{
Promo::observe(PromoObserver::class);
}
4. Menghapus Data Terkait Ketika Rumah Dihapus
Observer ini akan secara otomatis menghapus data terkait seperti penyewaan dan riwayat penyewaan ketika rumah dihapus.
php artisan make:observer RumahObserver --model=Rumah
namespace App\\\\Observers;
use App\\\\Models\\\\Rumah;
use App\\\\Models\\\\Penyewaan;
class RumahObserver
{
public function deleted(Rumah $rumah)
{
Penyewaan::where('rumah_id', $rumah->id)->delete();
}
}
Daftarkan observer ini agar Laravel dapat memprosesnya secara otomatis.
public function boot()
{
Rumah::observe(RumahObserver::class);
}
5. Menghitung Pendapatan Total Ketika Penyewaan Baru Ditambahkan
Observer ini secara otomatis akan memperbarui pendapatan total untuk setiap rumah ketika ada penyewaan baru yang masuk.
php artisan make:observer PenyewaanObserver --model=Penyewaan
namespace App\\\\Observers;
use App\\\\Models\\\\Penyewaan;
use App\\\\Models\\\\Rumah;
class PenyewaanObserver
{
public function created(Penyewaan $penyewaan)
{
$rumah = Rumah::find($penyewaan->rumah_id);
$rumah->total_pendapatan += $penyewaan->harga;
$rumah->save();
}
}
Pastikan observer ini terdaftar pada AppServiceProvider
.
public function boot()
{
Penyewaan::observe(PenyewaanObserver::class);
}
Dengan menggunakan Observer, kita dapat memastikan bahwa setiap event yang terjadi pada model ditangani secara konsisten tanpa perlu menulis kode berulang di banyak tempat. Ini sangat berguna untuk proyek website sewa rumah
yang melibatkan banyak transaksi dan data penting. Penerapan Observer yang tepat akan membuat proyek Anda lebih mudah dikembangkan dan dipelihara.
Penutup
Laravel akan terus populer berkat update-update terbaru yang memudahkan developer dalam membangun aplikasi web. Setiap versi baru selalu menghadirkan fitur-fitur canggih yang membuat Laravel tetap relevan dan kuat.
Untuk Anda yang ingin terus mengikuti perkembangan Laravel dan belajar lebih dalam, pastikan untuk selalu mengunjungi BuildWithAngga. Mereka sering menyediakan kelas gratis dengan studi kasus menarik yang diajarkan langsung oleh mentor berpengalaman. Dengan akses kelas seumur hidup, Anda bisa belajar kapan saja sesuai kebutuhan.
Jangan lewatkan kesempatan untuk terus meningkatkan skill programming Anda bersama BuildWithAngga!