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: CRUD Kontrolcüleri Yazmayı Bırakın – DEV Community
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 » CRUD Kontrolcüleri Yazmayı Bırakın – DEV Community

Yazılım

CRUD Kontrolcüleri Yazmayı Bırakın – DEV Community

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

API oluştururken her seferinde aynı CRUD denetleyicilerini yazmak zorunda değilsiniz. Laravel Query Gate, Eloquent modellerinizi basit bir yapılandırma ile güçlü ve güvenli API’lere dönüştürür.


Problem

Kaç kez şu tarz bir kod yazmak zorunda kaldınız?

class UserController extends Controller
{
    public function index(Request $request)
    {
        $query = User::query();

        // Email ile filtreleme
        if ($request->has('email')) {
            $query->where('email', 'like', '%' . $request->email . '%');
        }

        // Oluşturma tarihi ile filtreleme
        if ($request->has('created_after')) {
            $query->where('created_at', '>=', $request->created_after);
        }

        // Durum ile filtreleme
        if ($request->has('status')) {
            $query->where('status', $request->status);
        }

        // Sıralama
        $sortBy = $request->get('sort_by', 'created_at');
        $sortOrder = $request->get('sort_order', 'desc');
        $query->orderBy($sortBy, $sortOrder);

        // Sayfalandırma
        return $query->paginate($request->get('per_page', 15));
    }
}

Artık bunu uygulamanızdaki her model için çarpın. Doğrulama ekleyin. Güvenlik kontrolleri ekleyin. Önbellekleme ekleyin. İlişkiler için eager loading ekleyin. Kısacası, tekrar eden bu boilerplate kodu yazmak zorunda kalıyorsunuz.


Çözüm

// config/query-gate.php

use BehindSolution\LaravelQueryGate\Support\QueryGate;

return [
    'models' => [
        App\Models\User::class => QueryGate::make()
            ->middleware(['auth:sanctum'])
            ->filters([
                'email' => 'email',
                'created_at' => 'date',
                'status' => 'in:active,inactive,pending',
            ])
            ->allowedFilters([
                'email' => ['like'],
                'created_at' => ['gte', 'lte'],
                'status' => ['eq'],
            ])
            ->cache(60),
    ],
];

Bitti. Artık tam işlevsel bir, güvenli API uç noktası oluşturabilirsiniz:

GET /query?model=App\Models\User
    &filter[email][like]=%@gmail.com
    &filter[created_at][gte]=2024-01-01
    &filter[status][eq]=active
    &sort=created_at:desc
    &per_page=50


Anahtar Özellikler


🔍 Güçlü Filtreleme

Kutu içinden birden fazla operatör desteği:

->filters([
            'price' => 'numeric',
            'title' => 'string',
            'published_at' => 'date',
        ])
->allowedFilters([
            'price' => ['eq', 'lt', 'lte', 'gt', 'gte', 'between'],
            'title' => ['like'],
            'published_at' => ['eq', 'between'],
        ])

Kullanılabilir operatörler: eq, neq, lt, lte, gt, gte, like, in, between


🔗 İlişki Filtreleme Noktaları ile

İlişkiler üzerinde filtreleme yaparken:

->filters([
            'posts.title' => 'string',
            'posts.comments.author.name' => 'string',
        ])
->allowedFilters([
            'posts.title' => ['like'],
            'posts.comments.author.name' => ['eq'],
        ])


🔒 Güvenlik Öncelikli

Her şeyi beyaz listele. Sürpriz yok.

->middleware(['auth:sanctum', 'throttle:60,1'])
->filters(['email' => 'email']) // Yalnızca bu alanlar filtrelenebilir
->allowedFilters(['email' => ['eq']]) // Yalnızca bu operatörler izinli
->select(['id', 'name', 'email']) // Yalnızca bu alanlar döndürülür
->query(fn($q, $request) => 
    $q->where('tenant_id', $request->user()->tenant_id)
)

