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.
Column | Type |
---|---|
id | bigint(20) unsigned Auto Increment |
title | varchar(255) |
content | text |
created_by | bigint(20) unsigned |
updated_by | bigint(20) unsigned |
created_at | timestamp NULL |
updated_at | timestamp 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.

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.
laravel-blameable-demo (this link opens in a new window) by Lab-Informatika (this link opens in a new window)
Laravel blameable demo
No Comments
Leave a comment Cancel