Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Yazı Tipi BoyutlandırıcıAa
  • Anasayfa
  • Teknoloji
    • Siber Güvenlik
    • Yapay Zeka
    • Donanım
    • Bilim
  • Yazılım
  • Savunma & İstihbarat
  • Oyun
  • Yaşam
    • Finans
    • Sinema
    • Dünyadan Haberler
  • İş Birliği
Okuma: Laravel’de Repository Deseni: Karmaşık Kodunuzu Temizleyin
Paylaş
Yazı Tipi BoyutlandırıcıAa
Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Ara
Bizi Takip Et
  • Hakkımızda
  • Gizlilik politikası
  • Tanıtım Yazısı ve Backlink Hizmeti
© 2026 Teknomers. All Rights Reserved.

Anasayfa » Laravel’de Repository Deseni: Karmaşık Kodunuzu Temizleyin

Yazılım

Laravel’de Repository Deseni: Karmaşık Kodunuzu Temizleyin

teknomers
Son güncelleme: 28 Aralık 2025 17:20
teknomers
Paylaş
Paylaş

Problem
Aşağıdaki gibi controller’lar gördünüz mü?

public class OrderController extends Controller
{
    public function show($id)
    {
        $order = Order::with(['customer', 'items.product'])
            ->where('id', $id)
            ->first();

        return response()->json($order);
    }

    public function getUserOrders($userId)
    {
        // Aynı sorgu tekrar edilmekte! 😱
        $orders = Order::with(['customer', 'items.product'])
            ->where('customer_id', $userId)
            ->get();

        return response()->json($orders);
    }
}

Problemler:

🔴 Her yerde kopyalanmış sorgular
🔴 Controllers Eloquent ile sıkı bir şekilde bağlı
🔴 Veritabanı olmadan test etmek imkansız
🔴 İş mantığı veri erişimiyle karışmış

Çözüm: Repository Pattern

Adım 1: Arayüz Oluştur

interface OrderRepositoryInterface
{
    public function find(int $id): ?Order;
    public function findWithRelations(int $id): ?Order;
    public function findByCustomer(int $customerId): Collection;
}

Adım 2: Repository’i Uygula

class OrderRepository implements OrderRepositoryInterface
{
    protected $model;

    public function __construct(Order $model)
    {
        $this->model = $model;
    }

    public function findWithRelations(int $id): ?Order
    {
        return $this->model
            ->with(['customer', 'items.product'])
            ->find($id);
    }

    public function findByCustomer(int $customerId): Collection;
    {
        return $this->model
            ->with(['customer', 'items.product'])
            ->where('customer_id', $customerId)
            ->orderBy('created_at', 'desc')
            ->get();
    }
}

Adım 3: Servis Sağlayıcıda Kayıt

class RepositoryServiceProvider extends ServiceProvider
{
    public function register()
    {
        $this->app->bind(
            OrderRepositoryInterface::class,
            OrderRepository::class
        );
    }
}

Adım 4: Controller’ı Temizle

class OrderController extends Controller
{
    protected $orderRepository;

    public function __construct(OrderRepositoryInterface $orderRepository)
    {
        $this->orderRepository = $orderRepository;
    }

    public function show(int $id)
    {
        $order = $this->orderRepository->findWithRelations($id);

        if (!$order) {
            return response()->json(['message' => 'Bulunamadı'], 404);
        }

        return response()->json($order);
    }

    public function getUserOrders(int $userId)
    {
        $orders = $this->orderRepository->findByCustomer($userId);
        return response()->json($orders);
    }
}

Faydalar
✅ Kopyalama yok – Sorgu mantığı bir yerde
✅ Kolay test etme – Veritabanı yerine mock repository kullanma
✅ Esneklik – İş mantığını değiştirmeden veri kaynaklarını değiştirme
✅ Temiz kod – Controller’lar HTTP ile ilgili konulara odaklanır
✅ Yeniden kullanılabilirlik – Aynı repository’i controller’larda, görevlerde, komutlarda kullanma

İleri Seviye: Temel Repository

abstract class BaseRepository
{
    protected $model;

    public function all(): Collection
    {
        return $this->model->all();
    }

    public function find(int $id): ?Model
    {
        return $this->model->find($id);
    }

    public function create(array $data): Model
    {
        return $this->model->create($data);
    }

    public function update(int $id, array $data): bool
    {
        return $this->model->find($id)?->update($data) ?? false;
    }

    public function delete(int $id): bool
    {
        return $this->model->find($id)?->delete() ?? false;
    }
}

Şimdi uzat:

class ProductRepository extends BaseRepository
{
    public function __construct(Product $model)
    {
        parent::__construct($model);
    }

    public function getFeatured(int $limit = 10): Collection
    {
        return $this->model
            ->where('is_featured', true)
            ->where('stock', '>', 0)
            ->limit($limit)
            ->get();
    }

    public function searchAndFilter(array $filters)
    {
        $query = $this->model->query();

        if (!empty($filters['search'])) {
            $query->where('name', 'like', "%{$filters['search']}%");
        }

        if (!empty($filters['min_price'])) {
            $query->where(, '>=', $filters[]);
        }

        return $query->paginate(15);
    }
}

Test Etmeyi Kolaylaştırma
Repository olmadan:

// Tüm veritabanını ayarlamak zorundasınız
$order = Order::factory()->hasItems(3)->create();
$response = $this->getJson("/api/orders/{$order->id}");

Repository ile:

// Sadece repository'yi mock et!
$orderRepo = Mockery::mock(OrderRepositoryInterface::class);
$orderRepo->shouldReceive('find')
    ->with(1)
    ->andReturn($mockOrder);

$this->app->instance(OrderRepositoryInterface::class, $orderRepo);

