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..
Yorum Yap