Tanggal :11 September 2024

Belajar Laravel: Membuat Observer

Assalamualaikum Warahmatullahi Wabarakatuh.


Apa kabar semua? setelah kemarin kita mengenal tentang apa itu Observer, kali ini kita akan mulai belajar membuat Observer.
Bagi teman-teman yang belum mengenal tentang Observer, mungkin bisa mengunjungi artikel ini Apa Itu Observer. Artikel tersebut mencakup penjelasan tentang Observer.

Persiapan

Dalam kasus ini, kita akan menggunakan Laravel versi 8.

Pertama kita buat controller baru, jalankan perintah berikut.

php artisan make:controller UserController --resource --model=User

setelah itu, kita tambahkan route baru sehingga pada file routes/web.php menjadi seperti ini.

<?php

use App\Http\Controllers\UserController;
use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return view('welcome');
});

Route::resource('users', UserController::class);

jika persiapan telah selesai, mari kita lanjut implementasi Observer.

Implementasi

Sebelum lanjut ke Observer, kita mencoba testing terlebih dahulu. Mari coba jalankan perintah berikut.

php artisan make:test UserTest

ini akan membuat sebuah file UserTest pada direktori tests/Feature. Setelah itu, mari kita ubah code yang ada pada file UserTest seperti ini.

<?php

namespace Tests\Feature;

use Illuminate\Foundation\Testing\RefreshDatabase;
use Illuminate\Foundation\Testing\WithFaker;
use App\Models\User;
use Tests\TestCase;

class UserTest extends TestCase
{
    // database akan refresh setiap menjalankan test
    use RefreshDatabase;

    public function testAddUserWithoutPassword()
    {
        $data = [
            'name' => 'Andy',
            'email' => 'andy.dptyo@gmail.com',
        ];

        // kirim $data ke endpoint /users
        $response = $this->post('/users', $data);

        // menerima response json, karena tidak mengirim password maka menjadi default
        $response->assertJson([
            'password' => 'default',
        ]);
    }

    public function testAddUserWithPassword()
    {
        $data = [
            'name' => 'Andy',
            'email' => 'andy.dptyo@gmail.com',
            'password' => 'belajarobserver',
        ];

        // kirim $data ke endpoint /users
        $response = $this->post('/users', $data);

        // menerima response json, password sesuai dengan yang kita kirim
        $response->assertJson([
            'password' => 'belajarobserver',
        ]);
    }
}

jika kita jalankan perintah

php artisan test

maka semua testing akan dijalankan, dan kita melihat ada pesan failed.

mari kita buat test itu menjadi passed. ubah method store pada UserController menjadi seperti berikut.

public function store(Request $request)
    {
        // makeVisible untuk menampilkan property hidden pada model
        $user = User::create($request->all())
                    ->makeVisible(['password']);

        return response()->json($user, 200);
    }

lalu kita buat observer baru. Untuk membuat Observer, kita dapat menggunakan perintah artisan pada terminal.

php artisan make:observer UserObserver

kali ini kita coba sekaligus menambahkan nama model seperti ini

php artisan make:observer UserObserver --model=User

Perintah tersebut akan membuat sebuah file baru bernama UserObserver yang berada pada direktori App/Observers.

Perintah tersebut juga menambahkan model User sebagai type-hint pada beberapa method default di dalam class UserObserver yang telah kita buat.

Bila kita buka file tersebut, maka akan terlihat seperti berikut

<?php

namespace App\Observers;

use App\Models\User;

class UserObserver
{
    /**
     * Handle the User "created" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function created(User $user)
    {
        //
    }

    /**
     * Handle the User "updated" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function updated(User $user)
    {
        //
    }

    /**
     * Handle the User "deleted" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function deleted(User $user)
    {
        //
    }

    /**
     * Handle the User "forceDeleted" event.
     *
     * @param  \App\Models\User  $user
     * @return void
     */
    public function forceDeleted(User $user)
    {
        //
    }
}

Setelah itu, mari kita daftarkan Observer yang kita buat ke dalam Service Provider agar dapat berjalan dengan baik.

Tambahkan kode berikut di dalam method boot pada App\Providers\EventServiceProvider

User::observe(UserObserver::class);

sehingga menjadi seperti ini

<?php

namespace App\Providers;

use App\Models\User;
use App\Observers\UserObserver;
use Illuminate\Auth\Events\Registered;
use Illuminate\Auth\Listeners\SendEmailVerificationNotification;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Event;

class EventServiceProvider extends ServiceProvider
{
    /**
     * The event listener mappings for the application.
     *
     * @var array
     */
    protected $listen = [
        Registered::class => [
            SendEmailVerificationNotification::class,
        ],
    ];

    /**
     * Register any events for your application.
     *
     * @return void
     */
    public function boot()
    {
        User::observe(UserObserver::class);
    }
}

sekarang kita bisa tambahkan method baru pada Observer.

public function creating(User $user)
{
    // bila tidak ada password yang dikirim, maka password menjadi 'default'

    $user->password = request()->password ?? 'default';
}

Ok, coba jalankan test lagi dan kita lihat tidak ada pesan failed.

Kita telah berhasil membuat fitur add user dengan atau tanpa password.

Mungkin bisa juga menambahkan notifikasi atau kirim email setelah user berhasil dibuat pada method created tanpa perlu merubah kode pada controller.

/**
* Handle the User "created" event.
*
* @param  \App\Models\User  $user
* @return void
*/
public function created(User $user)
{
    Mail::to($user->email)->send(new Registered($user));
}

Namun, perlu konfigurasi email yang tidak akan dibahas di sini.

Oke, Sekian pembahasan tentang penggunaan sederhana Observer. Terima kasih untuk teman – teman yang telah membaca dan mohon maaf jika terdapat kekurangan ataupun kesalahan dalam penulisan di atas.

Wassalamualaikum Warohmatulloh Wabarokatuh.

Share

3 Comments

Tinggalkan Balasan