Bütünlükler, Depolar ve Fabrikalar
Bütünlükleri bütünlük kümeleriyle koruyun ve bunları temiz biçimde kalıcı hâle getirin.
Bütünlükler, Depolar ve Fabrikalar, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 2. 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.
Değişmezleri koruma
Varlıklara ve değer nesnelerine sahip olduğunuzda, bunlardan oluşan kümeleri tutarlı tutacak ve temiz biçimde kalıcılaştıracak örüntülere ihtiyaç duyarsınız. DDD buna üç taktik örüntüyle yanıt verir: topluluk (bir tutarlılık sınırı), depo (koleksiyon benzeri bir kalıcılık soyutlaması) ve fabrika (karmaşık oluşturma). Bu derste bunların PHP'de nasıl bir araya geldiği gösterilmektedir.
Topluluk nedir
Bir topluluk, veri değişiklikleri açısından tek bir birim olarak ele alınan varlıklar ve değer nesneleri kümesidir. Bir varlık, topluluk köküdür — dışarıdaki kodun başvurabileceği tek üyedir. Tüm değişiklikler, topluluğun değişmezlerini uygulayan kök üzerinden yapılır. Topluluk aynı zamanda işlemsel sınırdır: tek işlem olarak yüklenir ve kaydedilir.
Kök bütünü korur
Dışarıdaki çağıran kod, iç üyelere hiçbir zaman doğrudan dokunmaz. Bir satır kalemi eklemek için kök üzerindeki bir yöntemi çağırırsınız; bu yöntem doğrulama yapar ve tutarlılığı (toplamları, sınırları) korur. Böylece değişmezler tek bir yerde tutulur.
<?php
final class LineItem {
public function __construct(
public readonly string $sku,
public readonly int $qty,
public readonly int $unitCents
) {}
public function subtotal(): int { return $this->qty * $this->unitCents; }
}
final class Order { // Aggregate Root
/** @var LineItem[] */
private array $items = [];
public function __construct(public readonly string $id) {}
public function addItem(string $sku, int $qty, int $unitCents): void {
if ($qty < 1) { throw new DomainException('qty must be >= 1'); }
$this->items[] = new LineItem($sku, $qty, $unitCents);
}
public function total(): int {
return array_sum(array_map(fn(LineItem $i) => $i->subtotal(), $this->items));
}
}
$o = new Order('o1');
$o->addItem('A', 2, 500);
$o->addItem('B', 1, 300);
echo $o->total(), PHP_EOL; // 1300
Küçük topluluklar tasarlama
Sık yapılan bir hata, toplulukları gereğinden büyük yapmaktır (Order nesnesinin tüm Customer grafiğine de sahip olması gibi). Pratik kurallar:
- Toplulukları küçük tutun; diğer topluluklara nesneyi tutarak değil, kimlikleriyle başvurun.
- Tek bir işlem tek bir topluluğu değiştirmelidir; topluluklar arasındaki koordinasyonu alan olaylarıyla sağlayın.
- Her zaman geçerli olması gereken değişmezler sınırı belirler.
Kimliğe göre başvurma
Sipariş, bir Customer varlığı yerine customerId değer nesnesini saklar. Bu, tutarlılık sınırını dar tutar ve devasa nesne grafiklerinin yüklenmesini önler. Topluluklar arası tutarlılık, tek bir dev işlemle değil, olaylar aracılığıyla zaman içinde sağlanır.
<?php
final class CustomerId {
public function __construct(public readonly string $value) {}
}
final class Order {
public function __construct(
public readonly string $id,
public readonly CustomerId $customerId // reference, not object
) {}
}
$order = new Order('o1', new CustomerId('cus_99'));
echo $order->customerId->value, PHP_EOL;
Depo sözleşmesi
Bir depo, topluluk köklerinden oluşan bellek içi bir koleksiyon varmış izlenimi verir. Alan yalnızca arayüze bağımlıdır; uygulama (Doctrine, PDO veya bellek içi) altyapı katmanında bulunur. Depolar toplulukların tamamıyla ilgilenir, hiçbir zaman kısmi satırlarla değil.
<?php
interface OrderRepository {
public function ofId(string $id): ?Order;
public function save(Order $order): void;
public function nextIdentity(): string;
}
Bellek içi uygulama
Bellek içi depo, hızlı ve veritabanı gerektirmeyen birim sınamaları için çok değerlidir. Alan arayüze bağlı olduğundan, uygulamaları serbestçe değiştirebilirsiniz (Bağımlılıkların Tersine Çevrilmesi uygulamada görülür).
<?php
interface OrderRepository {
public function ofId(string $id): ?object;
public function save(object $order): void;
public function nextIdentity(): string;
}
final class Order { public function __construct(public readonly string $id) {} }
final class InMemoryOrderRepository implements OrderRepository {
private array $store = [];
public function ofId(string $id): ?object { return $this->store[$id] ?? null; }
public function save(object $order): void { $this->store[$order->id] = $order; }
public function nextIdentity(): string { return 'o_' . bin2hex(random_bytes(4)); }
}
$repo = new InMemoryOrderRepository();
$repo->save(new Order('o1'));
var_dump($repo->ofId('o1') !== null);
Depo bir DAO değildir
Bir depo, genel bir oluşturma-okuma-güncelleme-silme DAO'su değildir. Alan anlamı taşıyan sorgular (findOverdueOrders()) sunar ve değişmezleri bozulmadan tam toplulukları yeniden oluşturur. Alanın kalıcılıktan habersiz kalması için SQL ve nesne-ilişkisel eşleme ayrıntılarını kasıtlı olarak gizler. Sorgu oluşturucularını veya genel amaçlı save($anyEntity) yöntemlerini alana sızdırmaktan kaçının.
Karmaşık oluşturma için fabrikalar
Bir topluluğu oluşturmak gerçek bir mantık içeriyorsa — kimlik üretmek, değer nesnelerini bir araya getirmek ve oluşturma zamanındaki değişmezleri uygulamak gibi — bu işi bir fabrikaya (ayrı bir sınıfa veya statik adlandırılmış kurucuya) taşıyın. Böylece varlığın kurucusu yalnızca temel oluşturma işini yapar ve geçerli oluşturma kuralları merkezileştirilir.
<?php
final class Order {
private function __construct(
public readonly string $id,
public readonly string $customerId
) {}
public static function place(string $customerId): self {
if ($customerId === '') { throw new DomainException('customer required'); }
return new self('o_' . bin2hex(random_bytes(4)), $customerId);
}
}
$order = Order::place('cus_1');
echo $order->id, PHP_EOL;
Birlikte nasıl çalışırlar
Bir uygulama hizmetindeki tipik akış şöyledir:
- Bir fabrika (veya adlandırılmış kurucu) geçerli bir topluluk oluşturur.
- Topluluk kökünün yöntemleri, kullanım sırasında değişmezleri uygular.
- Bir depo, topluluğun tamamını kalıcılaştırır ve daha sonra yeniden oluşturur.
Uygulama hizmeti, topluluk başına tek işlem içinde bu adımları düzenler ve yalnızca arayüzlere bağımlı olur.
Tüm topluluğa ait bir değişmezi uygulama
Kökün asıl değeri, üyeler arasındaki değişmezleri uygulamasıdır. Burada sipariş, bir satır kalemi toplamı kredi limitini aşacaksa onu reddeder — tek bir LineItem'ın kendi başına uygulayamayacağı bir kuraldır. Tüm değişiklikler kök üzerinden yapıldığından bu kuralın atlatılması mümkün değildir.
<?php
final class Order {
private array $items = [];
public function __construct(
public readonly string $id,
private int $creditLimitCents
) {}
public function addItem(int $cents): void {
if ($this->total() + $cents > $this->creditLimitCents) {
throw new DomainException('Exceeds credit limit');
}
$this->items[] = $cents;
}
public function total(): int { return array_sum($this->items); }
}
$o = new Order('o1', 1000);
$o->addItem(600);
try { $o->addItem(600); } catch (DomainException $e) { echo $e->getMessage(), PHP_EOL; }
echo $o->total(), PHP_EOL; // 600
Hızlı kontrol
Topluluk tasarımı.
Özet
Değişmezleri korumayı ve temiz biçimde kalıcılaştırmayı öğrendiniz. Topluluklar, tutarlılık ve işlemsel sınır oluşturur; yalnızca kökleri üzerinden değiştirilir ve diğer topluluklara kimlikleriyle başvurularak küçük tutulur. Depolar, topluluk köklerini bir alan arayüzünün arkasındaki koleksiyon olarak sunar; nesne-ilişkisel eşleme ve veritabanı sorgusu ayrıntılarını gizler ve bellek içi sınama taklitlerinin kullanılmasını sağlar. Fabrikalar, karmaşık ve değişmezleri uygulayan oluşturma işlemlerini merkezileştirir. Birlikte, alan modelinizin tutarlı ve kalıcılıktan habersiz kalmasını sağlarlar.
Yapay zeka eğitmeniyle PHP öğren — ücretsiz
Tarayıcında gerçek kod yaz ve çalıştır, 7/24 yapay zeka eğitmeninden anında yardım al; web'de ya da uygulamada kaldığın yerden devam et.
- Kurslar
- 49
- Dersler
- 195
Sıkça Sorulan Sorular
“Bütünlükler, Depolar ve Fabrikalar” dersi ücretsiz mi?
Evet — “Bütünlükler, Depolar ve Fabrikalar” 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.
“Bütünlükler, Depolar ve Fabrikalar” dersinde ne öğreneceğim?
Bütünlükleri bütünlük kümeleriyle koruyun ve bunları temiz biçimde kalıcı hâle getirin. 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 2. dersidir.
“Bütünlükler, Depolar ve Fabrikalar” 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