Gereksinimler ve Ön Hazırlık
Sistemimizi geliştirmek için Laravel 11 veya üzeri bir sürüm kullanacağız. Modern bir geliştirme ortamı için aşağıdaki araçların yüklü olduğundan emin olmalısınız:
- PHP 8.2 veya üzeri
- Composer (PHP paket yöneticisi)
- MySQL veya PostgreSQL veritabanı
- Redis (Gerçek zamanlı işlemler ve kuyruk yönetimi için)
- Node.js ve NPM (Frontend varlıkları için)
Yeni bir Laravel projesi oluşturmak için terminalinizde composer create-project laravel/laravel stream-system komutunu çalıştırarak işe başlayabilirsiniz. Ardından .env dosyanızda veritabanı bağlantı bilgilerinizi güncellediğinizden emin olun.
Veritabanı Şeması ve Model Tasarımı
Dinamik bir akış için "Kullanıcılar", "İçerikler" ve "Takip İlişkileri" tablolarına ihtiyacımız var. Takip sistemi, çoktan çoğa (many-to-many) bir ilişki gerektirir. İlk adım olarak migration dosyalarımızı oluşturalım.
// Takip ilişkisi için migration dosyası
Schema::create('follows', function (Blueprint $table) {
$table->id();
$table->foreignId('follower_id')->constrained('users')->onDelete('cascade');
$table->foreignId('following_id')->constrained('users')->onDelete('cascade');
$table->timestamps();
});
Bu yapı, hangi kullanıcının kimi takip ettiğini tutar. onDelete('cascade') kuralı, bir kullanıcı silindiğinde tüm takip kayıtlarının otomatik temizlenmesini sağlar, bu da veri bütünlüğü için kritiktir.
İçerik Akışını Sorgulama ve Optimizasyon
Kullanıcının ana sayfasında sadece takip ettiği kişilerin içeriklerini göstermek için Eloquent ORM'in gücünden yararlanacağız. Content modelimiz ile User modelimiz arasında bir ilişki kurarak sorguyu optimize etmeliyiz.
// ContentController.php içerisinde akış sorgusu
public function index(Request $request)
{
$followingIds = $request->user()->following()->pluck('users.id');
return Content::whereIn('user_id', $followingIds)
->latest()
->paginate(20);
}
Burada pluck metodu ile sadece takip edilen kullanıcıların ID'lerini çekiyoruz. Ardından whereIn ile bu ID'lere ait içerikleri getiriyoruz. Performans için user_id sütununa veritabanı seviyesinde index eklemeyi unutmayın.
Gerçek Zamanlı Bildirimler İçin Laravel Reverb
2026 standartlarında bir yayın akışı, sayfa yenilemeye ihtiyaç duymadan yeni içeriklerin ekrana düşmesini gerektirir. Laravel Reverb, WebSocket sunucusu olarak bu ihtiyacı karşılar. Yayın akışına yeni bir içerik düştüğünde bunu broadcast (yayın) edelim.
// ContentCreated.php Event sınıfı
class ContentCreated implements ShouldBroadcast
{
public function broadcastOn(): Channel
{
return new PrivateChannel('feed.' . $this->userId);
}
}
Bu event tetiklendiğinde, ilgili kullanıcının tarayıcısına anlık olarak veri gönderilir. Bu sayede kullanıcılar, sayfayı yenilemeden yeni gönderileri görebilirler.
Güvenlik ve Veri Doğrulama
Kullanıcı girişleri ve içerik oluşturma süreçlerinde güvenlik en öncelikli konudur. SQL Injection ve XSS saldırılarına karşı Laravel'in sunduğu FormRequest sınıflarını kullanmalısınız.
Dikkat: Kullanıcıdan alınan verileri asla doğrudan veritabanına kaydetmeyin. Laravel'in
validate()metodunu kullanarak verileri mutlaka filtreleyin. Ayrıca, içeriklerin HTML içeriği barındırması gerekiyorsae()fonksiyonu veyaPurifierkütüphanesi ile XSS temizliği yapın.
Aşağıdaki örnekte, bir içerik oluşturma isteğini nasıl güvenli hale getireceğinizi görebilirsiniz:
// ContentRequest.php
public function rules(): array
{
return [
'title' => 'required|string|max:255',
'body' => 'required|string|min:10',
'category_id' => 'required|exists:categories,id'
];
}
Yöntemlerin Karşılaştırması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Polling (Düzenli İstek) | Basit kurulum | Sunucu yükü yüksek |
| WebSockets (Reverb) | Gerçek zamanlı, hızlı | Sunucu yapılandırması gerektirir |
| Server-Sent Events | Tek yönlü iletişim | Sadece sunucudan istemciye |
Sıkça Sorulan Sorular
Laravel Reverb kullanmak için ek bir ücret ödemem gerekir mi?
Hayır, Laravel Reverb açık kaynaklıdır ve Laravel ekosistemine dahil bir WebSocket sunucusudur. Kendi sunucunuzda ücretsiz olarak çalıştırabilirsiniz.
Takipçi sayısı milyonları bulursa sorgular yavaşlar mı?
Evet, whereIn sorgusu çok büyük verilerde performans sorunu yaratabilir. Bu durumda Redis üzerinde "Feed" önbellekleme (caching) yapısı kurmanız önerilir.
İçerik akışını nasıl daha hızlı yüklerim?
Eager Loading (with('user')) kullanarak N+1 sorgu problemini çözün ve veritabanı sütunlarınızda mutlaka indeksleme yapın.
Mobil uygulamalar bu sisteme nasıl entegre olur?
Laravel API rotaları üzerinden JSON formatında veri sunarak, mobil uygulamalarınızın aynı WebSocket kanalını dinlemesini sağlayabilirsiniz.
Veri gizliliğini nasıl sağlarım?
Kullanıcıların içeriklerini sadece takipçilerine özel yapmak için Policy sınıflarını kullanın ve veritabanı sorgularında where koşullarıyla erişim kontrolü yapın.
Güvenlik Sorumluluk Reddi: Bu makaledeki kod örnekleri eğitim amaçlıdır. Üretim ortamına geçmeden önce tüm güvenlik açıklarını (CSRF, SQL Injection, XSS) gözden geçirin ve Laravel'in yerleşik güvenlik mekanizmalarını (Middleware, Policy, Request Validation) eksiksiz uygulayın.
İleri Seviye Performans Optimizasyonu: Redis Caching ve Kuyruk Yönetimi
Sisteminiz büyüdükçe, her sayfa yenilemesinde veritabanına doğrudan sorgu atmak ciddi bir darboğaz yaratacaktır. Yayın akışı gibi yoğun okuma yapılan sistemlerde, veriyi önbelleğe almak (caching) ve ağır işlemleri arka plana atmak (queuing) hayati önem taşır.
Redis ile İçerik Akışını Önbelleğe Alma
Kullanıcıların ana sayfadaki akışını her seferinde veritabanından çekmek yerine, belirli bir süre için Redis üzerinde tutabilirsiniz. Laravel'in Cache facade yapısı bu konuda oldukça güçlüdür.
use Illuminate\Support\Facades\Cache;
public function getFeed(Request $request)
{
$userId = auth()->id();
$cacheKey = "user_feed_{$userId}";
return Cache::remember($cacheKey, now()->addMinutes(5), function () use ($userId) {
return Post::whereIn('user_id', Follower::where('follower_id', $userId)->pluck('following_id'))
->latest()
->paginate(20);
});
}
Burada remember metodu, veriyi 5 dakika boyunca Redis üzerinde tutar. Eğer kullanıcı yeni bir içerik paylaştığında veya takip ettiğinde bu önbelleği Cache::forget("user_feed_{$userId}") komutuyla temizlemeyi unutmamalısınız.
Kuyruk (Queue) Kullanımı ile Bildirimleri Hızlandırma
Bir kullanıcı içerik paylaştığında, tüm takipçilere bildirim göndermek senkron bir işlem olarak yapılırsa, kullanıcının "Paylaş" butonuna bastıktan sonra beklemesine neden olur. Bu işlemi Laravel Kuyrukları ile asenkron hale getirin.
// App\Jobs\SendNewPostNotification.php
public function handle()
{
foreach ($this->followers as $follower) {
$follower->notify(new NewPostNotification($this->post));
}
}
// Controller içerisinde çağrımı
SendNewPostNotification::dispatch($post, $followers);
Sistem Testleri ve Hata Ayıklama (Debugging)
Dinamik bir akış sisteminde en büyük sorun, veritabanı ilişkilerindeki tutarsızlıklardır. PHPUnit kullanarak sisteminizin kararlılığını test etmelisiniz.
Entegrasyon Testleri ile Akış Doğrulaması
Sistemin doğru çalışıp çalışmadığını anlamak için, bir kullanıcının takip ettiği kişilerin gönderilerini görüp görmediğini test eden bir senaryo yazalım.
public function test_user_can_see_followed_users_posts()
{
$user = User::factory()->create();
$followed = User::factory()->create();
$user->follow($followed);
$post = Post::factory()->create(['user_id' => $followed->id]);
$response = $this->actingAs($user)->get('/api/feed');
$response->assertStatus(200);
$response->assertJsonFragment(['id' => $post->id]);
}
Hata ayıklama sürecinde ise Laravel Telescope kullanmanızı öneririm. Telescope, gelen istekleri, veritabanı sorgularını ve kuyruk işlerini gerçek zamanlı olarak izlemenizi sağlar. Özellikle N+1 sorgu problemlerini tespit etmek için Telescope'un "Queries" sekmesi, hangi sorgunun yavaş çalıştığını anında görmenize yardımcı olur.
İpucu: Yayın akışınızdaN+1sorununu önlemek için mutlakawith('user', 'media')gibi eager loading yöntemlerini kullanın. Aksi takdirde, her gönderi için ayrı bir kullanıcı sorgusu atılarak veritabanı performansınız ciddi şekilde düşecektir.
Sonuç
Laravel ile dinamik bir yayın akışı oluşturmak, doğru mimari kararlar verildiğinde oldukça verimli bir süreçtir. Bu rehberde, veritabanı ilişkilerinden gerçek zamanlı bildirimlere kadar sistemin çekirdek yapısını kurduk. Bir sonraki adım olarak, sisteminize "İçerik Öneri Algoritması" ekleyerek kullanıcı deneyimini kişiselleştirebilir ve Redis kullanarak akış hızınızı optimize edebilirsiniz.


Yorumlar (0)
Yorum Yaz