2 min read

Event Observer di Eloquent Laravel

Trigger, mungkin beberapa orang sudah cukup akrab dengan kata tersebut. Dalam kasus di databasetrigger 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 insertupdate, 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 createdupdateddeleted, dan restored itu sendiri sudah disediakan oleh Laravel. Selain penamaan tersebut ada creatingupdatingdeleting, 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.