Laravel Observers Kullanımı

Merhaba,

Bu yazımda Laravel Observers kavramından bahsedeceğim.

Gayet kullanışlı ve güzel. Siz de projelerinizde kullanabilirsiniz.

Observer 'lar event listener ları gruplamak için kullanılır. Çok teknik oldu.

Şu şekilde de Türkçeleştirmek mümkün.

Eloquent Model ile işlem yapıyorsunuz. Klasik CRUD işlemleriniz var. Ama bu işlemleri yapmadan hemen önce ya da hemen sonra da farklı bir iş daha yapmak istiyorsunuz.

Daha da açalım. Diyelim ki kullanıcının işlem kaydını tutmak istiyorsunuz.

Bir içerik eklediğinde ya da sildiğinde ya da güncellediğinde log tablonuza hangi kullanıcının hangi işlemi yaptığını yazdırmak istiyorsunuz.

İşte burada Observers devreye giriyor. Tabi sadece log için geçerli değil, siz farklı şeyler de yaptırabilirsiniz.

Observers ile siz modelinizde bir event çalıştığında ona bağlayacağımız eventler varsayılan olarak belirlenmiştir. Bunlar şu şekildedir.

 

Retrieved : Bir kayıt çağrıldığında çalışacak olan event
Creating : Bir kayıt oluşturulmadan önce çalışacak olan event
Created : Bir kayıt oluşturulduktan sonra çalışacak olan event
Updating : Bir kayıt update edilmeden önce çalışacak olan event
Updated : Bir kayıt update ediltikten sonra çalışacak olan event
Saving : Bir kayıt kaydedilmeden önce çalışacak olan event ( create ya da update olduğunda da geçerlidir ) 
Saved : Bir kayıt kaydedildiktan sonra çalışacak olan event ( create ya da update olduğunda da geçerlidir ) 
Deleting : Bir kayıt silinmeden önce çalışacak olan event
Deleted : Bir kayıt silindikten sonra çalışacak olan event
Restoring : Soft-delete ile silinen bir kayıt restore edilmeden önce çalışacak olan event
Restored : Soft-delete ile silinen bir kayıt restore edildikten sonra çalışacak olan event

 

Gelelim senaryomuza.

Diyelim ki logs adında bir tablonuz var ve şu şekilde.

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateLogsTable extends Migration
{
 
    public function up()
    {
        Schema::create('log', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('user_id');
            $table->string('action');
            $table->unsignedBigInteger('post_id');
            $table->timestamps();
        });
    }

    public function down()
    {
        Schema::dropIfExists('log');
    }
}

Tabi bir de modelimiz var.

php artisan make:model Log

 Her şey güzel.

İstediğimiz senaryoda kullanıcı her create, update, delete işlemlerini yaptığında log tablosuna yazsın.

İşte bu gibi işlevler için Observer lara ihtiyacımız var.

Hemen bir tane oluşturalım.

php artisan make:observer PostObserver --model=Post

Yukarıdaki komut ile PostObserver adında bir class oluşturduk ve bunu Post modeline bağladık.

Dikkat ederseniz app dizini altına Observers adında bir klasör açıldı ve oluşturduğumuz PostObserver buraya geldi.

İçeriği varsayılan olarak aşağıdaki şekilde gelir.

<?php

namespace App\Observers;

use App\Models\Post;

class PostObserver
{
    public function created(Post $post)
    {
      
    }

    public function updated(Post $post)
    {
   
    }

    public function deleting(Post $post)
    {

    }

    public function deleted(Post $post)
    {
   
    }


    public function restored(Post $post)
    {
       
    }

  
    public function forceDeleted(Post $post)
    {
       
    }
}

 

Ardından, AppServiceProvider.php dosyasına ekleme yapıyoruz.

use App\Models\Post;
use App\Observers\PostObserver;

.......
.......

public function boot()
{
   Post::observe(PostObserver::class);
}

Artık işlem tamam.

Ne demiştik ? Kullanıcının yaptığı her CRUD işleminden önce veya sonra oluşturduğumuz bu Observer'ı kullanabiliriz.  Kullanalım o zaman.

<?php

namespace App\Observers;

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

class PostObserver
{
    public function created(Post $post)
    {
        $log = new Log();
        $log->user_id = Auth::user()->id;
        $log->action  = 'Added';
        $log->post_id = $post->id;
        $log->save();

    }


    public function updated(Post $post)
    {
        $log = new Log();
        $log->user_id = Auth::user()->id;
        $log->action  = 'Updated';
        $log->post_id = $post->id;
        $log->save();
    }

    public function deleting(Post $post)
    {

    }


    public function deleted(Post $post)
    {
        $log = new Log();
        $log->user_id = Auth::user()->id;
        $log->action  = 'Deleted';
        $log->post_id = $post->id;
        $log->save();
    }


    public function restored(Post $post)
    {
        
    }


    public function forceDeleted(Post $post)
    {
       
    }
}

 

Sanırım her şey anlaşılıyor.

Tabi bu basit bir örnek. Daha karmaşık ve daha güzel şeyler yapılabilir.

Evet, hepsi bu kadar..

 

 

 

 

2933 Görüntülenme

Yorum Yap