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
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
Çö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
Anahtar Özellikler
🔍 Güçlü Filtreleme
🔍 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ş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
🔒 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
⚡ 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
🔧 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
📝 İ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
🎯 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
📊 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
Gerçek Dünya Örnekleri
Çok Kiracılı SaaS
Ç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
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
Analitik Gösterge Paneli
App\Models\Order::class => QueryGate::make()
->middleware([, ])
->query(fn() => ->selectRaw()
->groupBy()
)
->filters([
=> ,
=> ,
])
->allowedFilters([
=> [, , ],
=> [, ],
])
->paginationMode()
->cache(1800, ),
Kurulum
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
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ı
Güvenlik En İyi Uygulamaları
- Her zaman kimlik doğrulaması yapın:
->middleware(['auth:sanctum']) - Açıkça beyaz listeleme yapın: Sadece açmak istediğiniz modelleri dışa aktarı
- Operatörleri kısıtlayın: Tüm alanlarda tüm operatörlere izin vermeyin
- Girişleri doğrulayın:
->filters()kullanarak doğrulama kuralları ile - Oran kısıtlaması uygulanabilir: Kötüye kullanıma karşı koruma sağlamak
- Kiracıya göre sınırlandırın: Çok kiracılı izolasyon için
->query()kullanın - 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
Performans Dikkate Alınacaklar
Query Gate, Laravel’in Eloquent’ine delegasyonda bulunduğundan, standart optimizasyon uygulamaları geçerlidir:
- Eager loading’i kullanın
->query()içinde N+1’i önlemek için:
->query(fn() => ->with([, ]))
İkinci veritabanı indekslerini ekleyin filtrelenen/sıralanmış sütunlar için
Maliyetli sorgular için önbelleği etkinleştirin:
- Sayfalandırma boyutunu sınırlayın:
- Büyük veri kümesi için cursor sayfalandırmasını kullanın:
->cache(3600)
// config/query-gate.php
=> [
=> 25,
=> 100,
],
->paginationMode()
Alternatiflerle Karşılaştırma
Alternatiflerle Karşılaştırma
| Özellik | Query Gate | Özel Denetleyiciler | GraphQL | API Platform |
|---|---|---|---|---|
| Kurulum Süresi | 5 dakika | Saatler | Günler | Günler |
| Laravel Native | ✅ | ✅ | ❌ | ❌ |
| Öğrenme Eğrisi | Düşük | Yok | Yüksek | Yüksek |
| Esneklik | Yüksek | Toplam | Orta | Orta |
| Otomatik Doğrulama | ✅ | Manuel | ✅ | ✅ |
| Önbellek | ✅ | Manuel | ❌ | ❌ |
SSS
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ç
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
- 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
- Kurulum
- Query Gate Ne Zaman Kullanılır
- Güvenlik En İyi Uygulamaları
- Performans Dikkate Alınacaklar
- Alternatiflerle Karşılaştırma
- SSS
- Sonuç