Laravel Politika entegrasyonu:

->policy() // Mevcut politikanızı kullanır
// veya
->authorize(fn($request, $model) => 
    $request->user()->isAdmin() || 
    $model->user_id === $request->user()->id
)


⚡ Akıllı Önbellekleme

Yanıtları otomatik olarak akıllıca geçersiz kılma ile önbelleğe al:

->cache(60, )

Önbellek anahtarı şunları içerir:

  • Model sınıfı
  • Tüm filtreler
  • Sıralama parametreleri
  • Sayfalandırma ayarları
  • Doğruladığınız kullanıcı ID’si

Önbellek, oluşturma, güncelleme veya silme işlemlerinden sonra otomatik olarak temizlenir.


🔧 Karmaşık Durumlar için Ham Filtreler

Özel mantık mı gerekiyor? Sorun değil:

->filters([=> ])
->rawFilters([
    => fn(, , , ) =>
        ->whereRaw(
            ,
            [$value}]
        ),
])

Doğrulama ve beyaz listelemenin yanı sıra, sorgu mantığını kontrol edin.


📝 İsteğe Bağlı CRUD İşlemleri

Gerekirse oluşturma, güncelleme ve silmeyi etkinleştirin:

->actions(fn() => $actions
    ->create(fn() => $action
        ->validations([
            => ,
            => ,
        ])
        ->policy()
    )
    ->update(fn() => $action
        ->validations([
            => ,
            => ,
        ])
    )
    ->delete(fn() => $action
        ->authorize(fn(, ) => 
            ->user()->isAdmin()
        )
    )
)

Uç noktalar:

POST   /query?model=App\Models\User          # Oluştur
PATCH  /query/{id}?model=App\Models\User     # Güncelle
DELETE /query/{id}?model=App\Models\User     # Sil


🎯 Esnek Sayfalandırma

İhtiyacınıza göre seçin:

->paginationMode()  // Sonsuz kaydırma için
->paginationMode() // Standart sayfa tabanlı (varsayılan)
->paginationMode()    // Her şeyi döndür


📊 Sütun Seçimi

Gerekli alanları seçerek yük boyutunu azaltın:

->select([, , , ])

Birincil ve yabancı anahtarlar, ilişkili verilerin doğru şekilde su verilmesi için otomatik olarak dahil edilir.


Gerçek Dünya Örnekleri


Çok Kiracılı SaaS

App\Models\Project::class => QueryGate::make()
    ->middleware([, ])
    ->query(fn(, ) => 
        ->where(, ->user()->tenant_id)
    )
    ->filters([
        => ,
        => ,
        => ,
    ])
    ->allowedFilters([
        => [, ],
        => [],
        => [],
    ])
    ->cache(300)
    ->actions(fn() => $actions
        ->create(fn() => $action
            ->validations([
                => ,
                => ,
            ])
            ->handle(function(, , ) {
                ->fill();
                ->tenant_id = ->user()->tenant_id;
                ->save();
                return ;
            })
        )
        ->update()
        ->delete()
    ),


E-Ticaret Ürün Kataloğu

App\Models\Product::class => QueryGate::make()
    ->query(fn() => ->selectRaw()
        ->leftJoin(, , , )
        ->groupBy()
    )
    ->filters([
        => ,
        => ,
        => ,
        => ,
    ])
    ->allowedFilters([
        => [, ],
        => [, , ],
        => [],
        => [],
    ])
    ->select([, , , , ])
    ->cache(600),


Analitik Gösterge Paneli

App\Models\Order::class => QueryGate::make()
    ->middleware([, ])
    ->query(fn() => ->selectRaw()
        ->groupBy()
    )
    ->filters([
        => ,
        => ,
    ])
    ->allowedFilters([
        => [, , ],
        => [, ],
    ])
    ->paginationMode()
    ->cache(1800, ),


Kurulum

composer require behindsolution/laravel-query-gate

