Geleneksel Durumun Problemi
Çoğu Laravel uygulaması standart CRUD (Create, Read, Update, Delete) mimarisine dayanır. Bir kullanıcı hesap bakiyesini değiştirdiğinde, veritabanındaki eski bakiye üzerine yazılır. Ancak, bakiye neden değiştiğini bilmeniz gerektiğinde ne olacak? Üç ay önce ortaya çıkan bir hatayı bulmak için sistemi denetlemeniz gerektiğinde?
Geleneksel veritabanları yalnızca mevcut durumu saklar. Veri unutkanlığına mağruz kalırlar. Smart Tech Devs’te mali defterler, denetim yoğun platformlar veya karmaşık kurumsal sistemler inşa ettiğimizde, durum tabanlı depolamayı terk edip Event Sourcing uygularız.
Event Sourcing Nedir?
Bir modelin mevcut durumunu saklamak yerine, Event Sourcing o modele ait geçmişte meydana gelen her değişikliği değiştirilemez bir olay dizisi olarak saklar. Mevcut durum, o olayların hepsini zamanın başlangıcından itibaren oynatarak hesaplanır.
Adım 1: Olayları Saklama
Bir accounts tablosu ve balance sütunu yerine, bir events tablomuz vardır. Para yatırıldığında bakiye güncellenmez; bunun yerine bir MoneyDeposited olayı kaydedilir.
// ❌ Geleneksel CRUD Deseni
$account = Account::find(1);
$account->balance += 500;
$account->save();
// ✅ Olay Tabanlı Desen
$accountAggregate = AccountAggregateRoot::retrieve($uuid);
$accountAggregate->depositMoney(500, 'Maaş yatırımı')
->persist();
Adım 2: Projeksiyonlar (Okuma Modeli)
Bakiye, binlerce olayı okuyarak hesaplanıyorsa, bu bir API yanıtı için çok yavaş olur. İşte burada Projeksiyonlar devreye girer. Bir projektör, olaylar gerçekleştiğinde dinler ve hızlı, okunmaya uygun bir veritabanı tablosunu günceller.
namespace App\Projectors;
use App\Events\MoneyDeposited;
use App\Models\AccountProjection;
use Spatie\EventSourcing\EventHandlers\Projectors\Projector;
class AccountBalanceProjector extends Projector
{
public function onMoneyDeposited(MoneyDeposited $event)
{
// Bu tablo tamamen hızlı okumak içindir.
// Gerçek kaynak olaylar tablosudur.
$account = AccountProjection::firstOrCreate(['uuid' => $event->aggregateRootUuid()]);
$account->balance += $event->amount;
$account->save();
}
}
Mühendislik ROI
Projeksiyon tablonuz bozulursa, onu silip olaylarınızı yeniden oynatarak mükemmel bir şekilde yeniden inşa edebilirsiniz. %100 doğru bir denetim kaydına, uygulama durumunuzu geçmişte herhangi bir ana geri getirme olanağına ve ayrılmış okuma/yazma mimarilerine (CQRS) sahip olursunuz. Bu karmaşıklığı getirir, ancak doğru alanlar için büyük bir güçtür.
Kaynak: Orijinal Makale


