Laravel’da bir tenant oluşturmak, genellikle Tenant::create() ve ardından bir yönlendirme ile basit görünür. Ancak bu basitlik, onboarding süreci faturalama, özel alan adı, rol atama, çalışma alanı varsayılları, örnek veri, e-posta ve denetim günlüklerine dokunmaya başladığında kaybolur. Bu aşamada, “tenant oluşturma” bir CRUD aksiyonu olmaktan çıkar ve bir iş akışına dönüşür.
Takımlar genellikle bunu yanlış anlar çünkü ilk sürümü bir denetleyici aksiyonu içinde çalışır. Talebi doğrular, bir tenant satırı oluşturur, belki bir sahip kullanıcı oluşturur, birkaç iş gönderir ve bunu tamamlamış sayar. Ancak ürün büyüdükçe, kaynak tahsisi yavaşlar. Harici sistemler devreye girer. Bir adım başarılı olur, diğeri zaman aşımına uğrar, üçüncüsü iki kez tekrar dener ve aniden üretimde yarım oluşturulmuş hesaplar kalır; bu da güvenilir bir kurtarma hikayesi bulunmadığı anlamına gelir.
Pratik çözüm, tenant onboarding’i tek bir istek-cevap olayı olarak ele almayı bırakmaktır. Bunu izlenebilir bir iş akışı olarak modelleyin; açık adımlar, durum geçişleri, tekrar denemeler, hata yönetimi ve operatör görünürlüğü ile.
Denetleyici-aksiyon versiyonu, tahsis dağınık hale gelene kadar çalışır
Denetleyici-aksiyon versiyonu, tahsis dağınık hale gelene kadar çalışır
Pek çok Laravel SaaS uygulaması, bu en belirgin uygulama olduğu için buradan başlar.
public function store(CreateTenantRequest $request)
{
$tenant = Tenant::create([
'name' => $request->string(),
=> $request->string(),
]);
$owner = User::create([
=> $tenant->id,
=> $request->string(),
=> $request->string(),
]);
$owner->assignRole();
SeedTenantDefaults::dispatch($tenant->id);
SendWelcomeEmail::dispatch($owner->id);
return response()->json([
=> $tenant->id,
=> ,
], 201);
}
Bu, onboarding süreci küçük, senkronize ve tamamen yerel olduğunda pek bir sorun yaratmaz.
Ancak onboarding genellikle bu kadar küçük kalmaz.
Çabuk bir şekilde, tenant yaratma şu gibi şeyleri içermeye başlar:
- faturalama müşterisini sağlama
- bir abonelik veya deneme oluşturma
- bir alan adını ayarlama veya doğrulama
- özellik bayrakları veya planlar ekleme
- varsayılan roller ve izinler oluşturma
- şablonlar, ayarlar ve başlangıç içeriği ekleme
- davet veya doğrulama e-postası gönderme
- denetim olaylarını yazma
- iç sistemleri veya analiz boru hatlarını bilgilendirme
Bu noktada, denetleyiciniz artık “bir tenant yaratmak” değil, farklı gecikme, hata ve tekrar deneme özelliklerine sahip dağılmış bir operasyon setini başlatmaktadır.
Önce ne kırılır
Önce ne kırılır
İlk hata genellikle yıkıcı değildir; sinir bozucudur.
Tenant satırı vardır, ancak faturalama kurulumu başarısız olmuştur.
Ya da faturalama müşterisi vardır, ancak alan adı kaydı oluşturulmamıştır.
Ya da tohumlama işi kısmen çalıştı, ardından karşılama e-postası üç kez tekrar dendi, ardından yönetici arabirimi, sahibi hiç erişim almamasına rağmen çalışma alanının mevcut olduğunu söyler.
Tüm bu başarısızlıklar nadir değildir. Gerçek sistemlerin yaptığı tam olarak budur.
Neden hızlıca operasyonel borç haline gelir
Neden hızlıca operasyonel borç haline gelir
Eğer onboarding, bir denetleyici aksiyonu ve birkaç ayrık iş olarak modellenirse, genellikle üç önemli şeyi kaybedersiniz:
- mevcut onboarding durumu için güvenilir bir kaynak
- sadece başarısız olan adımı tekrar denemek için temiz bir yol
- zaten ne olduğunu ve ne olması gerektiğini görebilen bir operatör görünürlüğü
İşte böyle yarım oluşturulmuş tenant’lar destek biletlerine, manuel betiklere ve “bir SQL çalıştırın ve artisan komutunu çalıştırın” temizleme ritüellerine dönüşüyor.
Bir iş akışı modeli, gerçeği depolamak için bir yer sağlar
Bir iş akışı modeli, gerçeği depolamak için bir yer sağlar
İlk gerçek iyileştirme kavramsaldır, teknik değildir: onboarding’i bir yan etki değil, bir durum olarak ele alın.
“Bir tenant yarattık” yerine, şunlar hakkında düşünün:
- bir onboarding denemesi başlatıldı
- belirli tahsis adımları planlandı
- bazı adımlar tamamlandı
- bazıları bekliyor
- bazıları başarısız oldu
- iş akışı tamamlandı, tekrar denemeye açık, engellendi veya iptal edildi
Bu, normalde kalıcı bir onboarding kaydı istemeniz gerektiği anlamına gelir.
Schema::create(, function (Blueprint $table) {
$table->id();
$table->foreignId()->nullable()->constrained();
$table->string();
$table->string();
$table->json();
$table->timestamp()->nullable();
$table->timestamp()->nullable();
$table->timestamp()->nullable();
$table->text()->nullable();
$table->timestamps();
});
Bu kayıt, gereksiz iş yükü değildir. Sisteminize tahsis hikayesini depolamak için bir yer sağlar.
O kaydın hangi soruları yanıtlaması gerekir
O kaydın hangi soruları yanıtlaması gerekir
En azından, onboarding modelinizin şu soruları yanıtlayabilmesi gerekir:
- tenant’ı kim talep etti
- hangi tenant, eğer var ise, zaten oluşturulmuş
- onboarding şu anda hangi durumdadır
- en son hangi adım başarısız oldu
- iş akışı tekrar denemeye açık mı
- onboarding ne zaman tamamlandı veya başarısız oldu
Bunlar olmadan, her aşağıdan gelen iş yerel kararlar almakta ancak paylaşılan kontrol düzlemi olmaksızın hareket etmektedir.
Durum açık olmalı, yan etkilerden çıkarılmamalıdır
Durum açık olmalı, yan etkilerden çıkarılmamalıdır
Yaygın bir hata, onboarding durumunu başka yerlerdeki satırların varlığından çıkarmaktır:
- eğer tenant var ise, onboarding başarılı oldu
- eğer abonelik var ise, faturalama adımı başarıyla geçti
- eğer alan adı var ise, DNS adımı başarıyla geçti
Bu akıllıca görünebilir ama hızla karmaşık hale gelir.
Bunun yerine açık iş akışı durumları istemelisiniz:
pendingrunningawaiting_external_confirmationfailed_retryablefailed_manual_reviewcompleted
Bu durumlar, niyeti diğer on tabloya yayılmış çıkarımlardan çok daha iyi iletir.
Onboarding’i farklı hata anlamsalara sahip izlenen adımlara ayırın
Onboarding’i farklı hata anlamsalara sahip izlenen adımlara ayırın
Bu tasarım gerçeğin zor noktasıdır. Her onboarding adımı aynı şekilde davranmaz, bu yüzden onları öyle modellemeyin.
Bazı adımlar işlemsel ve yereldir. Bazıları asenkron ve uzaktır. Bazıları güvenle tekrar denemeye açık. Bazıları ise körlemesine tekrar yapılmamalıdır.
Güçlü bir Laravel tenant onboarding iş akışı bu gerçeklere göre adımları ayırır.
Yararlı bir adım ayrıştırması
Yararlı bir adım ayrıştırması
Tipik bir SaaS uygulaması için onboarding şöyle görünebilir:
- tenant kaydı oluştur
- sahip hesabı oluştur
- planı veya denemeyi iliştir
- faturalama müşterisini sağla
- varsayılan çalışma alanı verilerini tohumla
- varsayılan roller ve izinleri ata
- alan veya alt alan adını ayarla
- onboarding e-postasını gönder
- denetim ve analiz olaylarını yayınla
- onboarding’i tamamla
Bu, her şeyin ardışık çalışması gerektiği anlamına gelmez. Her adım açık, izlenebilir ve düşünülmeli.
Her başarısızlık aynı durumu gerektirmez
Her başarısızlık aynı durumu gerektirmez
Takımlar genellikle bu noktada çok saf kalmaktan yanlar.
Eğer karşılama e-postasını göndermek başarısız olursa, onboarding başarısız mı işaretlenmelidir? Belki hayır.
Eğer faturalama müşteri oluşturma başarısız olursa, tenant hala aktif kabul edilmeli mi? Genellikle hayır.
Eğer alan doğrulaması kullanıcı DNS değişikliklerine bağlıysa, bu bir hata mı? Kesinlikle değil.
Bunun anlamı her adımın kendi tamamlanma ve engelleyici anlamlarını taşımasıdır.
Pratik bir adım modeli
Pratik bir adım modeli
Schema::create(, function (Blueprint $table) {
$table->id();
$table->foreignId()->constrained();
$table->string();
$table->string();
$table->unsignedInteger()->default(0);
$table->timestamp()->nullable();
$table->timestamp()->nullable();
$table->timestamp()->nullable();
$table->text()->nullable();
$table->json(->nullable();
$table->timestamps();
});
Artık adım düzeyindeki durumu takip edebilirsiniz; tüm iş akışının tek bir ikili başarı/başarısızlık olayı olduğunu varsaymadan.
Doğru yürütme modeli, orkestrasyon değil, denetleyici yapıştırmasıdır
Doğru yürütme modeli, orkestrasyon değil, denetleyici yapıştırmasıdır
Onboarding bir iş akışı haline geldiğinde, onu yönetmek için bir şeye ihtiyacınız vardır.
Bu, ilk aşamada büyük bir iş akışı motoruna ihtiyaç duymaz, ancak yalnızca bir denetleyicinin ilgisiz işlere göndermedeki umudundan daha fazlasını gerektirir.
Orkestrasyon katmanı şunları belirlemelidir:
- hangi adımın çalıştırılacağı
- hangi adımların paralel çalışabileceği
- neyin engelleyici olduğuna
- ne zaman tekrar deneneceğine
- ne zaman durulması ve yükseltilmesi gerektiğine
- ne zaman iş akışının tamamlandığına
Basit bir uygulama servisi iyi bir başlangıçtır
Basit bir uygulama servisi iyi bir başlangıçtır
Odaklanmış bir koordine sınıfıyla başlayabilirsiniz.
final class StartTenantOnboarding
{
public function handle(array $input): TenantOnboarding
{
$onboarding = TenantOnboarding::create([
=> ,
=> $input[],
=> $input,
=> now(),
]);
RunTenantOnboardingWorkflow::dispatch($onboarding->id);
return $onboarding;
}
}
Şimdi iş akışı yöneticisi adım ilerlemeyi yönetebilir.
final class RunTenantOnboardingWorkflow implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
public function __construct(public int $onboardingId) {}
public function handle(TenantOnboardingCoordinator $coordinator): void
{
$coordinator->advance($this->onboardingId);
}
}
Bu, her şeyi bir denetleyiciye yerleştirmekten çok daha iyi; çünkü orkestrasyon artık bir yere sahiptir.
Koordinatör idempotent olmalıdır
Koordinatör idempotent olmalıdır
Bu çok önemlidir.
Queue tekrarları, çoğaltma gönderimleri ve kısmi adım tamamlama gibi şeyler olacaktır. Koordinatörünüz tekrar girmeye güvenli olmalıdır.
Bu genellikle şunları gerektirir:
- hareket etmeden önce mevcut iş akışı durumunu kontrol etme
- zaten tamamlanmış adımları atlama
- tekrar eden yan etkileri önlemek için benzersiz kısıtlamalar veya adım işaretçileri kullanma
- harici sağlama çağrılarını mümkün olduğunda idempotent hale getirme
Eğer iş akışı yöneticisi idempotent değilse, tekrar denemeler yardımcı olmaktan ziyade tehlikeli hale gelir.
Harici sistemleri nihayetinde başarılı, nihayetinde başarısız veya nihayetinde manuel olarak ele alın
Harici sistemleri nihayetinde başarılı, nihayetinde başarısız veya nihayetinde manuel olarak ele alın
Bu, onboarding tasarımlarının genellikle gerçekçilikten uzaklaştığı yerdir. Takımlar, harici adımların yerel metot çağrıları gibi davrandığını varsayarlar.
Bu doğru değildir.
Faturalama, alan adları, e-posta ve üçüncü taraf sağlama her biri farklı belirsizlik türlerine sahiptir. Temiz bir iş akışı bunu kabul eder.
Modellenmesi gereken üç harici sonuç
Modellenmesi gereken üç harici sonuç
Çoğu harici onboarding adımının sonucu yalnızca başarı veya başarısızlık değildir. Genellikle şu şekildendir:
- tamamlandı: harici sistem eylemi doğruladı
- tekrar denemeye açık hata: adım, daha sonra başarılı olabilecek bir şekilde başarısız oldu
- bekliyor/manual: adım henüz otomatik olarak ilerleyemez
Alan adı onboarding’u mükemmel bir örnek teşkil etmektedir.
Bir alan adı kaydını başarıyla oluşturabilirsiniz, ancak gerçek doğrulama, müşterinin henüz yapmadığı DNS değişikliklerine bağlıdır. Bu, başarısız bir iş akışı değil, harici bir eylem bekleyen bir iş akışıdır.
Örnek: faturalama artı alan adı adımları
Örnek: faturalama artı alan adı adımları
final class ProvisionBillingCustomerStep
{
public function handle(TenantOnboarding $onboarding): StepResult
{
try {
$customerId = $this->billing->createCustomer([
=> $onboarding->input[],
=> $onboarding->input[],
]);
$onboarding->tenant->update([=> $customerId]);
return StepResult::completed();
} catch (TemporaryProviderException $e) {
return StepResult::retryable($e->getMessage());
} catch (PermanentProviderException $e) {
return StepResult::manualReview(->getMessage());
}
}
}
Bu, sadece istisnalar fırlatmak ve sıranın ne yapacağını tahmin etmesine izin vermekten çok daha kullanışlı bir sözleşmedir.
Manuel gözden geçirme, mimari bir başarısızlık değildir
Manuel gözden geçirme, mimari bir başarısızlık değildir
Takımlar, iş akışının tamamen otomatik hissedilmesini istediklerinden, açık manuel-inceleme durumlarına karşı direnirler. Bu, birçok gerçek onboarding sisteminin altyapısına karşı bir fantazi.
Eğer bir vergi yapılandırma uyumsuzluğu, faturalama dolandırıcılık kontrolü veya alan doğrulama sorunu insan müdahalesini gerektiriyorsa, bunu dürüstçe modelleyin.
“Manuel gözden geçirme gerekli” diyen bir sistem çok daha sağlıklıdır; sürekli olarak umutsuz bir adımı tekrar denemektense.
Vaka çalışması dersi: kısmi başarı gizleme değil, kurtarma yolları gerektirir
Vaka çalışması dersi: kısmi başarı gizleme değil, kurtarma yolları gerektirir
Bu, çoğu takımın sadece yanıldıklarında öğrendiği bir noktadır.
Gerçekçi bir onboarding yolu hayal edin:
- tenant satırı oluşturuldu
- sahip hesabı oluşturuldu
- tohum verisi başarılı oldu
- faturalama müşteri oluşturma, sağlayıcı tarafında başarı ile zaman aşımına uğradı
- tekrar denemek güvenli değil çünkü ikinci bir müşteri oluşturulabilir
- faturalamanın engelleyici olarak kabul edilmesi nedeniyle alan adı adımı hiç başlamadı
- destek, “var olan” bir tenant görüyor ancak onboarding’in güvenli bir şekilde devam edip edemeyeceğini bilmiyor.
Bu tuhaf bir kenar durumu değil. Uzaktan sistemlerle iletişime geçtiği anda gerçekleşen durum tam olarak budur.
İyi bir iş akışı burada ne yapmanıza izin verir
İyi bir iş akışı burada ne yapmanıza izin verir
İyi bir iş akışı modeli, kesin olarak aşağıdakileri yapmanıza olanak tanır:
- tamamlanmış ve eksik olan adımları inceleyin
- faturalama müşteri oluşturma işleminin idempotent olduğunu doğrulayın
- sadece engellenmiş adımı yeniden çalıştırın
- tekrardan tohumlama veya tenant’ı yeniden oluşturmaktan kaçının
- nhangesi dindeki kimlerin neyi ve neden devam ettirdiği hakkında bir denetim kaydı tutun.
İşte bu, iş akışına dayalı onboarding ile denetleyiciye dayalı onboarding arasındaki farktır.
Kurtarma, üretim acısı bunu zorlamadan önce tasarlanmalıdır
Kurtarma, üretim acısı bunu zorlamadan önce tasarlanmalıdır
Her onboarding adımının bu cevaplardan birine sahip olması gerekir:
- otomatik olarak tekrar denemeye güvenli
- manuel olarak tekrar denemeye güvenli
- tekrar denememeli; operatör kararı gerektirir
- geri alma ile telafi edilebilir
Eğer sisteminiz her adım için bunları yanıtlayamıyorsa, gerçek anlamda üretim hazır bir onboarding sistemine sahip olamazsınız.
Operatör görünürlüğü ürünün bir parçasıdır, bir düşünce değil
Operatör görünürlüğü ürünün bir parçasıdır, bir düşünce değil
Eğer onboarding kısmen başarısız olabiliyorsa, birinin nerede ve neden olduğunu görmesi gerekir.
Operatörlerin görebileceği şeyler
Operatörlerin görebileceği şeyler
Onboarding için yararlı bir yönetici ekranı şunları göstermelidir:
- tenant ismi ve talep edilen sahip
- mevcut iş akışı durumu
- her bir adım durumu ve son girişim
- başarısız adım başına son hata mesajı
- otomatik tekrar denemenin bekleyip beklemediği
- manuel eylem gerektirip gerektirmediği
- denetim notları veya devam etme geçmişi
Bu ekran genellikle, dahili karmaşık abstractions’dan daha değerlidir; çünkü üretimde onboarding başarısız olduğunda panik dokusunu azaltır.
Dahili durum API’leri için küçük bir yanıt şekli
Dahili durum API’leri için küçük bir yanıt şekli
{
"onboarding_id": 481,
"tenant_id": 102,
"status": "failed_retryable",
"steps": [
{"step": "create_tenant", "status": "completed"},
{"step": "create_owner", "status": "completed"},
{"step": "provision_billing_customer", "status": "failed_retryable",
"last_error": "timeout from provider"},
{"step": "seed_defaults", "status": "completed"},
{"step": "configure_domain", "status": "pending"}
]
}Bu, durumu saniyeler içinde iletir. Sadece günlükler bunu yapmaz.
İş akışını “tamamladı” demek için kesin tutun
İş akışını “tamamladı” demek için kesin tutun
Burası gevşekleşebileceğiniz kolay bir yer.
Takımlar bazen onboarding’i, tenant teknik olarak giriş yapabileceği an tamamlandığını işaretlerler. Bu bazı ürünler için iyi olabilir. Diğerleri için, kritik yapılandırma noktalarından eksik aktif görünümlü hesaplar oluşturur.
Tamamlanma, ürün gerçeği ile eşleşmelidir.
Engelleyici ve engellemeyen adımları açık bir şekilde tanımlayın
Engelleyici ve engellemeyen adımları açık bir şekilde tanımlayın
Örneğin şunu kararlaştırabilirsiniz:
Tamamlanmadan önce engelleyici:
- tenant kaydı oluşturuldu
- sahip hesabı oluşturuldu
- faturalama müşterisi sağlandı
- gereken roller oluşturuldu
- minimum tohum verileri yüklendi
Tamamlandıktan sonra engellemeyen:
- karşılama e-postası gönderildi
- analitik olayı teslim edildi
- isteğe bağlı şablonlar yüklendi
- özel alan adı doğrulandı
Bu hem bir ürün kararı hem de bir teknik karar olarak değerlidir.
Eğer bunu açık bir şekilde tanımlamazsanız, mühendislerin her biri kendi varsayımlarını yapar ve iş akışı zamanla tutarsız hale gelir.
Tamamlanma denetlenebilir olmalıdır
Tamamlanma denetlenebilir olmalıdır
Onboarding, bir müşterinin ücretli ürün özelliklerine erişim hakkını değiştirdiğinde, tamamlanma bir denetim izi bırakmalıdır.
Ne zaman iş akışının tamamlandığını bilmeniz gerekir:
- iş akışı ne zaman tamamlandı
- hangi sürüm iş akışı mantığının çalıştığı
- tamamlanmanın otomatik mi yoksa operatör yardımıyla mı olduğu
- hala bekleyen engellemeyen adımlar nelerdi
Bu, özellikle B2B SaaS ürünleri için önemlidir; çünkü destek, faturalama ve başarı takımları aynı tenant yaşam döngüsüne önem verir.
Güçlü ama aşırı inşa edilmemiş pratik bir Laravel uygulama yolu
Güçlü ama aşırı inşa edilmemiş pratik bir Laravel uygulama yolu
Ağır bir orkestrasyon platformuna hemen ihtiyacınız yok. Ancak denetleyici yapıştırması ve arka planda umutlarından daha fazla yapıya ihtiyacınız var.
Pratik bir kurulum şöyle görünür:
Bu bileşenlerle başlayın
Bu bileşenlerle başlayın
tenant_onboardingstablosu, iş akışı düzeyindeki durumu elde etmek içintenant_onboarding_stepstablosu, adım düzeyinde takibi sağlamak için- iş akışını ilerletmek için bir koordine sınıfı
- koordinatöre güvenli bir şekilde yeniden giren bir iş
- açık sonuç tiplerine sahip adım sınıfları
- denetim için iç görünürlük
Bu, en başta çoğu değeri sunar.
Eğer karmaşıklık artarsa, bunları ekleyin
Eğer karmaşıklık artarsa, bunları ekleyin
Onboarding genişledikçe ekleyin:
- adım bağımlılığı kuralları
- adım türü başına tekrar deneme geri alma politikaları
- adımlar değiştikçe iş akışının versiyonlaması
- harici sistemler için webhook veya polling tamamlama kancaları
- devam, atla veya iptal için operatör kontrolleri
- iş akışları çok uzun süre boyunca stuck kaldığında uyarılar
Bu, denetleyici aksiyondan dev bir iş akışı motoruna zıplamak yerine daha iyi bir büyüme yoludur; çünkü kimsenin anlamadığı bir motor.
Alan mantığını denetleyici katmanına aşırı serileştirmeyin
Alan mantığını denetleyici katmanına aşırı serileştirmeyin
Denetleyiciyi küçük tutun.
public function store(CreateTenantRequest $request, StartTenantOnboarding $start)
{
$onboarding = $start->handle(->validated());
return response()->json([
=> $onboarding->id,
=> $onboarding->status,
], 202);
}
Bu 202 Accepted değeri anlam kazanıyor. Bu, onboarding’in başlatıldığını, tamamlanmadığını iletir.
Bu, 201 Created dönmekten çok daha sağlıklı bir sözleşmedir; çünkü tüm sistemin bittiğini yalan söylemez.
Gelecekte acıyı kurtaran kural
Gelecekte acıyı kurtaran kural
Laravel’de tenant onboarding, “bir kaydı oluşturmak” yerine “izlenen bir tahsis süreci çalıştırmak” gibi hissettirmelidir.
Bu değişiklik, daha ağır bir görünüm sunsa da, ürün gerçek hale geldiğinde sistemi daha basit tutar.
Bir pratik kural isterseniz, şunu kullanın:
Tenant oluşturma anında birden fazla asenkron veya harici bağımlı adım ile etkileşime girdiğinde, bunu bir denetleyici aksiyonu olarak modellemeyi bırakın.
Bunu açık durum, izleme adımları, tekrar denemeler ve operatör görünürlüğü olan bir iş akışı olarak modelleyin.
Çünkü tahsisler nadiren bir anda başarısız olur. Yarım kalan bir durumda başarısız olurlar. Ve eğer sisteminizin yarı yolda güvenilir bir hikayesi yoksa, onboarding borçları hemen birikmeye başlar.
Kaynak: Orijinal Makale
- Denetleyici-aksiyon versiyonu, tahsis dağınık hale gelene kadar çalışır
- Bir iş akışı modeli, gerçeği depolamak için bir yer sağlar
- Onboarding’i farklı hata anlamsalara sahip izlenen adımlara ayırın
- Doğru yürütme modeli, orkestrasyon değil, denetleyici yapıştırmasıdır
- Harici sistemleri nihayetinde başarılı, nihayetinde başarısız veya nihayetinde manuel olarak ele alın
- Modellenmesi gereken üç harici sonuç
- Örnek: faturalama artı alan adı adımları
- Manuel gözden geçirme, mimari bir başarısızlık değildir
- Vaka çalışması dersi: kısmi başarı gizleme değil, kurtarma yolları gerektirir
- İyi bir iş akışı burada ne yapmanıza izin verir
- Kurtarma, üretim acısı bunu zorlamadan önce tasarlanmalıdır
- Operatör görünürlüğü ürünün bir parçasıdır, bir düşünce değil
- İş akışını “tamamladı” demek için kesin tutun
- Güçlü ama aşırı inşa edilmemiş pratik bir Laravel uygulama yolu
- Bu bileşenlerle başlayın
- Eğer karmaşıklık artarsa, bunları ekleyin
- Alan mantığını denetleyici katmanına aşırı serileştirmeyin
- Gelecekte acıyı kurtaran kural


