Event Observer di Eloquent Laravel
Trigger, mungkin beberapa orang sudah cukup akrab dengan kata tersebut. Dalam kasus di database, trigger merupakan fitur yang memungkinkan kita membuat sebuah proses yang dijalankan secara otomatis saat dipicu oleh aksi tertentu.
Tapi trigger ini levelnya berada di database, dan menurut saya penggunaan trigger ini sangat membantu saat kita mempunyai akses ke database, sehingga jika suatu saat akan ada perubahan fungsi, mudah untuk melakukan perubahan langsung di database. Lalu bagaimana jika kita tidak memiliki akses ke database ? Nah, di laravel ada fitur yang sedikit banyak mirip dengan trigger, yaitu dengan memanfaatkan Eloquent Event & Observer.
Studi Kasus
Untuk mencobanya saya di sini akan mencoba membuat sebuah fungsi log
sederhana yang bertugas mencatat setiap kali ada insert
, update
, dan delete
maka log
akan terisi.
Tabel Log
Pertama buat dulu migration tabel untuk log
.
php artisan make:migration create_table_activity_log --create=activity_logs
Dan struktur tabel log
itu sendiri :
<?php public function up() { Schema::create('activity_logs', function (Blueprint $table) { $table->increments('id'); $table->string('type'); $table->string('title'); $table->string('user'); $table->string('type_data'); $table->string('ref_id'); $table->timestamps(); }); }
Saya akan lewati proses pembuatan model dan controller saya anggap hal itu sudah pada tahu.
Mempersiapkan Observer
Karena setahu saya belum ada perintah yang dapat langsung membuat observer
, maka ini harus dibuat manual, agar rapi buat folder “Observers
” di dalam “app
”, lalu di dalamnya isi dengan berkas ArticleLogObserver.php
. sehingga strukturnya seperti ini
-app
--Observers
---ArticleLogObserver.php
Isi dari berkas ArticleLogObserver.php
itu sendiri seperti ini :
<?php
namespace App\Observers;
use App\ActivityLog;
use App\Article;
class ArticleLogObserver
{
//listen to creating article
public function created(Article $article)
{
$this->setLog("created",$article->title,$article->id);
}
public function updated(Article $article)
{
$this->setLog("updated",$article->title,$article->id);
}
public function deleted(Article $article)
{
$this->setLog("deleted",$article->title,$article->id);
}
public function restored(Article $article)
{
$this->setLog("restored",$article->title,$article->id);
}
private function setLog($type,$title,$ref_id)
{
$log = [
"type"=>$type,
"user"=> "Username", //gunakan Auth::user()->name jika sudah ada fungsi login
"title"=>$title,
"type_data"=>"article",
"ref_id"=>$ref_id
];
ActivityLog::create($log);
}
}
Penjelasan
Penamaan created
, updated
, deleted
, dan restored
itu sendiri sudah disediakan oleh Laravel. Selain penamaan tersebut ada creating
, updating
, deleting
, dan restoring
. Apa yang membedakan …ed dan …ing adalah :
…ed : Dilakukan setelah benar-benar proses selesai dilakukan.
…ing : Dilakukan saat proses sedang berlangsung.
Event
Setelah observer
selesai disiapkan buka berkas App/Providers/AppServiceProvider.php
lalu ubah jadi seperti ini :
<?php
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use App\Article; //<-- tambahkan ini
use App\Observers\ArticleLogObserver; //<-- tambahkan ini
class AppServiceProvider extends ServiceProvider
{
/**
* Bootstrap any application services.
*
* @return void
*/
public function boot()
{
//
Article::observe(ArticleLogObserver::class); //<-- daftarkan di sini
}
/**
* Register any application services.
*
* @return void
*/
public function register()
{
//
}
}
Jika berhasil harusnya saat melakukan fungsi-fungsi yang didaftarkan di observer table log akan tersisi seperti ini.