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 (0)
Yorum Yaz