Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce sisteminizde gerekli araçların kurulu olduğundan emin olmalısınız. Laravel, modern bir PHP geliştirme ortamı gerektirir.
- PHP 8.2 veya üzeri: Laravel'in performans özelliklerinden tam yararlanmak için gereklidir.
- Composer: PHP paket bağımlılık yöneticisi.
- MySQL veya PostgreSQL: İlişkisel veritabanı yönetimi için.
- Laravel Installer: Projeyi hızlıca başlatmak için kullanılır.
Kurulumu doğrulamak için terminalinizde php -v komutunu çalıştırın. Ayrıca, veritabanı yönetimi için TablePlus veya phpMyAdmin gibi bir görsel arayüz kullanmanız, süreçleri izlemenizi kolaylaştıracaktır.
Veritabanı Şeması ve Model Yapılandırması
Dinamik bir sistemin kalbi veritabanıdır. Ürünler (Products), Kategoriler (Categories) ve Hareketler (StockMovements) tabloları arasında kuracağımız ilişkiler, sistemin esnekliğini belirler. İlk adım olarak migration dosyalarımızı oluşturalım.
// Ürünler tablosu için migration örneği
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('sku')->unique(); // Stok tutma birimi
$table->integer('stock_quantity')->default(0);
$table->decimal('price', 10, 2);
$table->foreignId('category_id')->constrained();
$table->timestamps();
});
Burada sku alanı, her ürünün benzersiz kimliğini temsil eder. stock_quantity alanı ise sistemin mevcut durumunu anlık olarak tutar. foreignId kullanımı, veritabanı seviyesinde referans bütünlüğünü (referential integrity) sağlar.
Stok Giriş-Çıkış Mantığını Geliştirme
Stok yönetimi sadece mevcut sayıyı güncellemek değil, her hareketi kayıt altına almaktır. Bunun için StockMovement modelini kullanacağız. Bu model, hangi ürünün, ne zaman, ne kadar değiştiğini ve hangi kullanıcı tarafından yapıldığını tutar.
// Stok hareketi oluşturma mantığı
public function recordMovement($productId, $quantity, $type) {
StockMovement::create([
'product_id' => $productId,
'quantity' => $quantity,
'type' => $type, // 'in' veya 'out'
'user_id' => auth()->id(),
]);
}
Bu metot, her stok değişikliğinde çağrılmalıdır. type alanı, işlemin bir giriş mi yoksa çıkış mı olduğunu belirler. Bu sayede geçmişe dönük stok raporları oluşturmak oldukça kolaylaşır.
Eloquent İlişkileri ile Veri Okuma
Laravel'in Eloquent ORM yapısı, ilişkili verileri çekmek için oldukça güçlüdür. Bir ürünün tüm stok geçmişini görmek için Product modeline ilişkiyi tanımlamalıyız.
// Product.php modeli içinde
public function movements() {
return $this->hasMany(StockMovement::class);
}
// Controller içinde kullanımı
$product = Product::with('movements')->find($id);
return view('products.show', compact('product'));
with('movements') kullanımı, "N+1" sorgu sorununu engellemek için kritiktir. Bu sayede veritabanına tek bir sorgu ile hem ürünü hem de tüm hareketlerini çekmiş olursunuz.
Kritik Güvenlik Uyarısı: Kullanıcı girişleri (request) asla doğrudan veritabanına gönderilmemelidir. Laravel'inFormRequestsınıflarını kullanarak her zamanvalidate()metodunu devreye alın. SQL Injection riskine karşı Eloquent'in sunduğu korumalı metodları kullanın.
Stok Yönetimi Yöntemlerinin Karşılaştırılması
Sisteminizde stok takibi yaparken kullanabileceğiniz farklı yaklaşımlar mevcuttur. Aşağıdaki tablo, bu yöntemleri özetlemektedir:
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Anlık Güncelleme | Hızlı ve basit | Geçmiş izleme zayıf |
| Hareket Kaydı (Log) | Denetlenebilir ve detaylı | Daha fazla veritabanı yükü |
Dinamik Stok Uyarı Sistemi
Depo yönetiminde kritik nokta, stoklar tükenmeden haberdar olmaktır. Laravel'in Event ve Notification sistemini kullanarak, stok miktarı belirli bir seviyenin altına düştüğünde otomatik e-posta gönderebiliriz.
// Stok kontrolü ve bildirim tetikleme
if ($product->stock_quantity < $product->min_threshold) {
Notification::send($admin, new LowStockNotification($product));
}
Bu kontrolü Product modelinde bir Observer içinde yapmak, iş mantığını controller'lardan ayırarak daha temiz bir kod yapısı sunar.
Sıkça Sorulan Sorular
Laravel'de stok sayısını güncellerken race condition (yarış durumu) nasıl önlenir?
Veritabanı seviyesinde DB::transaction() ve lockForUpdate() metodlarını kullanarak aynı anda iki farklı işlemin aynı stoğu değiştirmesini engelleyebilirsiniz.
Stok raporlarını en hızlı nasıl alabilirim?
Büyük verilerde Laravel Excel paketini kullanarak arka plan işlerinde (queued jobs) rapor oluşturmak, kullanıcı deneyimini bozmadan karmaşık verileri dışa aktarmanızı sağlar.
Depo yönetim sisteminde çoklu depo desteği nasıl eklenir?
Sisteminize bir Warehouses tablosu ekleyip, StockMovement modeline warehouse_id sütunu ekleyerek ürünlerin hangi depoda olduğunu takip edebilirsiniz.
API tabanlı bir sistem kurmak mantıklı mı?
Evet, eğer mobil uygulama veya farklı bir ön yüz kullanacaksanız Laravel API Resource sınıflarını kullanarak sisteminizi bir servis mimarisine dönüştürebilirsiniz.
Sistem güvenliği için başka ne yapmalıyım?
Rate limiting kullanarak API uç noktalarınızı koruyun ve Spatie Permission gibi paketlerle kullanıcı rollerini (admin, depo sorumlusu, görüntüleyici) kesin çizgilerle ayırın.
Sorumluluk Reddi: Bu rehberdeki kod örnekleri eğitim amaçlıdır. Üretim ortamına (production) almadan önce mutlaka birim testleri (unit tests) yazın ve güvenlik açıklarına karşı sızma testleri uygulayın.
Stok Yönetiminde Performans Optimizasyonu ve Veritabanı İndeksleme
Büyük ölçekli envanter sistemlerinde, stok hareketleri tablosu (stock_movements) kısa sürede milyonlarca satıra ulaşabilir. Bu durum, raporlama sorgularının yavaşlamasına neden olur. Performansı korumak için veritabanı düzeyinde stratejik indeksleme ve sorgu optimizasyonu şarttır.
Özellikle product_id ve created_at sütunları üzerinde bileşik indeksler (composite indexes) oluşturmak, stok geçmişini sorgularken sistemin milisaniyeler içinde yanıt vermesini sağlar. Migration dosyanızda şu yapıyı kullanabilirsiniz:
Schema::table('stock_movements', function (Blueprint $table) {
// Sorgu performansını artırmak için bileşik indeks
$table->index(['product_id', 'created_at']);
// Depo bazlı filtrelemeler için ek indeks
$table->index('warehouse_id');
});
Ayrıca, Eloquent'in with() metodunu kullanarak "N+1" sorununu engellemek, sistemin kaynak tüketimini ciddi oranda düşürür. Stok listeleme ekranlarında Product::with('movements')->get() yerine, sadece ihtiyaç duyulan veriyi çeken select ifadelerini kullanmayı alışkanlık haline getirin.
Envanter Sistemlerinde Birim Testleri ve Hata Ayıklama
Stok yönetimi gibi hassas sistemlerde, bir ürünün stok adedinin yanlış hesaplanması finansal kayıplara yol açabilir. Bu nedenle, stok giriş-çıkış işlemlerini mutlaka Feature Test süreçlerine dahil etmelisiniz. Laravel'in DatabaseTransactions trait'ini kullanarak testlerinizi güvenle çalıştırabilirsiniz.
Aşağıdaki örnek, bir stok çıkış işleminin doğru çalışıp çalışmadığını doğrulayan basit bir test senaryosudur:
public function test_stock_decrement_logic()
{
$product = Product::factory()->create(['stock_quantity' => 10]);
$response = $this->postJson('/api/stock/decrement', [
'product_id' => $product->id,
'quantity' => 3
]);
$response->assertStatus(200);
$this->assertEquals(7, $product->fresh()->stock_quantity);
}
Hata ayıklama sürecinde ise Laravel Telescope kullanarak stok hareketlerini anlık olarak izleyebilir, veritabanı sorgularının çalışma sürelerini ve oluşabilecek istisnaları (exceptions) merkezi bir panelden takip edebilirsiniz. Özellikle DB::transaction blokları içerisinde oluşan hataları loglamak, tutarsız stok verilerinin önüne geçmek için kritik bir öneme sahiptir.
Profesyonel İpucu: Stok sayımı (inventory count) sırasında veritabanını kilitlememek içinOptimistic Lockingyöntemini tercih edin. Bir kaydı güncellemeden önceversionsütununu kontrol ederek, aynı anda iki farklı kullanıcının stoğu değiştirmesini engelleyebilirsiniz.
Sonuç
Laravel ile dinamik bir envanter takip ve depo yönetim sistemi oluşturmak, doğru mimari kararlar verildiğinde oldukça sürdürülebilir bir süreçtir. Bu rehberde veritabanı modellemesinden, stok hareketlerinin takibine ve bildirim sistemlerine kadar temel taşları inceledik. Bir sonraki adım olarak, projenize Barcode (Barkod) okuma entegrasyonu ekleyerek sistemi fiziksel mağazalarla uyumlu hale getirebilirsiniz. Kodunuzu modüler tutun ve Laravel'in sunduğu geniş ekosistemden faydalanmayı ihmal etmeyin.


Yorumlar (0)
Yorum Yaz