Kamis, 06 July 2023

Laravel Observer

Observer memungkinkan Anda untuk memantau perubahan pada model dan melakukan tindakan yang sesuai, seperti mengirim email atau melakukan pembaruan di bagian lain dari sistem.

Introduction

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.

Kapan kita gunakan

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.

Start

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.

InvoiceController.php
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:

InvoiceObserver.php
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:

InvoiceObserver.php
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.

InvoiceObserver.php
public function created(Invoice $invoice): void
{
    $invoice->user->notify(new InvoiceCreated($invoice));
}

Dan sekarang controller kita sudah bisa kita perbarui menjadi hanya seperti:

InvoiceController.php
public function store(InvoiceRequest $request)
{
    $invoice = $request->user()->invoices()->create($request->validated());

    return new InvoiceResource($invoice);
}

Jauh lebih singkat dari pada sebelumnya.

Daftarkan Observer

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.

EventServiceProvider.php
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:

UserController.php
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:

UserObserver.php
public function deleted(User $user): void
{
    $user->invoices()->delete();
}

Dengan begitu Anda sekarang bisa juga mendaftarkan observer nya tepat pada EventServiceProvider tadi seperti:

EventServiceProvider.php
public function boot(): void
{
    Invoice::observe(InvoiceObserver::class);
    User::observe(UserObserver::class);
}

Laravel 11

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:

UserController.php
public function destroy(User $user)
{
    $user->delete();

    return response()->json([
        'message' => 'User deleted successfully'
    ]);
}

Kesimpulan

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 🖐🏻

Karteil
Destinasi Utama Belajar Online dengan Format Tulisan yang Elegan
Kunjungi Sekarang

Irsyad A. Panjaitan

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.

Go to Irsyad A. Panjaitan profile
Support me
SaweriaGithub