Laravel İle Dinamik Bir Etkinlik Katılım Yönetim Sistemi Nasıl Yapılır?

Laravel İle Dinamik Bir Etkinlik Katılım Yönetim Sistemi Nasıl Yapılır?
Laravel İle Dinamik Bir Etkinlik Katılım Yönetim Sistemi Nasıl Yapılır?

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.

Bu yazıya tepkinizi paylaşın:
Zeynep Sönmez

Dijital içerik üretimi ve teknik rehber hazırlama süreçlerinde uzmanlaşmış bir editörüm. Okuyucuların hayatını kolaylaştıran, adım adım uygulanabilir kılavuzlar yazmayı hedefliyorum.

Yorumlar (16)

16
okuyucu bu yazı hakkında yorum yaptı. Siz de deneyiminizi paylaşarak diğer okuyuculara yardımcı olabilirsiniz.
Caner Aksoy
Caner Aksoy 28 Temmuz 2026

Zeynep hocam ağzına sağlık, çok açıklayıcı olmuş. Özellikle Eloquent ilişkilerini kurarken sürekli hata alıyordum, bu yazı sayesinde çözdüm mantığı.

Zeynep Sönmez
Zeynep Sönmez 29 Temmuz 2026

Rica ederim Caner, Eloquent'in o ilişki yapısını bir kere oturtunca sonrası çok daha hızlı akıyor. Başarılar!

Selin Yılmaz
Selin Yılmaz 30 Temmuz 2026

Ya ben bu kapasite yönetimini event listener ile çözmeye çalışıyodum senin yöntem çok daha temizmiş. Eline sağlık.

Kerem Deniz
Kerem Deniz 31 Temmuz 2026

Aynen, bende çok kafa patlatmıştım event tarafında ama bu rehber ilaç gibi geldi.

Burak Öz
Burak Öz 01 Ağustos 2026

Harika bir yazı olmuş. Peki bunu Livewire ile entegre etsek çok mu karmaşıklaşır? Performans tarafında sorun yaşar mıyım?

Zeynep Sönmez
Zeynep Sönmez 02 Ağustos 2026

Kesinlikle karmaşıklaşmaz, aksine çok daha modern bir kullanıcı deneyimi sunarsınız. Doğru cache yönetimiyle performans sorunu da yaşamazsınız.

Merve K.
Merve K. 03 Ağustos 2026

Kod bloklarını kopyalayıp çalıştırdım fakat veritabanı migration kısmında hata aldım. Sütun isimleri mi değişti acaba?

Zeynep Sönmez
Zeynep Sönmez 04 Ağustos 2026

Merve merhaba, Laravel sürüm farkından kaynaklı olabilir. Kullandığın versiyonu kontrol edip bir hata ekranı paylaşırsan yardımcı olabilirim.

Hakan Demir
Hakan Demir 04 Ağustos 2026

Güzel yazı, eline sağlık. Yalnız kod örneklerinde daha fazla yorum satırı olsa yeni başlayanlar için daha iyi olurmuş sanki.

Ayşe Arda
Ayşe Arda 05 Ağustos 2026

Katılıyorum, kodlar biraz hızlı geçilmiş gibi ama yine de çok öğretici.

Zeynep Çelik
Zeynep Çelik 05 Ağustos 2026

Sistemi kurdum gayet güzel çalışıyor. Sormak istediğim şey şu, çoklu kayıt durumunda lock mekanizmasını nasıl en optimize şekilde kullanabiliriz?

Zeynep Sönmez
Zeynep Sönmez 06 Ağustos 2026

Database transaction'ları ve 'select for update' kullanarak race condition durumlarını engelleyebilirsin. İleriki yazılarda buna detaylı değineceğim.

Emre Güler
Emre Güler 05 Ağustos 2026

Laravel kullanıyom ama bu kadar detaylı etkinlik sistemi hiç yapmamıştım. Çok yararlı oldu, teşekkürler.

Derya Şen
Derya Şen 06 Ağustos 2026

Laravel öğrenme sürecindeyim, bu tarz proje bazlı anlatımlar çok işime yarıyor. Başka projeler de bekliyoruz!

Oğuzhan Kaya
Oğuzhan Kaya 06 Ağustos 2026

Yazı güzelde sanki veritabanı şeması biraz daha sade olabilirdi. Yine de teşekkürler.

Fatih Y.
Fatih Y. 07 Ağustos 2026

Baya başarılı olmuş, eline sağlık. Özellikle kapasite yönetimi kısmı tam aradığım şeydi.

Yorum Yaz