Observer memungkinkan Anda untuk memantau perubahan pada model dan melakukan tindakan yang sesuai, seperti mengirim email atau melakukan pembaruan di bagian lain dari sistem.
Laravel Observer memang sangat diperlukan dalam pengembangan aplikasi Laravel. Observer memungkinkan Anda untuk memantau perubahan pada model dan melakukan tindakan yang sesuai, seperti mengirim email atau melakukan pembaruan di bagian lain dari sistem. Dengan menggunakan Observer, Anda dapat membuat aplikasi yang lebih fleksibel dan mudah untuk dikelola.
Selain itu, Observer juga memungkinkan Anda untuk memisahkan logika bisnis dari logika model, sehingga memudahkan dalam perawatan dan pengembangan kode. Dengan menggunakan Observer, Anda dapat dengan mudah menyesuaikan aplikasi Anda dengan perubahan kebutuhan dan memastikan konsistensi data.
Observer juga membantu meningkatkan skalabilitas aplikasi Anda dengan memungkinkan Anda untuk dengan mudah menambahkan atau menghapus fungsi pemantauan. Dengan adanya Observer, Anda dapat dengan cepat menyesuaikan aplikasi Anda dengan kebutuhan bisnis dan memastikan bahwa semua perubahan pada data terkelola dengan baik.
Dengan demikian, penggunaan Laravel Observer sangat diperlukan dalam pengembangan aplikasi Laravel untuk meningkatkan fleksibilitas, memisahkan logika, dan meningkatkan skalabilitas.
Contoh penggunaan Laravel Observer adalah ketika Anda memiliki model User
dan ingin mengirim email konfirmasi setiap kali ada pengguna baru yang terdaftar. Dengan Observer, Anda dapat membuat observer UserObserver
yang akan dipanggil setiap kali ada perubahan pada model User
.
Di dalam observer, Anda dapat menentukan aksi yang harus dilakukan, seperti mengirim email konfirmasi, setelah pengguna baru terdaftar. Dengan ini, setiap kali ada pengguna baru yang terdaftar, email konfirmasi akan dikirim secara otomatis.
Seandainya kita sedang membuat toko online, pastinya kita akan mempunyai tabel untuk invoice dan keranjang. Dan masing-masing dari tabel itu pastinya mempunyai yang relasi ke setiap user.
Yang mana dalam kasus ini, setiap user yang membuat invoice, kita ingin mengirimkan email ke user tersebut untuk memberi tahu "Hey, kamu telah membuat invoice". Misalnya seperti itu. Biasa yang mungkin Anda lakukan adalah langsung membuat kode nya di dalam controller nya.
public function store(InvoiceRequest $request)
{
$user = $request->user();
$invoice = $user->invoices()->create($request->validated());
$user->notify(new InvoiceCreated($invoice));
return new InvoiceResource($invoice);
}
Dalam hal ini, pastinya Anda sudah mengetahui ya, bahwa user berelasi ke invoice dan begitu juga sebaliknya:
# app/Models/Invoice.php
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
# app/Models/User.php
public function invoices(): HasMany
{
return $this->hasMany(Invoice::class);
}
Dengan controller di atas, tentu itu sangat tidak ada masalah. Namun bisa jadi akan banyak logic yang akan kita lakukan di sini, sehingga untuk hal semaca mengirim email ini, bisa kita lebih sederhanakan menggunakan observer.
Pertama, kita bisa membuat observer dengan menjalankan artisan seperti:
php artisan make:observer InvoiceObserver
Dengan perintah itu, kita akan diberikan file tepat pada folder app/Observers/InvoiceObserver.php
yang isinya akan seperti:
namespace App\Observers;
class InvoiceObserver
{
//
}
Namun, kita juga bisa memberi flag --model
yang itu bisa memberikan spesipik observe pada model yang ingin kita amati. Silakan hapus file tersebut dan jalankan ulang kembali artisan nya seperti:
php artisan make:observer InvoiceObserver --model=Invoice
Maka dengan begitu, kita akan diberikan boilerplate kurang lebih seperti ini:
namespace App\Observers;
use App\Models\Invoice;
class InvoiceObserver
{
public function created(Invoice $invoice)
{
}
public function updated(Invoice $invoice)
{
}
public function deleted(Invoice $invoice)
{
}
public function restored(Invoice $invoice)
{
}
public function forceDeleted(Invoice $invoice)
{
}
}
Pertama kita akan fokus pada method created
, dimana setiap invoice dibuat method itu akan di panggil setelahnya. Mungkin Anda sudah menebahknya, bahwa benar. Kita bisa mengirimkan notifikasi email ke pada user tepat di dalam method ini.
public function created(Invoice $invoice): void
{
$invoice->user->notify(new InvoiceCreated($invoice));
}
Dan sekarang controller kita sudah bisa kita perbarui menjadi hanya seperti:
public function store(InvoiceRequest $request)
{
$invoice = $request->user()->invoices()->create($request->validated());
return new InvoiceResource($invoice);
}
Jauh lebih singkat dari pada sebelumnya.
Pada saat sekarang ini, observer kita sedang tidak diketahui oleh sistem. Maka oleh karena itu, kita bisa memberitahunya dengan menambahkan 1 bari kode tepat pada file app/Providers/EventServiceProvider.php
. Tepat pada boot
method.
public function boot(): void
{
Invoice::observe(InvoiceObserver::class);
}
Dengan begitu, maka observe akan berjalan sesuai yang kita harapkan.
Contoh lain adalah, kita mau bahwa ketika user nantinya di hapus, kita ingin menghapus semua invoice yang pernah dibuat oleh user. Tradisional nya yang kita lakukan pada UserController
adalah seperti:
public function destroy(User $user)
{
$user->invoices()->delete();
$user->delete();
return response()->json([
'message' => 'User deleted successfully'
]);
}
Namun, kita juga bisa membuat hal ini di dalam observer. Buka terminal Anda dan silakan jalankan perintah berikut ini:
php artisan make:observer UserObserver --model=Observer
Setelah itu silakan buka file nya dan tepat pada method deleted
silakan tambahkan kode untuk menghapus invoicenya seperti:
public function deleted(User $user): void
{
$user->invoices()->delete();
}
Dengan begitu Anda sekarang bisa juga mendaftarkan observer nya tepat pada EventServiceProvider
tadi seperti:
public function boot(): void
{
Invoice::observe(InvoiceObserver::class);
User::observe(UserObserver::class);
}
Jika Anda menggunakan Laravel 11, maka mungkin Anda akan bertanya-tanya, di mana file EventServiceProvider
ini. Jika Anda bingung, maka sebenarnya Anda bisa publish itu. Tapi selain dari pada itu, kita bisa langsung memberi tahu observernya tepat pada model nya. Seperti misalnya.
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
use App\Observers\InvoiceObserver;
#[ObservedBy([InvoiceObserver::class])]
class Invoice extends Model
use Illuminate\Database\Eloquent\Attributes\ObservedBy;
use App\Observers\UserObserver;
#[ObservedBy([UserObserver::class])]
class User extends Model
Dengan begitu, sekarang kita bisa memodifikasi UserController
tadi dengan hanya seperti:
public function destroy(User $user)
{
$user->delete();
return response()->json([
'message' => 'User deleted successfully'
]);
}
Observer ini memudahkan dalam menangani setiap kejadian yang kita lakukan pada model yang bersangkutan. Namun, kita sama sekali tidak dituntut untuk melakukan hal ini. Apalagi jika memang controller kita tidak memiliki logic yang panjang. Gunakan observer sesuai dengan kebutuhan Anda.
Oia, jika Anda belum cek website yang baru saja saya buat, silakan cek disini ya. Semoga artikel ini bermanfaat, saya Irsyad. See you next time. Ba bye 🖐🏻
Let's start living like no one can help us in any event, so that when we are helped in certain times, it becomes a plus in itself.