Sık Karşılaşılan Hatalar

❌ Sorgu Oluşturucu Dönmeyin

// Kötü
public function getActive()
{
    return $this->model->where('active', true); // Sorgu oluşturucu!
}

✅ Spesifik Sonuçlar Dön

// İyi
public function getActive(): Collection
{
    return $this->model->where('active', true)->get();
}

✅ Repository’i Sadece Veri Erişimi İçin Tutun

// İyi - Repository sadece veri ile ilgileniyor
public function create(array $data): Order
{
    return $this->model->create($data);
}

// İş mantığı Serviste
class OrderService
{
    public function placeOrder(array $data): Order
    {
        $order = $this->orderRepository->create($data);
        Mail::to($order->customer)->send(new OrderCreated($order));
        return $order;
    }
}

Hızlı Kontrol Listesi
Repository Pattern’i uygulamadan önce kendinize sorun:

  • Controller’ım doğrudan veritabanı sorguları mı yapıyor?
  • Aynı sorguları birkaç yerde mi kopyalıyorum?
  • Kodumu test etmek veritabanı olmadan zor mu?
  • Eloquent/Query Builder/Raw SQL arasında kolayca geçiş yapmak mı istiyorum?
  • Basit bir CRUD uygulamasından fazlasını mı inşa ediyorum?
    Eğer 2 ya da daha fazla soruya evet yanıtı verdiyseniz, Repository Pattern size yardımcı olacaktır!

Sonuç

Repository Pattern’ı basit CRUD uygulamaları için her zaman gerekli değildir, ancak uygulamanız büyüdüğünde çok değerli hale gelir. Size:

  • Temiz, test edilebilir kod

  • Merkezi veri erişim mantığı

  • Veri kaynaklarını değiştirme esnekliği

  • İyi bir sorumluluk ayrımı

Küçük başlayın – ilk olarak en karmaşık modelleriniz için bunu uygulayın, sonra gerektiğinde genişletin.

Tam Derinlemesine Bir Araştırma mı İstiyorsunuz?

Bu, kısaltılmış bir versiyon! Tam kılavuzu daha fazla gelişmiş örnekler (önbellekleme, servis katmanı entegrasyonu), gerçek dünya blog sistemi uygulaması, tam test stratejileri ve e-ticaret sipariş yönetimi örneği ile okuyabilirsiniz:

👉 Repository Pattern in Laravel: From Problem to Solution
Daha fazla Laravel ipuçları için beni takip edin:
👉 masteryoflaravel on Medium

Repository Pattern hakkındaki deneyiminiz nedir? Seviyor musunuz? Nefret mi? Yorumlarda tartışalım! 💬

Kaynak: Orijinal Makale

Laravel AI SDK: Üretimde Kullanılmaya Değer 3 Çoklu Ajan Modeli (ve Atlanması Gereken 2 Model)
Laravel’i VPS’ye GitHub Actions ile Dağıtma (Kesintisiz CI/CD)
Laravel ile AI Kod İnceleme Botu Oluşturma — Gerçek Dünya Kullanım Durumu
Gerçek Zamanlı Laravel: Livewire ile Canlı Gösterge Panelleri, Bildirimler ve Sohbet Oluşturma
PHP’ye Nasıl Başlanır? Yeni Başlayanlar için Basit Bir Rehber
Bu Makaleyi Paylaş
Facebook Bağlantıyı Kopyala Yazdır
Paylaş
Önceki Makale Melatonin Ne Kadar Alınmalı? Sağlıklı Uyku İçin Tavsiyeler
Sonraki Makale Günlük Şişe Suyu Tüketenler Yılda 90,000 Mikroplastik Alıyor!

Sanal Medya

FacebookBeğen
452Takip Et
PinterestSabitle
237Takip Et

Son Eklenenler

Hackerlar Müşteri Verilerini Silerken Diğerleri Tehditler Savuruyor
Genel
Kritik: Microsoft, Windows 10 ESU desteğini 2027’ye kadar uzattı
Siber Güvenlik
Texas’ta Tesla Kazası: Yasal Çatışma ve Sorumluluk Tartışmaları
Genel
GTA 6 ve Yeni Konsol Almak İçin Hazırlıklı Olmanız Gerekebilir
Oyun
Yeni bir bilgisayar almak için kötü bir zaman mı?
Liste
Claude, ücretli kullanıcıları kendine çekiyor: ChatGPT’ye meydan okuyor
Yapay Zeka
//

Siber güvenlik, yapay zeka ve savunma sanayiinden; finans ve sinema dünyasına uzanan geniş bir yelpaze. Teknomers; teknoloji, strateji ve yazılım dünyasını sade bir dille sizlerle buluşturuyor.

Kurumsal

  • Hakkımızda
  • Gizlilik politikası
  • Tanıtım Yazısı ve Backlink Hizmeti

Kategoriler

  • Teknoloji
  • Oyun
  • Sinema
  • Siber Güvenlik
  • Bilim
  • Finans
  • Dünyadan Güncel Haberler

Populer

  • TV'de Ücretsiz İzlenebilen Şifresiz Erotik Kanallar (2025 Güncel Frekans Listesi)

  • The Last of Us PC Kontrolleri: Hızlı Silah Değiştirme ve Tüm Tuşlar (2025)

  • Hogwarts Legacy'de Odaklanma İksiri Nasıl Yapılır?

Teknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor HaberleriTeknomers | Dünyadan Güncel Teknoloji | Oyun | Müzik | Film | Spor Haberleri
Bizi Takip Et
© 2026 Teknomers. All Rights Reserved.
Welcome Back!

Sign in to your account

Kullanıcı Adı veya E-posta Adresi
Şifre

Şifrenizi mi unuttunuz?