İsterseniz yapılandırmayı yayınlayın:

php artisan vendor:publish --tag=query-gate-config


Query Gate Ne Zaman Kullanılır

✅ Mükemmel:

  • Admin panelleri
  • İç araçlar
  • BI/Analitik entegrasyonlar
  • Mobil uygulama arka uçları
  • Hızlı prototipleme
  • Raporlar ve veri dışa aktarımlar

❌ İdeal Değil:

  • Karmaşık iş mantığına sahip kamu API’leri
  • Çok adım gerektiren işlemler
  • Her sorgu üzerinde ince kontrol gerektiğinde
  • GraphQL (bunun için Laravel Lighthouse kullanın)


Güvenlik En İyi Uygulamaları

  1. Her zaman kimlik doğrulaması yapın: ->middleware(['auth:sanctum'])
  2. Açıkça beyaz listeleme yapın: Sadece açmak istediğiniz modelleri dışa aktarı
  3. Operatörleri kısıtlayın: Tüm alanlarda tüm operatörlere izin vermeyin
  4. Girişleri doğrulayın: ->filters() kullanarak doğrulama kuralları ile
  5. Oran kısıtlaması uygulanabilir: Kötüye kullanıma karşı koruma sağlamak
  6. Kiracıya göre sınırlandırın: Çok kiracılı izolasyon için ->query() kullanın
  7. Politikalar kullanın: Mevcut yetkilendirme ile entegre edin
// ✅ İyi
->filters([=> ])
->allowedFilters([=> []])
->middleware([, ])

// ❌ Kötü
->filters([=> ])
->allowedFilters([=> [, , , ]]) // Çok izin verildi
// Middleware yok!


Performans Dikkate Alınacaklar

Query Gate, Laravel’in Eloquent’ine delegasyonda bulunduğundan, standart optimizasyon uygulamaları geçerlidir:

  1. Eager loading’i kullanın ->query() içinde N+1’i önlemek için:
   ->query(fn() => ->with([, ]))
  1. İkinci veritabanı indekslerini ekleyin filtrelenen/sıralanmış sütunlar için

  2. Maliyetli sorgular için önbelleği etkinleştirin:

  3.    ->cache(3600)
    
  4. Sayfalandırma boyutunu sınırlayın:
  5.    // config/query-gate.php
       => [
           => 25,
           => 100,
       ],
    
  6. Büyük veri kümesi için cursor sayfalandırmasını kullanın:
  7.    ->paginationMode()
    


Alternatiflerle Karşılaştırma

ÖzellikQuery GateÖzel DenetleyicilerGraphQLAPI Platform
Kurulum Süresi5 dakikaSaatlerGünlerGünler
Laravel Native✅✅❌❌
Öğrenme EğrisiDüşükYokYüksekYüksek
EsneklikYüksekToplamOrtaOrta
Otomatik Doğrulama✅Manuel✅✅
Önbellek✅Manuel❌❌


SSS

S: Bu denetleyicileri otomatik olarak değiştiriyor mu?

A: Hayır. Query Gate’i standart CRUD + filtreleme için kullanın. Karmaşık iş mantığı için denetleyiciler oluşturun.

S: Üretime hazır mı?

A: Evet. Laravel’in çekirdek bileşenlerini (Eloquent, Validator, Policies, Cache) kullanır. Doğru yapılandırıldığında, herhangi bir Laravel API’si kadar güvenlidir.

S: Sorgu mantığını özelleştirebilir miyim?

A: Kesinlikle. ->query(), ->rawFilters(), ->authorize() ve ->handle() geri çağırmaları ile tam kontrol sağlayın.

S: İlişkileri nasıl ele alıyor?

A: Filtrelerde ve seçimlerde nokta notasyonu üzerinden. Query Gate, otomatik olarak birleşim işlemlerini ve eager loading’i yönetir.

S: Çok kiracılığı nasıl ele alıyor?

