Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce sisteminizde gerekli araçların kurulu olduğundan emin olmalısınız. 2026 yılı itibarıyla Laravel 12 veya üzeri sürümlerle çalışmanız önerilir.
- PHP 8.4 veya üzeri bir sürüm.
- Composer paket yöneticisi.
- Veritabanı olarak MySQL 8.0 veya PostgreSQL 16+.
- Laravel CLI (Artisan) komutlarına temel hakimiyet.
Kurulumu doğrulamak için terminalinizde php -v ve composer --version komutlarını çalıştırarak sürümlerin güncel olduğunu teyit edin.
Veritabanı Şeması ve Modellerin Oluşturulması
Etkinlik yönetim sistemimizin temelini veritabanı ilişkileri oluşturur. Bir kullanıcı birçok etkinliğe katılabilir, bir etkinlikte ise birçok kullanıcı bulunabilir. Bu "Çoktan Çoka" (Many-to-Many) ilişkiyi kurmak için bir ara tabloya ihtiyacımız vardır.
Aşağıdaki komutla modellerimizi ve migration (veritabanı göç) dosyalarımızı oluşturalım:
php artisan make:model Event -m
php artisan make:model Registration -m
Migration dosyasında etkinlik ve katılım tablolarını şu şekilde tanımlayarak veri bütünlüğünü sağlayın:
// database/migrations/xxxx_create_events_table.php
Schema::create('events', function (Blueprint $table) {
$table->id();
$table->string('title');
$table->text('description');
$table->dateTime('event_date');
$table->integer('capacity');
$table->timestamps();
});
// database/migrations/xxxx_create_registrations_table.php
Schema::create('registrations', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->foreignId('event_id')->constrained()->onDelete('cascade');
$table->timestamp('registered_at')->useCurrent();
});
İlişkilerin Tanımlanması
Laravel'in Eloquent ORM yapısını kullanarak modeller arasında ilişki kurmak, verileri sorgularken işimizi büyük oranda kolaylaştırır. User ve Event modellerinde ilişkileri belirtmeliyiz.
// app/Models/Event.php
public function attendees()
{
return $this->belongsToMany(User::class, 'registrations')
->withPivot('registered_at');
}
// app/Models/User.php
public function events()
{
return $this->belongsToMany(Event::class, 'registrations');
}
Katılım Mantığının Geliştirilmesi (Controller Katmanı)
Kullanıcıların bir etkinliğe katılması için bir kontrolcü (controller) oluşturmalıyız. Burada kapasite kontrolü yaparak "overbooking" (kapasite aşımı) hatalarını önleyeceğiz.
// app/Http/Controllers/RegistrationController.php
public function store(Request $request, Event $event)
{
$request->validate(['event_id' => 'required|exists:events,id']);
if ($event->attendees()->count() >= $event->capacity) {
return back()->with('error', 'Etkinlik kapasitesi dolmuştur.');
}
$event->attendees()->attach(auth()->id());
return back()->with('success', 'Kayıt başarılı!');
}
Güvenlik Uyarısı: Kullanıcı girişini doğrulamak için mutlaka auth() middleware'ini kullanın. Ayrıca, veritabanı işlemlerinde SQL Injection riskine karşı her zaman Eloquent veya Query Builder'ın sunduğu parametreli sorguları tercih edin.
Performans ve Veri Yönetimi Karşılaştırması
Etkinlik yönetim sistemlerinde veritabanı sorgularının optimize edilmesi, kullanıcı deneyimini doğrudan etkiler. Aşağıdaki tablo, farklı veri çekme yöntemlerinin avantajlarını göstermektedir:
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Eager Loading (with) | N+1 sorgu problemini çözer. | Bellek kullanımı artabilir. |
| Lazy Loading | Sadece ihtiyaç anında sorgular. | N+1 hatasına yol açabilir. |
Etkinlik Listeleme ve Dinamik Filtreleme
Kullanıcıların etkinlikleri kolayca bulabilmesi için dinamik bir filtreleme yapısı kurmalıyız. Laravel'in scope özelliğini kullanarak sorguları temiz tutabiliriz.
// app/Models/Event.php
public function scopeUpcoming($query)
{
return $query->where('event_date', '>', now());
}
// EventController.php
public function index()
{
$events = Event::upcoming()->paginate(10);
return view('events.index', compact('events'));
}
Sıkça Sorulan Sorular
Laravel'de N+1 sorgu problemi nedir?
Bir etkinlik listesi çekerken, her etkinlik için ayrı ayrı katılımcı sorgusu atılması durumudur. Bunu Event::with('attendees')->get() kullanarak tek sorguya indirebilirsiniz.
Kapasite yönetimini nasıl daha güvenli yaparım?
Veritabanı düzeyinde "transaction" (işlem) kullanarak, aynı anda iki kişinin son kontenjanı almasını engelleyebilirsiniz. DB::transaction bloğu bu konuda en güvenli yöntemdir.
Kullanıcı kayıtlarını nasıl dışa aktarabilirim?
Laravel Excel paketi ile Registration modelindeki verileri kolayca CSV veya Excel formatında dışa aktarabilirsiniz.
Etkinlik iptal edilirse ne yapmalıyım?
Veritabanında is_active gibi bir flag (bayrak) kullanabilir veya soft-delete (yumuşak silme) yöntemini tercih ederek veriyi tamamen silmeden pasife alabilirsiniz.
E-posta bildirimlerini nasıl yönetirim?
Laravel'in yerleşik Notification sistemini kullanarak, kullanıcı kayıt olduğunda otomatik onay maili gönderilmesini sağlayabilirsiniz.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamına (production) geçmeden önce tüm form girdilerini validate (doğrula) edin, XSS saldırılarına karşı Blade şablon motorunun otomatik kaçış (escaping) özelliklerini kullanın ve hassas verileri şifreleyin.
Etkinlik Yönetim Sisteminde Otomatik Test Süreçleri
Sistemin kararlılığını korumak ve kapasite yönetimi gibi kritik işlevlerin hatasız çalıştığından emin olmak için Laravel'in yerleşik test araçlarını kullanmalısınız. Özellikle aynı anda birden fazla kullanıcının bir etkinliğe katılması durumunda oluşabilecek "race condition" (yarış durumu) hatalarını engellemek için Feature testleri yazmak hayati önem taşır.
Aşağıdaki örnek, bir kullanıcının etkinlik kapasitesi dolduğunda kayıt olamadığını doğrulayan bir test senaryosudur:
public function test_user_cannot_register_when_capacity_is_full()
{
$event = Event::factory()->create(['capacity' => 1]);
$user1 = User::factory()->create();
$user2 = User::factory()->create();
// İlk kullanıcı kayıt olur
$this->actingAs($user1)->post('/events/' . $event->id . '/register');
// İkinci kullanıcı kayıt olmaya çalışır
$response = $this->actingAs($user2)->post('/events/' . $event->id . '/register');
$response->assertStatus(422); // Kapasite dolu hatası
$this->assertDatabaseMissing('event_user', ['user_id' => $user2->id]);
}
Sistem Performansını Optimize Etme ve Önbellekleme
Etkinlikleriniz çok sayıda ziyaretçi alıyorsa, veritabanı üzerindeki yükü azaltmak için Laravel'in önbellekleme (caching) mekanizmalarını devreye almalısınız. Özellikle etkinlik listeleme sayfaları gibi sık erişilen ancak nadir güncellenen veriler için Cache facade'i mükemmel bir çözümdür.
Redis ile Sorgu Önbellekleme
Etkinlik listesini her seferinde veritabanından çekmek yerine, belirli bir süre boyunca önbellekte tutarak sunucu yanıt süresini milisaniyelere indirebilirsiniz:
public function index()
{
$events = Cache::remember('upcoming_events', 3600, function () {
return Event::where('start_date', '>=', now())->get();
});
return view('events.index', compact('events'));
}
Bu yaklaşım, yüksek trafikli anlarda veritabanınızın CPU kullanımını önemli ölçüde düşürecektir. Önbelleği temizlemek için ise etkinlik güncellendiğinde Cache::forget('upcoming_events') komutunu bir model observer içerisinde tetiklemeyi unutmayın.
İleri Düzey İpucu: Veritabanı İşlemlerinde Transaction Kullanımı
Kayıt işlemleri sırasında veritabanı tutarlılığını sağlamak için mutlaka DB::transaction bloğunu kullanın. Bu, kapasite kontrolü ile kayıt oluşturma arasında geçen sürede verinin bozulmasını engeller:
DB::transaction(function () use ($event, $user) {
$event->increment('registered_count');
$event->users()->attach($user->id);
});
Bu yöntem, sistemin atomik bir şekilde çalışmasını sağlar; yani ya her iki işlem de başarılı olur ya da sistem hiçbir değişiklik yapmadan işlemi geri alır (rollback).
Sonuç
Laravel ile dinamik bir etkinlik katılım yönetim sistemi kurmak, veritabanı ilişkileri ve sunucu tarafı mantığını birleştiren kapsamlı bir süreçtir. Bu rehberde, modeller arası ilişkileri kurmayı, kapasite kontrolü yapmayı ve temiz bir kod yapısı oluşturmayı öğrendiniz. Bir sonraki adım olarak, bu sisteme bir ödeme entegrasyonu eklemeyi veya etkinlikler için QR kod tabanlı bilet oluşturma modülünü geliştirmeyi deneyebilirsiniz.


Yorumlar (0)
Yorum Yaz