Alan Olayları ve Alan Hizmetleri
İş gerçeklerini alan olayları ve hizmetleriyle yakalayın.
Alan Olayları ve Alan Hizmetleri, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.
İş gerçeklerini kaydetme
Her davranış tek bir varlığın içine sığmaz. Alan olayları, gerçekleşmiş anlamlı iş gerçeklerini (OrderPlaced) kaydederek sistemin diğer bölümlerinin tepki vermesini sağlar. Alan hizmetleri, doğal olarak tek bir varlığa veya değer nesnesine ait olmayan alan mantığını barındırır. Bu derste, toplulukları şişirmeden modelinizi nasıl ifade gücü yüksek tutacağınız gösterilmektedir.
Alan olayı nedir
Bir alan olayı, alanda gerçekleşmiş bir şeyin değişmez kaydıdır ve ortak dil kullanılarak geçmiş zamanda adlandırılır: OrderPlaced, PaymentReceived, CustomerRelocated. Gerçeği açıklayan verileri ve gerçekleştiği zamanı taşır. Bu bir değer nesnesidir: bir kez oluşturulur ve bir daha değiştirilmez.
<?php
final class OrderPlaced {
public function __construct(
public readonly string $orderId,
public readonly int $totalCents,
public readonly DateTimeImmutable $occurredOn = new DateTimeImmutable()
) {}
}
$e = new OrderPlaced('o1', 1300);
echo $e->orderId, ' @ ', $e->occurredOn->format('H:i'), PHP_EOL;
Topluluklar olayları kaydeder
Topluluk kökü, davranışının bir parçası olarak olayları kaydeder; ardından uygulama katmanının işlem onaylandıktan sonra bunları dağıtabilmesi için olayları kullanıma sunar. Topluluğun kendisi dağıtım yapmaz — yalnızca kaydeder. Böylece alan, altyapı kaygılarından bağımsız kalır.
<?php
final class OrderPlaced {
public function __construct(public readonly string $orderId) {}
}
abstract class AggregateRoot {
private array $events = [];
protected function record(object $e): void { $this->events[] = $e; }
public function releaseEvents(): array {
$out = $this->events; $this->events = []; return $out;
}
}
final class Order extends AggregateRoot {
public function __construct(public readonly string $id) {
$this->record(new OrderPlaced($id));
}
}
$o = new Order('o1');
foreach ($o->releaseEvents() as $e) { echo get_class($e), PHP_EOL; }
İşlem onayından sonra dağıtma
Uygulama hizmeti topluluğu kalıcılaştırır, işlemi onaylar ve ardından serbest bırakılan olayları dağıtır. Olayların işlem onayından sonra dağıtılması, işleyicilerin geri alınmış bir gerçeğe hiçbir zaman tepki vermemesini sağlar. Aşağıdaki sıralama, e-posta veya dış çağrılar gibi yan etkiler için güvenli şablondur.
<?php
final class PlaceOrderService {
public function __construct(
private object $repo,
private object $dispatcher
) {}
public function handle(object $order): void {
// 1. persist inside a transaction
$this->repo->save($order); // commit happens here
// 2. only AFTER commit, release and dispatch
foreach ($order->releaseEvents() as $event) {
$this->dispatcher->dispatch($event);
}
}
}
echo "order persisted, then events dispatched", PHP_EOL;
İşleyiciler tepki verir
Her olayın, olayı oluşturan topluluktan bağımsız birçok işleyicisi olabilir. Bir PSR-14 dağıtıcısı, olayı kayıtlı dinleyicilere yönlendirir. Yeni bir tepki (çözümleme veya bildirim) eklemek, topluluğa dokunmak yerine bir dinleyici eklemek anlamına gelir.
<?php
final class OrderPlaced { public function __construct(public readonly string $orderId) {} }
final class Dispatcher {
private array $listeners = [];
public function on(string $event, callable $l): void { $this->listeners[$event][] = $l; }
public function dispatch(object $event): void {
foreach ($this->listeners[$event::class] ?? [] as $l) { $l($event); }
}
}
$d = new Dispatcher();
$d->on(OrderPlaced::class, fn($e) => print("email for {$e->orderId}\n"));
$d->on(OrderPlaced::class, fn($e) => print("analytics for {$e->orderId}\n"));
$d->dispatch(new OrderPlaced('o1'));
Sınırlar arasındaki olaylar
Alan olayları, işlem paylaşmadan tutarlı kalması gereken toplulukların birbirinden ayrılmasını sağlar. Satış bağlamındaki OrderPlaced, başka bir bağlamda olay aracılığıyla stok ayırmayı tetikleyebilir. Olaylar sistem içinde nesnelerdir; hizmetler arasında ise çoğu zaman ileti aracısında tümleştirme olaylarına dönüşür. İç alan olaylarını ve dış tümleştirme olaylarını ayrı tutun — herkese açık sözleşme, iç modeliniz olmamalıdır.
Alan hizmeti nedir
Bir alan hizmeti şu özelliklere sahip alan mantığını barındırır:
- birden çok topluluğu veya varlığı içerir; dolayısıyla bunların hiçbirine sığmaz ve
- ortak dille ifade edilen gerçek bir alan kavramıdır.
Durumsuzdur ve alan nesneleri üzerinde çalışır. Bir hesabın borcunu düşüp diğerine alacak yazan FundsTransfer hizmeti klasik örnektir.
Kodda bir alan hizmeti
Hizmet iki topluluğu koordine eder, ancak kendine ait hiçbir durum taşımaz. Mantık hesapların hiçbirine ait olmadığından, alan işleminin adını taşıyan bir hizmette bulunur.
<?php
final class Account {
public function __construct(public readonly string $id, private int $cents) {}
public function withdraw(int $c): void {
if ($c > $this->cents) { throw new DomainException('insufficient funds'); }
$this->cents -= $c;
}
public function deposit(int $c): void { $this->cents += $c; }
public function balance(): int { return $this->cents; }
}
final class MoneyTransferService {
public function transfer(Account $from, Account $to, int $cents): void {
$from->withdraw($cents);
$to->deposit($cents);
}
}
$a = new Account('a', 1000); $b = new Account('b', 0);
(new MoneyTransferService())->transfer($a, $b, 400);
echo $a->balance(), '/', $b->balance(), PHP_EOL; // 600/400
Alan hizmeti ve uygulama hizmeti karşılaştırması
İkisini karıştırmayın:
- Bir alan hizmeti iş mantığını içerir ve alan katmanında bulunur; işlemler veya HTTP hakkında hiçbir şey bilmez.
- Bir uygulama hizmeti bir kullanım senaryosunu düzenler: toplulukları depolardan yükler, alan mantığını çağırır, işlemi onaylar ve olayları dağıtır. Kendi iş kuralları olmayan, ince bir koordinatördür.
Hizmet tuzağından kaçının
Alan hizmetlerini gereğinden fazla kullanmak kolaydır. Mantık bir varlıkta veya değer nesnesinde yer alabiliyorsa orada bulunmalıdır: anemik bir modelden kaçınmanın yolu budur. Bir işlemin gerçekten birden çok topluluğu kapsadığı veya doğal bir yeri olmadığı durumlarda alan hizmetine başvurun. Aksi takdirde davranışı varlıklarınızdan çekip çıkarır ve yordamlı kodu yeniden üretirsiniz.
Uygulama servisi koordinasyonu
Bir araya getirelim: ince bir uygulama servisi, depolardan agregaları yükler, agregalar arası mantık için bir alan servisini çağırır, sonucu kalıcılaştırır ve olayları gönderir. Yalnızca orkestrasyon içerir — kendine ait iş kuralları yoktur.
<?php
final class Account {
public function __construct(public readonly string $id, public int $cents) {}
}
final class MoneyTransferService { // domain service: the rule
public function transfer(Account $from, Account $to, int $c): void {
if ($c > $from->cents) { throw new DomainException('insufficient'); }
$from->cents -= $c; $to->cents += $c;
}
}
final class TransferApp { // application service: orchestration only
public function __construct(private MoneyTransferService $domain) {}
public function run(Account $a, Account $b, int $c): void {
$this->domain->transfer($a, $b, $c); // then repo->save + dispatch
}
}
$a = new Account('a', 1000); $b = new Account('b', 0);
(new TransferApp(new MoneyTransferService()))->run($a, $b, 250);
echo $a->cents, '/', $b->cents, PHP_EOL; // 750/250
Hızlı Kontrol
Olaylar ve servisler.
Özet
İş gerçeklerini ve sahipsiz mantığı yakaladınız. Alan Olayları, agregaların kaydettiği ve uygulama katmanının işlem tamamlandıktan sonra gönderdiği değişmez, geçmiş zamanlı kayıtlardır; tepkileri birbirinden ayırır ve agrega sınırlarını aşar. Alan Servisleri, birden fazla agregaya yayılan durumsuz alan mantığını barındırır; yalnızca kullanım senaryolarını orkestre eden ince uygulama servislerinden ayrılır. Davranışın ait olduğu yerde, varlıklarda ve değer nesnelerinde kalması için her ikisini de ölçülü kullanın.
Sıkça Sorulan Sorular
“Alan Olayları ve Alan Hizmetleri” dersi ücretsiz mi?
Evet — “Alan Olayları ve Alan Hizmetleri” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.
“Alan Olayları ve Alan Hizmetleri” dersinde ne öğreneceğim?
İş gerçeklerini alan olayları ve hizmetleriyle yakalayın. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
PHP Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Alan Olayları ve Alan Hizmetleri” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- DDD Yapı Taşları: Varlıklar ve Değer Nesneleri
- Bütünlükler, Depolar ve Fabrikalar
- Alan Olayları ve Alan Hizmetleri
- Sınırlı Bağlamlar ve Bağlam Eşleme