Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Yazı Tipi BoyutlandırıcıAa
  • Anasayfa
  • Teknoloji
    • Siber Güvenlik
    • Yapay Zeka
    • Donanım
    • Bilim
  • Yazılım
  • Savunma & İstihbarat
  • Oyun
  • Yaşam
    • Finans
    • Sinema
    • Dünyadan Haberler
  • İş Birliği
Okuma: Laravel’da Paylaşımlı Veritabanı Çoklu Kiracılık: Temel Katman
Paylaş
Yazı Tipi BoyutlandırıcıAa
Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Ara
Bizi Takip Et
  • Hakkımızda
  • Gizlilik politikası
  • Tanıtım Yazısı ve Backlink Hizmeti
© 2026 Teknomers. All Rights Reserved.

Anasayfa » Laravel’da Paylaşımlı Veritabanı Çoklu Kiracılık: Temel Katman

Yazılım

Laravel’da Paylaşımlı Veritabanı Çoklu Kiracılık: Temel Katman

teknomers
Son güncelleme: 28 Temmuz 2026 05:14
teknomers
Paylaş
Paylaş


Özet

  • Shared-database çoklu kiracılık = bir veritabanı, her satır tenant_id ile etiketlenir, otomatik olarak filtreleyen bir global scope.
  • Üç hareketli parça: bir TenantContext singletonı, bir BelongsToTenant trait’i ve bileşik benzersizlik kısıtları.
  • Gerçek güvenlik ağı disiplin değil — bir CI testi, bir tenant_id tablosunun trait’i unuttuğunda (veya tersine) başarısız olur.

Bu hafta shared-database çoklu kiracılığının temel katmanını gönderdim. Yalnızca “bir satır bir kuruluşa aittir” özelliğini sağlayan kısmı yaptım ve bunu yanlış yapmayı zorlaştırdım. İşte yapısı.


Neden shared-database?

Üç geniş strateji bulunmaktadır. Hızlı bir karşılaştırma:

StratejiYalıtımOperasyon maliyetiİyi olduğu durumlar
Database-per-tenantEn güçlüEn yüksek (migrations × N)Az sayıda büyük kiracı, sıkı uyum
Schema-per-tenantGüçlüOrtaPostgres, orta kiracı sayısı
Shared DB + tenant_idEn zayıfEn düşükBirçok kiracı, tek kod tabanı, tek migration çalıştırma

Birden fazla kuruluşun tek bir kod tabanını paylaşacağı bir yeşil saha uygulaması için, shared-database sadelik açısından kazanır. Ancak tuzak şu: yalıtım artık sizin işiniz, uygulama kodunda zorunlu hale getirilmiştir. Bir where tenant_id = ? unutur ve bir kuruluş diğerinin verilerini görebilir. Bu yüzden bütün tasarım, bu durumu unutmayı imkansız hale getirmeye yöneliktir.


Bağlam Nesnesi

Her şey mevcut kiracıyı tek bir singleton’dan okur, istekten, oturumdan veya globalden değil. Bu, çözümleyicinin değiştirilebilir olmasını sağlar — konfigürasyon bazlı on-premise, alan bazlı SaaS — aşağıdaki hiçbir şeyi etkilemeden.

class TenantContext
{
    private ?Tenant $tenant = null;
    private bool $scopeDisabled = false;

    public function id(): ?int { return $this->tenant?->getKey(); }
    public function has(): bool { return $this->tenant instanceof Tenant; }

    public function shouldScope(): bool
    {
        return ! $this->scopeDisabled && $this->has();
    }

    public function withoutScope(Closure $callback): mixed
    {
        // gerçek birbirlerine ait çalışmalarda kapsamı askıya al, ardından geri yükle
    }
}
Full ekran moduna geç

Full ekran modundan çık

shouldScope()‘un false döndürmesi önemli: konsol başlatma, veritabanı doldurma ve erken testler, bir kiracı olmadan çalıştırılır. Kiracı yoksa filtrelemek için hiçbir şey yok — “null ile filtrele” değil.


Trait

Bir trait iki işi yapar: okuma sırasında global scope ekler, yazma sırasında tenant_id doldurur.

trait BelongsToTenant
{
    public static function bootBelongsToTenant(): void
    {
        $context = app(TenantContext::class);

        static::addGlobalScope('tenant', function (Builder $q) use ($context) {
            if (! $context->shouldScope()) return;
            $q->where($q->getModel()->getTable().'.tenant_id', $context->id());
        });

        static::creating(function ($model) use ($context) {
            if ($model->tenant_id === null && $context->has()) {
                $model->tenant_id = $context->id();
            }
        });
    }
    // ...
}
Full ekran moduna geç

Full ekran modundan çık

Tabloyu nitelikli kılan sütun (table.tenant_id) iki ilişkili tabloyu birleştirirken belirsiz sütun hatalarını önler.


Benzersizlik Kıvrımları