A: Kiracıya göre sınırlandırma sağlamak için ->query() kullanarak veya kiracı izolasyonu middleware’i uygulayarak kullanın.


Sonuç

Laravel Query Gate, belirli bir problemi çözmektedir: standart CRUD işlemleri için boşa giden kodu ortadan kaldırma. Amacı denetleyicileri değiştirmek veya tam bir GraphQL alternatifi olmak değildir.

Belli başlı durumlarda size zaman kazandırırken, özel mantık gerektiren %20’lik durumlar için de tamamen kaçış yolları sunar.

Bunu bir sonraki Laravel projenizde deneyin. Gelecekteki sizlere başka bir sayfalandırılmış, filtrelenmiş, sıralanmış CRUD denetleyici yazmadığınız için minnettar kalacaksınız.


Bağlantılar:

Gereksinimler:

  • PHP 8.2+
  • Laravel 9, 10, 11 veya 12

Query Gate’i kullandınız mı? Deneyimlerinizi yorumlarda paylaşın! Bir hata bulduysanız veya bir özellik isteğiniz varsa, GitHub’da bir sorun açın.

Kaynak: Orijinal Makale

Contents
  • Problem
  • Çözüm
  • Anahtar Özellikler
    • 🔍 Güçlü Filtreleme
    • 🔗 İlişki Filtreleme Noktaları ile
    • 🔒 Güvenlik Öncelikli
    • ⚡ Akıllı Önbellekleme
    • 🔧 Karmaşık Durumlar için Ham Filtreler
    • 📝 İsteğe Bağlı CRUD İşlemleri
    • 🎯 Esnek Sayfalandırma
    • 📊 Sütun Seçimi
  • Gerçek Dünya Örnekleri
    • Çok Kiracılı SaaS
    • E-Ticaret Ürün Kataloğu
    • Analitik Gösterge Paneli
  • Kurulum
  • Query Gate Ne Zaman Kullanılır
  • Güvenlik En İyi Uygulamaları
  • Performans Dikkate Alınacaklar
  • Alternatiflerle Karşılaştırma
  • SSS
  • Sonuç
Aimeos: Laravel E-ticaret 2026.04 – DEV Community
PHP/Laravel ile EasyShip API Kullanarak Uluslararası Gönderimleri Basitleştirin
Görünmez Duvar: Laravel’de Hatasız Bir Kod Kalitesi Pipeline’ı Oluşturma
Browsershot Alternatifi: PHP Ekran Görüntüsü Oluşturma için Yerine Geçen Bir Çözüm
Laravel Blaze: Ne Yapar, Ne Zaman Kullanılmalı ve Ne Zaman Uygulamanızı Kırar
Bu Makaleyi Paylaş
Facebook Bağlantıyı Kopyala Yazdır
Paylaş
Önceki Makale <h3>“Apple Watch ile Verimliliğinizi Artıracak En İyi 10 Uygulama”</h3>
Sonraki Makale Rainbow Six Siege’deki Dev Breach: Oyunculara Milyarlarca Kredi Dağıtıldı!

Sanal Medya

FacebookBeğen
452Takip Et
PinterestSabitle
237Takip Et

Son Eklenenler

DDR4 bellek ve anakart üretimi yeniden başlıyor, DDR5’siz geleceğe hazırlık
Donanım
AI token maliyetleri büyük bir sorun haline geliyor, OpenAI çözümler arıyor
Donanım
Elden Ring: Tarnished Edition Switch 2 İçin Ön Sipariş Fırsatları
Oyun
LinkedIn üzerinden Batılıları tuzağa düşüren Çin casusları
Genel
AMD Helios MI455X AI platformu lanse edildi, Ethernet sınırlamaları var
Donanım
Kurucular Fonu, Sam Altman ve Palmer Luckey’in Yer Aldığı Heyecan Verici Oyun Şovunu Başlattı
Genel
//

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?