Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce bilgisayarınızda PHP 8.3 veya üzeri bir sürümün, Composer paket yöneticisinin ve Laravel 11+ sürümünün yüklü olduğundan emin olmalısınız. Ayrıca veritabanı yönetimi için MySQL veya PostgreSQL kullanmanızı öneririz.
- PHP 8.3+: Modern sözdizimi ve performans iyileştirmeleri için gereklidir.
- Composer: Laravel bağımlılıklarını yönetmek için zorunludur.
- Laravel Installer: Projeyi hızlıca ayağa kaldırmak için kullanılır.
- Veritabanı: Uygulamanın verilerini tutmak için bir SQL sunucusu.
Adım 1: Veritabanı Modeli ve Migrasyonların Hazırlanması
Stok takibi için temel yapı taşımız "Ürünler" (Products) tablosudur. Ürünlerin isimlerini, stok miktarlarını ve fiyatlarını tutacağımız bir yapı kuracağız. Terminalinizi açın ve aşağıdaki komutla model ve migrasyon dosyasını oluşturun.
php artisan make:model Product -m
Oluşturulan migration dosyasını database/migrations dizininde bulun ve aşağıdaki sütunları ekleyin. Veri bütünlüğünü sağlamak için unsignedInteger kullanarak stok miktarının negatif olmasını engelleyeceğiz.
public function up(): void
{
Schema::create('products', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('sku')->unique();
$table->unsignedInteger('stock_quantity')->default(0);
$table->decimal('price', 10, 2);
$table->timestamps();
});
}
Adım 2: Stok Hareketlerini Yönetmek
Stok takibinde en önemli unsur, ürünün neden azaldığını veya arttığını bilmektir. Bunun için bir StockMovement (Stok Hareketi) tablosu oluşturarak her işlemi kayıt altına almalıyız. Bu, denetim (audit) süreçleri için kritik öneme sahiptir.
php artisan make:model StockMovement -m
Migrasyon dosyasında ürün ile hareket arasında bir ilişki kuruyoruz. foreignId kullanarak veritabanı seviyesinde ilişkilendirme yapıyoruz.
Schema::create('stock_movements', function (Blueprint $table) {
$table->id();
$table->foreignId('product_id')->constrained()->onDelete('cascade');
$table->integer('quantity'); // Pozitif giriş, negatif çıkış
$table->string('reason');
$table->timestamps();
});
Adım 3: İş Mantığı ve Controller Katmanı
Stok güncelleme işlemini güvenli bir şekilde gerçekleştirmek için ProductController içerisinde bir fonksiyon yazalım. Burada DB::transaction kullanarak, stok miktarı güncellenirken aynı anda hareket kaydının da oluşmasını garanti altına alıyoruz. Eğer bir hata oluşursa veritabanı eski haline döner.
public function updateStock(Request $request, Product $product)
{
$validated = $request->validate([
'quantity' => 'required|integer',
'reason' => 'required|string|max:255',
]);
DB::transaction(function () use ($product, $validated) {
$product->increment('stock_quantity', $validated['quantity']);
$product->movements()->create([
'quantity' => $validated['quantity'],
'reason' => $validated['reason'],
]);
});
return back()->with('success', 'Stok başarıyla güncellendi.');
}
Stok Yönetimi Yöntemleri Karşılaştırması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Doğrudan Güncelleme | Hızlı ve basit | Geçmiş izlenemez |
| Hareket Kaydı (Log) | Denetlenebilir | Daha fazla veritabanı alanı |
Adım 4: Güvenlik ve Doğrulama
Kullanıcıdan gelen veriler her zaman tehlikelidir. Laravel'in FormRequest sınıfını kullanarak girişleri doğrulayın. Ayrıca, stok miktarının sıfırın altına düşmemesini kontrol etmek için model içerisinde bir "guard" (koruma) mantığı kurabilirsiniz.
Kritik Güvenlik Uyarısı: Kullanıcı girişleri asla doğrudan veritabanına gönderilmemelidir. Her zaman$request->validate()veyaFormRequestsınıflarını kullanarak veriyi temizleyin. SQL Injection riskine karşı Eloquent'in sunduğu hazır yöntemleri kullanın.
Adım 5: Arayüz ve Dinamik Listeleme
Blade şablon motorunu kullanarak stok durumunu anlık gösteren bir tablo oluşturalım. @forelse direktifi, ürün yoksa kullanıcıya anlamlı bir mesaj göstermek için idealdir.
@foreach($products as $product)
{{ $product->name }}
{{ $product->stock_quantity }}
@csrf
Güncelle
@endforeach
Sıkça Sorulan Sorular
Stok miktarı neden negatif olabiliyor?
Veritabanı migrasyonunda unsignedInteger kullanırsanız veritabanı seviyesinde negatif değer girişini engellersiniz. Ayrıca Controller içerisinde if ($product->stock_quantity + $request->quantity < 0) kontrolü yapmalısınız.
Birden fazla kullanıcı aynı anda stok güncellerse ne olur?
Laravel'in lockForUpdate() metodunu kullanarak o satırı işlem bitene kadar kilitleyebilirsiniz. Bu, "race condition" (yarış durumu) sorunlarını önler.
Veritabanı performansını nasıl artırırım?
Sık sorgulanan sütunlara (örneğin sku) indeks (index) ekleyerek arama hızını ciddi oranda artırabilirsiniz.
Stok hareketlerini nasıl raporlarım?
StockMovement modeline bir belongsTo ilişkisi kurarak, ürün bazlı filtrelemelerle kolayca raporlar oluşturabilirsiniz.
Bu uygulama büyük ölçekli depolarda çalışır mı?
Evet, ancak çok yüksek trafikli sistemlerde Redis kullanarak stok verilerini önbelleğe almanız (caching) önerilir.
Stok Takip Sistemlerinde Otomasyon: Event ve Listener Kullanımı
Gerçek zamanlı bir stok takip sisteminde, stok miktarı kritik bir eşiğin altına düştüğünde sistemin otomatik olarak tepki vermesi gerekir. Laravel'in Event (Olay) ve Listener (Din
Laravel ile dinamik bir stok takip uygulaması geliştirmek, veritabanı ilişkileri ve güvenli veri işleme konularında size önemli bir deneyim kazandırır. Bu projeyi bir adım öteye taşımak için "Düşük Stok Uyarıları" (Low Stock Alerts) özelliğini ekleyerek, stok miktarı belirli bir seviyenin altına düştüğünde Laravel'in Sonuç
Notification sistemini kullanarak e-posta göndermeyi deneyebilirsiniz.
Sorumluluk Reddi: Bu rehberde sunulan kod örnekleri eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce mutlaka kapsamlı bir test sürecinden geçirin ve güvenlik açıklarına karşı projenizi periyodik olarak tarayın.