Shared-database altında, “benzersiz” ikiye ayrılır. Kiracıların yeniden kullanması gereken okunabilir bir tanımlayıcı, her kiracı için benzersiz olmalıdır. Bir güvenlik tokenı global olarak benzersiz kalmalıdır — burada bir çarpışma, bir saldırı yüzeyi değil, bir kullanıcı deneyimi aksaklığıdır.

Sütun türüKapsamaÖrnek
İnsan tanımlayıcılarıunique([tenant_id, x])üye numarası, fatura numarası, slug
UUID’lar & tokenlarGlobal benzersizqr token, idempotency anahtarı, gateway referansı

Kullanıcılar da merkezi bir öneme sahiptir: bir e-posta, bir giriş, birçok orga üye olarak dahil olma. Kişi kiracı kapsamına alınmaz; onların üyelikleri vardır.


Gerçekten Güvenli Olmanızı Sağlayan Kısım

Traitler ve kısıtlar uygulanmalarını aklınızda tutmak kadar iyidir. Bu yüzden güvenlik şeridi bir testtir, kontrol listesi değil:

it('her tablosu tenant_id olan modeli süzmelidir', function () {
        $missing = [];
        foreach (tenancyModelClasses() as $class) {
            $table = (new $class)->getTable();
            if (Schema::hasColumn($table, ) && ! usesBelongsToTenant($class)) {
                $missing[] = $class;
            }
        }
        expect($missing)->toBe([]); // CI başarısız olur ve suçluları adlandırır
    });
Full ekran moduna geç

Full ekran modundan çık

Bu test, hem trait’i unutan bir tenant_id tablosunu hem de sütunu unutan bir trait’i kontrol eder. Altı ay sonra yeni bir model ekleyin, trait’i unutun ve CI, incelemeden önce size haber verir.


Sonuç

Shared-database kiracılığı işletmesi ucuz ve sızdırması kolaydır. Çözüm, dikkatli olmak değil — “Bunu hatırladık mı?” sorusunu bir başarısız teste dönüştürmektir. Çözümleyici, kapsam ve benzersizlik hareketli parçalarıdır; güvenlik şeridi, gözlerinizi kapatmanızı sağlar.

Kaynak: Orijinal Makale

Üretimde PHP-FPM Neden Gerçek Kullanımdan Daha Fazla RAM Tüketir?
Laravel Filament Yönetim Paneli: AI Uygulamaları için Token Maliyetleri, İstem Yönetimi ve Temsilci Denetim İzleri
CodeIgniter ve Laravel: İnsan Odaklı Bir Karşılaştırma
Açık Kaynak CRM’i AI Tabanlı Hale Getirmek (Laravel/AI Üretimde)
Büyük Laravel Projelerini Nasıl Yapılandırıyorum (Kişisel Mimari Planım)
Bu Makaleyi Paylaş
Facebook Bağlantıyı Kopyala Yazdır
Paylaş
Önceki Makale CXMT’nin Şanghay IPO’su %466’lık sıçrama yaptı, DRAM’a odaklanacak
Sonraki Makale Lenovo RTX 5090 oyun dizüstü bilgisayarında 1.000 $ indirim!

Sanal Medya

FacebookBeğen
452Takip Et
PinterestSabitle
237Takip Et

Son Eklenenler

Lenovo RTX 5090 oyun dizüstü bilgisayarında 1.000 $ indirim!
Donanım
CXMT’nin Şanghay IPO’su %466’lık sıçrama yaptı, DRAM’a odaklanacak
Donanım
Michigan sakinleri, 24/7 gürültü çıkaran AI veri merkezine dava açtı
Donanım
Kritik: Hızlı Json RCE Sıfır Günü Saldırılarıyla ABD Şirketleri Tehditte!
Siber Güvenlik
Dario Amodei Çinli Yapay Zekadan Korkuyor, Açık Ağırlık Modellerine Karşı Değil
Genel
Google ve Bing’de Açığa Çıkan Özel Claude Sohbetleri
Genel
//

Siber güvenlik, yapay zeka ve savunma sanayiinden; finans ve sinema dünyasına uzanan geniş bir yelpaze. Teknomers; teknoloji, strateji ve yazılım dünyasını sade bir dille sizlerle buluşturuyor.

Kurumsal

  • Hakkımızda
  • Gizlilik politikası
  • Tanıtım Yazısı ve Backlink Hizmeti

Kategoriler

  • Teknoloji
  • Oyun
  • Sinema
  • Siber Güvenlik
  • Bilim
  • Finans
  • Dünyadan Güncel Haberler

Populer

  • TV'de Ücretsiz İzlenebilen Şifresiz Erotik Kanallar (2025 Güncel Frekans Listesi)

  • The Last of Us PC Kontrolleri: Hızlı Silah Değiştirme ve Tüm Tuşlar (2025)

  • Hogwarts Legacy'de Odaklanma İksiri Nasıl Yapılır?

Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Bizi Takip Et
© 2026 Teknomers. All Rights Reserved.
Welcome Back!

Sign in to your account

Kullanıcı Adı veya E-posta Adresi
Şifre

Şifrenizi mi unuttunuz?