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);
    }
    

    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