Laravel İle Dinamik Bir Kullanıcı Yorum Ve Puanlama Modülü Nasıl Yapılır?

Laravel İle Dinamik Bir Kullanıcı Yorum Ve Puanlama Modülü Nasıl Yapılır?
Laravel İle Dinamik Bir Kullanıcı Yorum Ve Puanlama Modülü Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce sisteminizde Laravel 11 veya üzeri bir sürümün kurulu olduğundan emin olmalısınız. Ayrıca veritabanı yönetimi için MySQL veya PostgreSQL kullanmanız önerilir. Geliştirme ortamınızda PHP 8.3+ sürümünün aktif olması, performans ve güvenlik açısından kritik öneme sahiptir.

  • Laravel 11+ Framework
  • Composer (PHP paket yöneticisi)
  • Veritabanı (MySQL 8.0+)
  • Node.js ve NPM (Frontend varlıkları için)

Veritabanı Tasarımı ve Migration İşlemleri

Yorum ve puanlama verilerini saklamak için ilişkisel bir yapı kurmalıyız. reviews adında bir tablo oluşturacağız. Bu tablo, kullanıcı ve puanlanan içerik (örneğin Product modeli) ile bağlantılı olmalıdır.

php artisan make:migration create_reviews_table

Oluşturulan migration dosyasını aşağıdaki şekilde düzenleyerek veritabanı şemasını tanımlayın. Burada rating alanı için 1 ile 5 arasında bir tam sayı kısıtlaması ekleyeceğiz.

public function up(): void
{
    Schema::create('reviews', function (Blueprint $table) {
        $table->id();
        $table->foreignId('user_id')->constrained()->onDelete('cascade');
        $table->foreignId('product_id')->constrained()->onDelete('cascade');
        $table->text('comment');
        $table->unsignedTinyInteger('rating')->default(5); // 1-5 arası puan
        $table->timestamps();
    });
}
Güvenlik Uyarısı: Veritabanı seviyesinde onDelete('cascade') kullanmak, kullanıcı silindiğinde yorumlarının da otomatik olarak temizlenmesini sağlar. Bu, veri tutarlılığı için önemlidir ancak kritik verilerde "soft delete" (yumuşak silme) tercih edilmelidir.

Model İlişkilerinin Kurulması

Laravel'in Eloquent ORM yapısını kullanarak modeller arası bağlantıları kurmalıyız. Product modeli ile Review modeli arasında "bire-çok" (one-to-many) ilişkisi mevcuttur.

// Product.php modeli içerisinde
public function reviews()
{
    return $this->hasMany(Review::class);
}

// Review.php modeli içerisinde
public function user()
{
    return $this->belongsTo(User::class);
}

Bu tanımlamalar, bir ürünün tüm yorumlarını $product->reviews şeklinde kolayca çekmemize olanak tanır.

Yorum ve Puanlama İçin Form Yönetimi

Kullanıcıların puan gönderebilmesi için bir form oluşturmalıyız. Formda CSRF (Cross-Site Request Forgery) koruması kullanmak, Laravel uygulamalarında zorunludur. Aşağıdaki örnekte, Blade şablon motoru ile basit bir form yapısı görülmektedir.


    @csrf
    
        @for($i = 1; $i validate([
        'comment' => 'required|string|max:1000',
        'rating' => 'required|integer|between:1,5',
    ]);

    $product->reviews()->create([
        'user_id' => auth()->id(),
        'comment' => $validated['comment'],
        'rating' => $validated['rating'],
    ]);

    return back()->with('success', 'Yorumunuz başarıyla eklendi.');
}

Bu kod bloğu, veriyi temizler ve sadece izin verilen formatta veritabanına kaydeder.

Yöntem Karşılaştırması

Yöntem Avantaj Dezavantaj
Senkron (Form Post) Basit, SEO dostu Sayfa yeniden yüklenir
Asenkron (AJAX/Axios) Daha iyi kullanıcı deneyimi Daha karmaşık hata yönetimi

Sıkça Sorulan Sorular

Yorumları nasıl onaylı hale getirebilirim?

Veritabanına is_approved adında bir boolean (mantıksal) sütun ekleyerek, varsayılan değeri false yapabilir ve admin panelinden onay mekanizması kurabilirsiniz.

Puan ortalamasını nasıl hesaplarım?

Eloquent'in avg() metodunu kullanabilirsiniz: $product->reviews()->avg('rating');

Kullanıcının birden fazla yorum yapmasını nasıl engellerim?

Controller içerisinde updateOrCreate metodunu kullanabilir veya form göndermeden önce where('user_id', auth()->id())->exists() kontrolü yapabilirsiniz.

