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 (16)

16
okuyucu bu yazı hakkında yorum yaptı. Siz de deneyiminizi paylaşarak diğer okuyuculara yardımcı olabilirsiniz.
Caner Yılmaz
Caner Yılmaz 01 Ağustos 2026

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?

Zeynep Kaya
Zeynep Kaya 02 Ağustos 2026

Teşekkürler Caner! Event-driven mimariyi bir sonraki yazıda derinlemesine ele alacağım, takipte kal.

Selin Başar
Selin Başar 02 Ağustos 2026

Emeğinize sağlık Zeynep Hanım, anlatım gayet akıcı olmuş. Projemde kullandım, çok işime yaradı.

Emre Demir
Emre Demir 04 Ağustos 2026

Hocam bende tam kurulum aşamasında hata alıyorum, sizde sorunsuz çalıştı mı?

Burak Özdemir
Burak Özdemir 03 Ağustos 2026

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.

Zeynep Kaya
Zeynep Kaya 04 Ağustos 2026

Haklısın Burak, gözümden kaçmış. Hemen güncelledim, uyarın için teşekkürler!

Deniz Aras
Deniz Aras 04 Ağustos 2026

Ya ben bu stok hareketleri kısmını bi türlü oturtamadım, acaba github reposu var mı inceleyebileceğimiz?

Zeynep Kaya
Zeynep Kaya 05 Ağustos 2026

Tabii, yazıdaki bağlantıdan GitHub reposuna ulaşabilirsin. Orada tüm kodlar mevcut.

Merve Çelik
Merve Çelik 04 Ağustos 2026

Harika bi rehber olmuş, Laravel 11'e yeni başlayan biri olarak çok faydalandım valla.

Fatih Akın
Fatih Akın 05 Ağustos 2026

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.

Berkant Güler
Berkant Güler 06 Ağustos 2026

Aynen, transaction kullanmazsak veri tutarlılığı kalmıyo, çok haklısın.

Ayşegül Tekin
Ayşegül Tekin 05 Ağustos 2026

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?

Zeynep Kaya
Zeynep Kaya 06 Ağustos 2026

Teşekkürler Ayşegül! QR kod için basit bir API entegrasyonu yeterli olacaktır, zor bir süreç değil.

Kadir Koç
Kadir Koç 06 Ağustos 2026

Laravel 11 ile gelen yeni özellikler stok takibini baya basitleştirmiş valla, ellerine sağlık.

Hakan Vural
Hakan Vural 06 Ağustos 2026

Yazı güzel ama görseller mobilde biraz kaymış, bilgin olsun.

Seda Yılmaz
Seda Yılmaz 07 Ağustos 2026

Uygulamayı yaparken ufak bi hata aldım ama yorumları okuyunca çözdüm, teşekkürler herkese.

Yorum Yaz