spatie-laravel-activitylog: Cara mudah mencatat setiap Aktifitas pada Laravel
Salah satu kesempurnaan suatu aplikasi yaitu terdapat fitur log didalam nya..
Sebelumnya kita juga sudah pernah membahas tentang salah satu contoh sederhana audit log yaitu membuat created_by dan updated_by pada setiap table master ataupun transaksi, silahkan buka: Membuat Created_by dan Updated_by terisi otomatis dengan eloquent event..
Nah kalo yang akan kita bahas kali ini, lebih keren dan lebih men-detail..
spatie-laravel-activitylog: Cara mudah mencatat setiap Aktifitas pada Laravel
Nama package atau library nya yaitu spatie/laravel-activitylog, dengan package ini kita bisa mencatat setiap aktifitas yang terjadi pada suatu model..
Mulai dari login, create data, edit data, delete data, sampai logout, semuanya bisa tercatat, dan semua pencatatan nya akan ditampung kedalam table activity_log..
Untuk cara penggunaan nya juga mudah, mari kita mulai dari instalasi nya terlebih dahulu..
Instalasi Spatie/laravel-activitylog
Sebagai catatan, disini saya menggunakan Laravel versi 8, dan versi spatie yang akan saya gunakan yaitu versi 3..
Untuk dokumentasi resmi nya bisa kalian kunjungi halaman nya disini..
Untuk menginstall package nya bisa melalui composer, pada terminal jalankan perintah berikut:
composer require spatie/laravel-activitylog:^3.17
Tunggu beberapa saat sampai proses instalasi nya selesai..
Setelah proses instalasi nya selesai, kalian perlu mem-publish file migration nya dengan menjalankan perintah:
php artisan vendor:publish --provider="Spatie\Activitylog\ActivitylogServiceProvider" --tag="activitylog-migrations"
Jika muncul info error seperti berikut:
No publishable resources for tag [activitylog-migrations].
Maka kalian perlu melakukan vendor publish nya secara general dengan menjalankan perintah berikut:
php artisan vendor:publish
Maka nanti akan muncul banyak provider atau tags file yang ingin di publish..
Kalian cari yang migrations, kemudian inputkan angka nya, lalu tekan enter..
Setelah file migration nya ter-publish, kita jalankan migration nya dengan menggunakan perintah:
php artisan migrate
Kalo kalian cek di database, maka seharusnya akan muncul sebuah table baru dengan nama activity_log seperti pada gambar berikut:
Kalo kalian buka struktur table nya, akan seperti berikut:
Mulai Mencatat Activity Log Nya
Setelah proses instalasi nya selesai dilakukan, dan kita sudah mendapatkan table activity_log ny.. Maka sekarang kita akan mulai cara menggunakan nya..
Cara menggunakan nya juga sangat mudah, kita tinggal panggil aja trait LogsActivity nya kedalam file Model nya, maka activity log sudah langsung bisa tercatat..
Contoh nya saya memanggil trait LogsActivity pada model Product yang saya punya:
<?php namespace App\Models; use App\Models\_ProductScopes; use App\Models\_ProductAsesors; use App\Models\_ProductRelations; use Illuminate\Database\Eloquent\Model; use Spatie\Activitylog\Traits\LogsActivity; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Factories\HasFactory; class Product extends Model { use LogsActivity; use HasFactory; use SoftDeletes; use _ProductScopes, _ProductAsesors, _ProductRelations; protected $guarded = ['id']; protected $appends = [ 'photo_path', 'harga' ]; }
Coba kalian perhatikan pada baris ke-9, saya memanggil NameSpace LogsActivity nya, dan pada baris ke-15 saya memanggil lagi didalam class model nya..
Sampai sini sebetulnya untuk pencatatan log nya sudah bisa digunakan.. Sekarang jika ada action terhadap model Product tersebut, baik itu create data, edit data, ataupun delete data, semua nya akan tercatat..
Sebagai contoh barusan saya sudah mencoba create data dan update data terhadap model tersebut, dan aktifitas tersebut sudah otomatis tercatat kedalam table activity_log..
Mengganti isi kolom log_name
Kalo kalian perhatikan isi table activity log, atau hasil dari log nya, pada kolom log_name selalu berisi “default”..
Nah isi dari kolom log_name bisa kalian ganti dengan menambahkan property protected static $logName seperti pada contoh berikut:
use Illuminate\Database\Eloquent\Model; use Spatie\Activitylog\Traits\LogsActivity; class Product extends Model { use LogsActivity; protected static $logName = 'product'; }
Kita akan mengganti nilai dari kolom log_name yang awalnya default menjadi product, maka ketika nanti melakukan action, hasil nya akan seperti berikut:
Mengisi Nilai Properties Untuk Mencatat Perubahan Pada Setiap Atribut
Kalo kalian perhatikan lagi isi dari table activity_log, selama ini nilai dari kolom properties selalu kosong..
Sebetulnya kolom properties tersebut digunakan untuk mencatat perubahan-perubahan pada setiap atribut..
Tetapi atribut yang tercatat akan menginduk terhadap property fillable atau guarded yang ada pada model kalian..
Jika pada model kalian menggunakan property $fillable, maka kalian perlu menambahkan script berikut:
protected static $logFillable = true;
Tapi jika pada model kalian menggunakan property $guarded, maka kalian perlu menambahkan script berikut:
protected static $logUnguarded = true;
Contoh jika kalian menggunakan property $guarded, maka menggunakan $logUnguarded :
Maka nanti ketika kalian melakukan action terhadap model tersebut, kolom properties akan terisi..
Kolom properties tersebut akan terisi dengan data atribut lama dan data atribut baru jika ada perubahan..
Customizing Nilai Description
Selama ini nilai dari kolom description hanya created, updated atau deleted..
Sekarang misalkan ingin kita custom menjadi seperti berikut:
“Product_A Created Oleh User_B”..
Maka kalian perlu memanggil method berikut:
.... public function getDescriptionForEvent(string $eventName): string { return "This model has been {$eventName}"; } ....
Untuk contoh penerapan nya pada model Product menjadi seperti berikut:
<?php namespace App\Models; use App\Models\_ProductScopes; use App\Models\_ProductAsesors; use App\Models\_ProductRelations; use Illuminate\Support\Facades\Auth; use Illuminate\Database\Eloquent\Model; use Spatie\Activitylog\Traits\LogsActivity; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\Factories\HasFactory; class Product extends Model { use LogsActivity; use HasFactory; use SoftDeletes; use _ProductScopes, _ProductAsesors, _ProductRelations; protected $guarded = ['id']; protected $appends = [ 'photo_path', 'harga' ]; protected static $logName = 'product'; protected static $logUnguarded = true; public function getDescriptionForEvent(string $eventName): string { return $this->name . " {$eventName} Oleh: " . Auth::user()->name; } }
Maka nanti hasilnya akan menjadi seperti ini:
Mencatat Atribut Yang Hanya Memiliki Perubahan Saja
Sebelumnya kita sudah berhasil mencatat semua atribut kedalam kolom properties..
Sekarang bagaimana kalo kita hanya ingin mencatat atribut yang hanya memiliki perubahan saja..
Misalkan saya hanya mengganti name, maka yang tercatat hanya atribut name saja..
Kalian bisa gunakan perintah berikut:
protected static $logOnlyDirty = true;
Maka nanti hasilnya menjadi seperti ini:
Yang tercatat perubahan nya hanya atribut name saja..
Add Custome Fields
Misalkan kita perlu menambahkan satu buah kolom/field pada table activity_log..
Anggap saja kita menambahkan kolom type, dan kolom type tersebut kita isi dengan “product”, maka untuk mengisi nilai nya kalian bisa menggunakan method tapActivity..
Contoh nya adalah seperti berikut:
.... public function tapActivity(Activity $activity, string $eventName) { $activity->type = "product"; } ....
Mudah bukan?
Support Us
Jika artikel ini bermanfaat untuk kamu, membantu menyelesaikan masalah yang sedang kamu hadapi, kamu juga bisa dukung kami dengan mengunjungi halaman berikut: https://saweria.co/sangcahayaid
Terima kasih..