Laravel İle Dinamik Bir Stok Takip Uygulaması Nasıl Yapılır?

Laravel İle Dinamik Bir Stok Takip Uygulaması Nasıl Yapılır?
Laravel İle Dinamik Bir Stok Takip Uygulaması Nasıl Yapılır?

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() veya FormRequest sı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

Sonuç

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 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.
Bu yazıya tepkinizi paylaşın:
Zeynep Kaya

Dijital içerik editörlüğü geçmişimle, adım adım rehberlerin en anlaşılır ve uygulanabilir şekilde kurgulanmasını sağlıyorum. Teknik detayları herkes için sadeleştirmeyi seviyorum.

Yorumlar (0)

Yorum Yaz