Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce sistemin gereksinimlerini karşıladığınızdan emin olmalısınız. Modern bir Laravel projesi için PHP 8.2+ sürümü ve veritabanı olarak MySQL veya PostgreSQL önerilir.
- Laravel 11.x kurulu bir proje.
- Composer paket yöneticisi.
- Veritabanı bağlantısı yapılandırılmış bir ortam.
Sistemin çalışması için kullanıcı tablosuna referans kodunu tutacak bir alan eklememiz gerekecek. Terminal üzerinden şu komutla migration dosyasını oluşturabilirsiniz:
php artisan make:migration add_referral_code_to_users_table --table=users
Veritabanı Yapılandırması ve İlişkiler
Kullanıcıların birbirini davet edebilmesi için users tablosunda bir referral_code ve kim tarafından davet edildiğini tutan referred_by sütunlarına ihtiyacımız vardır. Bu yapı, veritabanı seviyesinde "self-referencing" (kendi kendine referans) ilişkisi kurmamızı sağlar.
// Migration dosyanızın içeriği
public function up(): void
{
Schema::table('users', function (Blueprint $table) {
$table->string('referral_code')->unique()->nullable();
$table->foreignId('referred_by')->nullable()->constrained('users')->onDelete('set null');
});
}
Bu yapı sayesinde her kullanıcının benzersiz bir kodu olacak ve sistem, yeni üyenin hangi kullanıcı üzerinden geldiğini referred_by sütunu ile takip edebilecektir.
Benzersiz Referans Kodlarının Oluşturulması
Kullanıcı kaydolduğunda veya profil oluşturduğunda otomatik bir referans kodu atamak için Laravel'in Model Events özelliğini kullanmak en temiz yoldur. User modelinde booted metodunu kullanarak bu işlemi otomatize edebiliriz.
protected static function booted()
{
static::creating(function ($user) {
$user->referral_code = strtoupper(bin2hex(random_bytes(4)));
});
}
Bu kod bloğu, kullanıcı veritabanına kaydedilmeden hemen önce rastgele 8 karakterli bir string oluşturur. Güvenlik için random_bytes fonksiyonunu kullanmak, tahmin edilemezlik sağlar.
Davet Linki ve Yönlendirme Mantığı
Kullanıcıların paylaşacağı davet linki, referans kodunu URL parametresi olarak almalıdır. Örneğin: site.com/kayit?ref=ABC12345. Bu parametreyi yakalamak için Laravel'in Request sınıfını kullanacağız.
// RegisterController.php içindeki kayıt metodu
public function register(Request $request)
{
$referredByCode = $request->query('ref');
$referrer = User::where('referral_code', $referredByCode)->first();
User::create([
'name' => $request->name,
'email' => $request->email,
'password' => Hash::make($request->password),
'referred_by' => $referrer ? $referrer->id : null,
]);
}
Burada $request->query('ref') ile URL'deki kodu alıyoruz. Eğer kod geçerliyse, o kullanıcının ID'sini referred_by sütununa yazıyoruz. Eğer kod geçersizse veya yoksa, bu alan boş kalıyor.
Referans Performansının Karşılaştırılması
Referans sistemlerinde farklı yöntemler tercih edilebilir. Aşağıdaki tablo, farklı yaklaşımların avantaj ve dezavantajlarını özetler:
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| URL Parametresi | Kolay uygulanır, SEO dostu. | Kullanıcı URL'yi değiştirebilir. |
| Çerez (Cookie) | Kullanıcı kaydı erteleyebilir. | Gizlilik yasaları ve tarayıcı kısıtlamaları. |
| Kayıt Formu Kodu | Kesin sonuç verir. | Kullanıcı kodu girmeyi unutabilir. |
Güvenlik ve Validasyon Uyarıları
Kritik Güvenlik Uyarısı: Referans sistemlerinde "self-referral" (kendi kendini referans gösterme) saldırılarına karşı dikkatli olunmalıdır. Kullanıcının kendi referans kodunu kullanmasını engellemek için validasyon kurallarınızda
not_inveya özel bir kural tanımlayın. Ayrıca, API üzerinden gelen referans isteklerini mutlakarate limitingile sınırlayın.
Kullanıcının kendi kodunu kullanmasını engellemek için şu validasyon kuralını ekleyebilirsiniz:
$request->validate([
'referral_code' => ['nullable', Rule::notIn([$currentUser->referral_code])],
]);
Sıkça Sorulan Sorular
Referans kodları neden benzersiz olmalı?
Veritabanında referans takibinin sağlıklı yapılabilmesi için her kodun tek bir kullanıcıyı işaret etmesi gerekir. Çakışmaları önlemek için veritabanında unique kısıtlaması kullanmak zorunludur.
Referans sistemini nasıl test edebilirim?
Laravel'in Feature Test yeteneklerini kullanarak farklı senaryoları (geçerli kod, geçersiz kod, kodsuz kayıt) simüle eden test sınıfları oluşturabilirsiniz.
Kullanıcılar referanslarını nasıl görebilir?
User modeline public function referrals() { return $this->hasMany(User::class, 'referred_by'); } ilişkisini ekleyerek, bir kullanıcının davet ettiği kişileri listeleyebilirsiniz.
Referans sistemi için ödül mekanizması nasıl kurulur?
Kullanıcı kaydı tamamlandığında bir Event tetikleyerek, referans olan kullanıcıya puan veya bakiye tanımlayan bir Listener yazabilirsiniz.
URL parametreleri yerine ne kullanılabilir?
Daha profesyonel bir deneyim için /davet/kullanici-adi gibi slug tabanlı yönlendirmeler kullanabilirsiniz.
Referans Sistemlerinde Performans Optimizasyonu ve İndeksleme
Referans sistemleri, kullanıcı sayısı arttıkça veritabanı sorgularında ciddi bir yük oluşturmaya başlar. Özellikle referral_code sütunu üzerinden yapılan aramalar, doğru indekslenmediği takdirde uygulamanızın yavaşlamasına neden olur. Veritabanı seviyesinde performans almak için mutlaka indeksleme stratejisi uygulamalısınız.
Migration dosyanızda veya mevcut tablonuzda referans koduna indeks eklemek, arama hızını O(1) seviyesine yaklaştıracaktır:
Schema::table('users', function (Blueprint $table) {
$table->index('referral_code');
});
Ayrıca, referans sayısını her seferinde count() fonksiyonu ile hesaplatmak yerine, referral_count adında bir sütun tutarak bu değeri event-listener yapısı ile güncellemek, büyük ölçekli sistemlerde CPU kullanımını ciddi oranda düşürür.
Sistem Hata Ayıklama ve Loglama Stratejileri
Referans sistemlerinde en sık karşılaşılan sorunlar; geçersiz referans kodları, çerez (cookie) çakışmaları ve kayıt sırasında tetiklenmeyen ödül mekanizmalarıdır. Bu süreçleri izlemek için Laravel'in Log facade yapısını kullanmak, sistemin sağlığını korumanıza yardımcı olur.
Kayıt sürecinde referansın geçersiz olması durumunda veya ödül tanımlama aşamasında oluşabilecek hataları yakalamak için şu yapıyı kullanabilirsiniz:
try {
if ($request->has('ref')) {
$referrer = User::where('referral_code', $request->ref)->first();
if (!$referrer) {
Log::warning('Geçersiz referans kodu denemesi: ' . $request->ref);
}
}
} catch (\Exception $e) {
Log::error('Referans sistemi hatası: ' . $e->getMessage());
}
Ayrıca, geliştirme aşamasında Laravel Telescope kullanarak hangi referans kodunun hangi kullanıcıyı getirdiğini, kayıt formunun hangi parametrelerle gönderildiğini anlık olarak takip etmeniz, hata ayıklama sürenizi %50 oranında kısaltacaktır.
Ölçeklenebilir Ödül Dağıtımı İçin İleri İpuçları
Referans sisteminiz büyüdüğünde, ödül dağıtımını senkron (anlık) yapmak yerine asenkron (kuyruk sistemi) ile yönetmek, kullanıcı deneyimini iyileştirir. Kullanıcı kayıt olduğu anda ödülün hemen tanımlanması yerine, Job sınıflarını kullanarak arka planda işlenmesini sağlayın.
Örnek bir kuyruk işi (Job) yapısı:
namespace App\Jobs;
class ProcessReferralReward implements ShouldQueue
{
public function handle()
{
// Ödül tanımlama mantığı burada çalışır
// Örneğin: $this->referrer->increment('points', 50);
}
}
Bu yaklaşım sayesinde, veritabanı yoğunluğu yaşansa bile kullanıcı kayıt işlemi kesintiye uğramaz ve ödül tanımlama süreci sistem kaynaklarını tüketmeden arka planda tamamlanır.
Sonuç
Laravel ile dinamik bir referans sistemi kurmak, veritabanı ilişkilerini doğru kurgulamaktan ve kullanıcı kayıt sürecini güvenli bir şekilde yönetmekten geçer. Bu rehberde öğrendiğiniz yöntemleri kullanarak, uygulamanızın büyüme oranlarını takip edebilir ve kullanıcılarınıza ödül sistemleri entegre edebilirsiniz. Bir sonraki adım olarak, referans başarısını ölçen bir "Dashboard" (gösterge paneli) oluşturmayı düşünebilirsiniz.
Yasal Sorumluluk Reddi: Bu rehberdeki kodlar eğitim amaçlıdır. Üretim ortamına almadan önce tüm girdileri sanitize etmeyi, SQL injection ve XSS saldırılarına karşı Laravel'in yerleşik korumalarını kullanmayı unutmayın. Finansal ödül içeren sistemlerde vergi ve hukuk mevzuatına uygunluk için bir uzmana danışmanız önerilir.


Yorumlar (0)
Yorum Yaz