Yorumlarda XSS saldırılarını nasıl önlerim?

Blade şablon motoru, {{ $comment }} sözdizimi ile veriyi otomatik olarak kaçış (escape) işleminden geçirir. Bu sayede XSS saldırıları engellenmiş olur.

Performans için ne yapmalıyım?

Çok fazla yorum olan sayfalarda paginate() metodunu kullanarak verileri parçalar halinde çekmeniz, sunucu yükünü ciddi oranda düşürecektir.

Sorumluluk Reddi: Bu makalede paylaşılan kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce mutlaka bir güvenlik denetiminden geçirin ve kullanıcı girişlerini her zaman doğrulayın.

Yorum ve Puanlama Modülü İçin Birim ve Özellik Testleri

Dinamik bir sistemde, kullanıcıların yorum yapma ve puanlama süreçlerinin hatasız işlemesi için test odaklı geliştirme (TDD) yaklaşımını benimsemek kritik öneme sahiptir. Laravel'in sunduğu Pest veya PHPUnit araçlarını kullanarak, yorum gönderme işlemlerini otomatik olarak doğrulayabilirsiniz.

Aşağıdaki örnekte, bir kullanıcının yorum yapma yetkisini ve veritabanına kayıt sürecini test eden temel bir senaryo yer almaktadır:

public function test_user_can_post_a_comment()
{
    $user = User::factory()->create();
    $product = Product::factory()->create();

    $response = $this->actingAs($user)->post('/comments', [
        'product_id' => $product->id,
        'comment' => 'Harika bir ürün, çok memnun kaldım.',
        'rating' => 5
    ]);

    $response->assertStatus(302);
    $this->assertDatabaseHas('comments', [
        'user_id' => $user->id,
        'rating' => 5
    ]);
}

Yorum Sistemine "Beğeni" Özelliği Ekleme

Kullanıcı etkileşimini artırmak için yorumlara "Faydalı" veya "Beğen" butonları eklemek, içeriğin kalitesini belirlemek adına harika bir yöntemdir. Bunun için likes adında yeni bir tablo oluşturabilir ve Comment modeli ile Many-to-Many (Çoka-Çok) ilişki kurabilirsiniz.

İlişki Kurulumu ve Mantık

Öncelikle Comment modelinize beğeni ilişkisini şu şekilde ekleyin:

// Comment.php Modeli içerisinde
public function likes()
{
    return $this->hasMany(Like::class);
}

public function isLikedBy(User $user)
{
    return $this->likes()->where('user_id', $user->id)->exists();
}

Bu yapı sayesinde, Blade şablonunuzda kullanıcının yorumu beğenip beğenmediğini kolayca kontrol edebilirsiniz:

@if($comment->isLikedBy(auth()->user()))
    Beğendin
@else
    Beğen
@endif

Yorumların Gerçek Zamanlı (Real-time) Güncellenmesi

Sayfayı yenilemeden yorumların listeye eklenmesini sağlamak için Laravel Echo ve Pusher teknolojilerini kullanabilirsiniz. Bu, özellikle canlı yayınlar veya anlık geri bildirim gerektiren ürün sayfaları için kullanıcı deneyimini zirveye taşır.

  1. Event Oluşturun: php artisan make:event CommentPosted komutu ile bir event oluşturun.
  2. Broadcasting: Event sınıfınızda ShouldBroadcast arayüzünü implemente edin.
  3. Frontend Entegrasyonu: Laravel Echo kullanarak kanalı dinleyin ve yeni yorumu DOM'a JavaScript ile ekleyin.

Bu yaklaşım, sunucu üzerindeki yükü azaltırken kullanıcılara akıcı bir arayüz sunmanıza olanak tanır. Özellikle Broadcast işlemlerinde, veritabanı sorgularının optimize edilmiş olduğundan emin olun.

Sonuç

Laravel ile dinamik bir yorum ve puanlama modülü oluşturmak, uygulamanızın etkileşim kapasitesini artırmanın en etkili yoludur. Bu rehberde; veritabanı tasarımı, model ilişkileri, form yönetimi ve veri doğrulama aşamalarını adım adım inceledik. Bir sonraki adım olarak, yorumlara "beğeni" (like) özelliği ekleyerek modülünüzü daha da interaktif hale getirebilirsiniz.

Bu yazıya tepkinizi paylaşın:
Mert Çelik

Hobi ve teknik beceriler üzerine eğitici içerikler kurguluyorum. Okuyucuların günlük hayatta karşılaştığı sorunlara uygulanabilir çözümler sunmayı hedefliyorum.

Yorumlar (0)

Yorum Yaz