Yorumlar (16)
Laravel 11 ile stok takibi yapmak harika bir fikir. Özellikle event ve listener yapısını nasıl kurduğunuzu merak ediyorum, o kısmı biraz daha detaylandırabilir misiniz?
Teşekkürler Caner! Event-driven mimariyi bir sonraki yazıda derinlemesine ele alacağım, takipte kal.
Emeğinize sağlık Zeynep Hanım, anlatım gayet akıcı olmuş. Projemde kullandım, çok işime yaradı.
Hocam bende tam kurulum aşamasında hata alıyorum, sizde sorunsuz çalıştı mı?
Kod blokları çok temiz, eline sağlık. Yalnız veritabanı migration kısmında küçük bi hata var gibi, sanki indexleri unutmuşsun.
Haklısın Burak, gözümden kaçmış. Hemen güncelledim, uyarın için teşekkürler!
Ya ben bu stok hareketleri kısmını bi türlü oturtamadım, acaba github reposu var mı inceleyebileceğimiz?
Tabii, yazıdaki bağlantıdan GitHub reposuna ulaşabilirsin. Orada tüm kodlar mevcut.
Harika bi rehber olmuş, Laravel 11'e yeni başlayan biri olarak çok faydalandım valla.
Stok takibinde veritabanı kilitlenmelerini önlemek için 'database transaction' kullanımından da bahsetseydin keşke. Genelde büyük projelerde o kısım patlıyo.
Aynen, transaction kullanmazsak veri tutarlılığı kalmıyo, çok haklısın.
Zeynep hanım ağzınıza sağlık, çok güzel anlatmışsınız. Peki bu yapıya QR kod okuma özelliği eklemek çok mu zorlar bizi?
Teşekkürler Ayşegül! QR kod için basit bir API entegrasyonu yeterli olacaktır, zor bir süreç değil.
Laravel 11 ile gelen yeni özellikler stok takibini baya basitleştirmiş valla, ellerine sağlık.
Yazı güzel ama görseller mobilde biraz kaymış, bilgin olsun.
Uygulamayı yaparken ufak bi hata aldım ama yorumları okuyunca çözdüm, teşekkürler herkese.
Yorum Yaz