1. Laravel
  2. PHP

Laravel – Mengisi field created_by dan updated_by otomatis

Terkadang kita perlu mengetahui siapa saja user yang telah melakukan penyimpanan data atau mengubah data pada suatu tabel, perilaku ini biasa disebut dengan blameable behaviour. Laravel tidak menyediakan fitur ini secara default, oleh karena itu pada tutorial kali ini kita akan membahas bagaimana cara mengisi field created_by dan updated_by secara otomatis sesuai dengan user yang sedang login.

Langkah pertama yang harus dilakukan tentu saja kita sudah memiliki project Laravel itu sendiri, Jika anda belum memiliki project Laravel silahkan Install Laravel terlebih dahulu. Selanjutnya, tambahkan fitur authentication dari Laravel pada project anda untuk menangani proses authentication pada project anda.

Setelah persiapan awal selesai, mari kita mulai pada inti dari tutorial kali ini. Kita akan mendemokan fitur blameable behaviour ini dengan menggunakan table sederhana, misalnya posts dengan struktur table seperti ini.

ColumnType
idbigint(20) unsigned Auto Increment
titlevarchar(255)
contenttext
created_bybigint(20) unsigned
updated_bybigint(20) unsigned
created_attimestamp NULL
updated_attimestamp NULL

Field created_by dan updated_by diatas akan kita gunakan untuk menyimpan user yang melakukan perubahan pada table posts.

Pada tutorial kali ini kita hanya akan fokus pada implementasi blameable behaviour untuk mengisi field created_by dan updated_by secara otomatis di Laravel. Jadi pembuatan controller, model dan view tidak akan dibahas disini.

Model Observer

Laravel telah menyediakan beberapa event yang kita bisa gunakan untuk mengeksekusi suatu kode ketika terjadi perubahan pada Model Eloquent. Berikut event-event yang telah disediakan oleh Laravel retrieved, creating, created, updating, updated, saving, saved, deleting, deleted, restoring, restored

Untuk mengisi field created_by dan updated_by berarti kita perlu menyisipkan kode untuk mengisi field tersebut sebelum menyimpan dan mengupdate data pada model. Kita bisa menggunakan event creating dan updating dari Laravel.

Setelah memahami event mana yang akan kita gunakan, langkah selanjutnya adalah membuat sebuah Model Observer.

php artisan make:observer PostObserver

Perintah diatas akan membuat class baru (PostObserver) pada folder Observers. Untuk menyisipkan kode pada Eloquent event, kita hanya perlu membuat method sesuai dengan event yang akan kita gunakan dengan parameter class dari model yang akan digunakan, pada kasus ini kita akan menggunakan event creating dan updating dengan model Post.

Untuk mendapatkan id dari user yang sedang login kita bisa menggunakan method Auth::user()->id

<?php

namespace App\Observers;

use App\Post;
use Illuminate\Support\Facades\Auth;

class PostObserver
{
    public function creating(Post $post)
    {
        $post->created_by = Auth::user()->id;
        $post->updated_by = Auth::user()->id;
    }

    public function updating(Post $post)
    {
        $post->updated_by = Auth::user()->id;
    }
}

Selanjutnya kita perlu untuk mendaftarkan class observer yang telah kita buat, kita bisa menggunakan method observe dari model. Kita akan mendaftarkan class observer ini pada method boot di service provider.

Pada contoh kali ini kita akan menggunakan AppServiceProvider yang sudah ada secara default ketika kita menginstal Laravel.

<?php

namespace App\Providers;

use App\Observers\PostObserver;
use App\Post;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        Post::observe(PostObserver::class);
    }
}

Setelah mendaftarkan class observer, selanjutnya kita bisa mencoba untuk membuat data baru pada table posts, di asumsikan bahwa kita telah login pada aplikasi yang dibuat.

Post::create([
    'title' => 'Mengisi field created_by dan updated_by otomatis',
    'content' => 'Implementasi blameable behaviour pada eloquent model'
]);

Setelah mengeksekusi kode diatas, record pada table posts akan terlihat kurang lebih seperti ini.

Mengisi field created_by dan updated_by otomatis

Seperti itulah pemahaman dasar dari penggunaan model observer untuk implementasi blameable behaviour.

Model Observer untuk banyak Model

Permasalahan selanjutnya adalah bagaimana jika kita perlu mengimplementasikan sebuah observer untuk banyak class Model? Karena akan cukup melelahkan jika kita harus mendaftarkan sebuah observer satu per satu untuk setiap Model.

Untuk mengatasi permasalahan diatas, kita bisa membuat sebuah trait yang akan mendaftarkan observer pada model yang menggunakan trait tersebut.

Blameable Trait

Buatlah sebuat file baru yang akan mendaftarkan model observer pada saat model booting. Disini kita akan membuat trait baru pada folder app.

<?php

namespace App;

use App\Observers\BlameableObserver;

trait Blameable
{
    public static function bootBlameable()
    {
        static::observe(BlameableObserver::class);
    }
}

Blameable Observer

Buat sebuah class observer baru untuk menangani event pada model. Kita bisa menggunakan class PostObserver yang sudah kita buat sebelumnya dengan beberapa perubahan, akan tetapi akan lebih baik jika kita menggunakan nama class yang berbeda sesuai dengan fungsinya.

<?php

namespace App\Observers;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;

class BlameableObserver
{
    public function creating(Model $model)
    {
        $model->created_by = Auth::user()->id;
        $model->updated_by = Auth::user()->id;
    }

    public function updating(Model $model)
    {
        $model->updated_by = Auth::user()->id;
    }
}

Konfigurasi Model

Langkah terakhir, kita harus mengimplementasikan trait Blameable pada setiap model yang memerlukan implementasi Blameable Observer.

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Post extends Model
{
    use Blameable;

    //
}

Dengan metode ini kita tidak perlu lagi untuk mendaftarkan class observer pada Service Provider, kita bisa menghapus kode yang telah kita buat pada class AppServiceProvider sebelumnya.

Berikut saya sertakan contoh lengkap dari implementasi blameable behaviour pada tutorial kali ini.

Comments to: Laravel – Mengisi field created_by dan updated_by otomatis

    Your email address will not be published. Required fields are marked *

    Attach images - Only PNG, JPG, JPEG and GIF are supported.