Gereksinimler ve Ön Hazırlık
Bu projeyi gerçekleştirmek için bilgisayarınızda PHP 8.2+, Laravel 11 ve kurulu bir veritabanı (MySQL veya PostgreSQL) bulunmalıdır. Ayrıca, ön uç (frontend) tarafında etkileşimleri yönetmek için Laravel ile varsayılan olarak gelen Vite yapılandırmasının aktif olması gerekmektedir.
- Laravel 11+ framework kurulumu.
- Veritabanı bağlantısının .env dosyasında tanımlanmış olması.
- Temel düzeyde Blade şablon motoru ve JavaScript bilgisi.
- Composer ve NPM paket yöneticilerinin güncel sürümleri.
Veritabanı Tasarımı ve Migration Oluşturma
Beğeni sistemi için çoktan çoğa (many-to-many) bir ilişki kurmamız gerekir. Bir kullanıcı birden fazla gönderiyi beğenebilir ve bir gönderi birden fazla kullanıcı tarafından beğenilebilir. Bunun için likes adında bir ara tablo oluşturacağız.
php artisan make:migration create_likes_table
Oluşturulan migration dosyasını aşağıdaki gibi düzenleyerek veritabanı şemasını tanımlayın. Bu yapı, veri bütünlüğünü sağlamak adına yabancı anahtar (foreign key) kısıtlamalarını içerir.
public function up(): void
{
Schema::create('likes', function (Blueprint $table) {
$table->id();
$table->foreignId('user_id')->constrained()->onDelete('cascade');
$table->foreignId('post_id')->constrained()->onDelete('cascade');
$table->timestamps();
// Aynı kullanıcının aynı gönderiyi birden fazla beğenmesini engelle
$table->unique(['user_id', 'post_id']);
});
}
Eloquent İlişkilerini Tanımlama
Model katmanında ilişkileri tanımlamak, veriye erişimi kolaylaştırır. User ve Post modelleri arasında likes tablosu üzerinden bir bağ kuracağız. Post.php modeline aşağıdaki metodu ekleyin.
public function likes()
{
return $this->hasMany(Like::class);
}
public function isLikedBy(User $user): bool
{
return $this->likes()->where('user_id', $user->id)->exists();
}
isLikedBy metodu, belirli bir kullanıcının gönderiyi beğenip beğenmediğini kontrol ederek arayüzde "Beğen" veya "Beğenmekten Vazgeç" butonlarını dinamik olarak göstermemizi sağlar.
Beğeni İşlemi İçin Controller Mantığı
Beğeni ekleme ve kaldırma işlemlerini tek bir endpoint üzerinden yönetmek, kodun sürdürülebilirliğini artırır. LikeController içerisinde toggle metodu ile işlemi gerçekleştireceğiz.
public function toggle(Post $post, Request $request)
{
$user = $request->user();
$like = $post->likes()->where('user_id', $user->id)->first();
if ($like) {
$like->delete();
return response()->json(['liked' => false]);
} else {
$post->likes()->create(['user_id' => $user->id]);
return response()->json(['liked' => true]);
}
}
Bu metod, eğer beğeni varsa siler (toggle off), yoksa oluşturur (toggle on). JSON yanıtı dönerek JavaScript tarafının güncellenmesini sağlar.
Asenkron İşlemler İçin Frontend Entegrasyonu
Sayfa yenilenmeden beğeni işleminin gerçekleşmesi için Axios kullanacağız. Blade dosyanızda basit bir buton yapısı kurun ve JavaScript ile bu butona tıklanma olayını dinleyin.
{{ $post->isLikedBy(auth()->user()) ? 'Beğenildi' : 'Beğen' }}
async function toggleLike(postId) {
const response = await axios.post(`/posts/${postId}/like`);
const btn = document.getElementById(`like-btn-${postId}`);
btn.innerText = response.data.liked ? 'Beğenildi' : 'Beğen';
}
Bu kod bloğu, kullanıcı butona tıkladığında arka planda Laravel rotasına istek atar ve gelen yanıta göre buton metnini anlık olarak değiştirir.
Karşılaştırma: Beğeni Sistemi Yöntemleri
| Yöntem | Avantaj | Dezavantaj |
|---|---|---|
| Ajax/Axios | Hızlı, sayfa yenilenmez | JavaScript bağımlılığı |
| Livewire | PHP ile dinamik yapı | Sunucu yükü artabilir |
| Klasik Form | Basit, SEO uyumlu | Kötü kullanıcı deneyimi |
Güvenlik Uyarısı: Beğeni işlemlerinde mutlaka
authmiddleware kullanarak sadece giriş yapmış kullanıcıların işlem yapmasına izin verin. Ayrıca,CSRFkorumasını Axios isteklerinizde header olarak eklemeyi unutmayın.
Sıkça Sorulan Sorular
Aynı kullanıcı aynı gönderiyi iki kez beğenebilir mi?
Hayır, migration dosyasında tanımladığımız $table->unique(['user_id', 'post_id']) kısıtlaması, veritabanı seviyesinde mükerrer kayıtları engeller.
Beğeni sayısını nasıl canlı güncelleyebilirim?
Controller'dan dönen JSON yanıtına beğeni sayısını da ekleyerek (örneğin: ['liked' => true, 'count' => 15]), JavaScript tarafında DOM manipülasyonu ile sayıyı güncelleyebilirsiniz.
Bu sistem performansı etkiler mi?
Küçük ve orta ölçekli projelerde etkilemez. Ancak çok yüksek trafikli sitelerde likes tablosuna indeks eklemek ve Redis gibi bir önbellekleme mekanizması kullanmak performansı artıracaktır.
Mobil uyumluluk için ne yapmalıyım?
Butonlarınızın dokunmatik ekranlarda kolay tıklanabilir olması için CSS ile padding değerlerini optimize etmeli ve buton durumlarını görsel (renk değişimi gibi) olarak desteklemelisiniz.
Hata ayıklama (debug) nasıl yapılır?
Laravel'in Log::info() metodunu kullanarak isteklerin ulaşıp ulaşmadığını kontrol edebilir veya tarayıcı konsolunda (F12) Network sekmesinden gelen yanıtları inceleyebilirsiniz.
İleri Seviye Optimizasyon: Redis ile Beğeni Sayacı Yönetimi
Yüksek trafikli bir sosyal medya uygulamasında, her beğeni işlemi için veritabanına doğrudan yazma yapmak (SQL UPDATE sorguları), veritabanı üzerindeki yükü ciddi oranda artırır. Bu durumu optimize etmek için Redis gibi bir bellek içi veri deposu kullanarak beğeni sayılarını geçici olarak tutabilir ve belirli aralıklarla kalıcı veritabanına senkronize edebilirsiniz.
Redis Kullanarak Performans Artırma
Beğeni sayılarını Redis üzerinde tutmak, okuma işlemlerini milisaniyeler seviyesine indirir. Aşağıdaki örnekte, bir gönderi beğenildiğinde veritabanı yerine Redis'in increment özelliğini nasıl kullanacağınızı görebilirsiniz.
use Illuminate\Support\Facades\Redis;
public function toggleLike(Request $request, $postId)
{
$userId = auth()->id();
$redisKey = "post:{$postId}:likes";
// Redis üzerinde beğeni sayısını artır
$newCount = Redis::incr($redisKey);
// İşlemi veritabanına kuyruk (queue) ile gönder
UpdateLikeCountJob::dispatch($postId, $newCount);
return response()->json(['likes' => $newCount]);
}
Bu yöntemle, kullanıcının arayüzü anında güncellenirken, ağır veritabanı yazma işlemleri arka planda (Queue) yönetilmiş olur.
Beğeni Sistemi İçin Otomatik Test Stratejileri
Sistemin kararlılığını korumak için "Feature Test" yazmak kritik öneme sahiptir. Özellikle aynı kullanıcının mükerrer beğeni atıp atmadığını veya yetkisiz kullanıcıların işlem yapıp yapmadığını test etmelisiniz.
PHPUnit ile Beğeni Testi
Laravel'in sunduğu actingAs metodunu kullanarak, bir kullanıcının beğeni işlemini simüle edebilir ve veritabanındaki değişimleri doğrulayabilirsiniz.
public function test_user_can_like_a_post()
{
$user = User::factory()->create();
$post = Post::factory()->create();
$response = $this->actingAs($user)
->postJson("/api/posts/{$post->id}/like");
$response->assertStatus(200)
->assertJson(['status' => 'liked']);
$this->assertDatabaseHas('likes', [
'user_id' => $user->id,
'post_id' => $post->id,
]);
}
Bu test senaryosu, sistemin temel işlevini garanti altına alır. Ayrıca, test_user_cannot_like_same_post_twice gibi negatif test senaryoları ekleyerek sistemin hata yönetimini de test etmelisiniz.
Deployment ve Ölçeklendirme İpuçları
Uygulamanızı canlıya alırken (deployment), beğeni sisteminin ölçeklenebilir olduğundan emin olmalısınız. İşte dikkat etmeniz gereken temel noktalar:
- Database Indexing:
likestablosundakiuser_idvepost_idsütunlarına mutlakaindexekleyin. Aksi takdirde, tablo büyüdükçe sorgu süreleri logaritmik olarak artacaktır. - Rate Limiting: Kullanıcıların botlar aracılığıyla saniyede yüzlerce beğeni atmasını engellemek için Laravel'in
RateLimiterözelliğini kullanın. - CDN Kullanımı: Beğeni sayısını statik bir JSON yanıtı olarak dönüyorsanız, bu yanıtları kısa süreliğine CDN veya Cache üzerinde tutarak sunucu yükünü azaltabilirsiniz.
// Route üzerinde hız sınırlaması (Rate Limiting)
Route::post('/posts/{post}/like', [LikeController::class, 'store'])
->middleware('throttle:10,1'); // Dakikada en fazla 10 beğeni
Bu yapılandırmalar, sisteminizin sadece küçük projelerde değil, binlerce kullanıcının aynı anda aktif olduğu büyük ölçekli platformlarda da sorunsuz çalışmasını sağlayacaktır.
Sonuç
Laravel ile sosyal medya için dinamik bir beğeni sistemi kurmak, veritabanı ilişkileri ve asenkron istek yönetimi konularında yetkinlik kazanmanızı sağlar. Bu rehberde öğrendiğiniz yöntemleri, projenizin ihtiyaçlarına göre genişletebilir; örneğin beğenileri bildirim sistemine bağlayarak kullanıcı etkileşimini daha da artırabilirsiniz. Bir sonraki adım olarak, beğeni sayısını gerçek zamanlı güncellemek için Laravel Echo ve WebSockets teknolojilerini araştırmanızı öneririm.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamına almadan önce tüm girdileri doğrulamalı (validation) ve güvenlik testlerini yapmalısınız. Yazılım güvenliği, geliştiricinin sorumluluğundadır.


Yorumlar (0)
Yorum Yaz