· Admin

Laravel Pipelines ile Veri İşleme Akışları

Laravel'in az bilinen ama çok güçlü özelliklerinden biri Pipeline. Middleware sistemi de aslında arka planda Pipeline kullanıyor. Veri işleme zincirlerini modüler ve test edilebilir hale getirmek için harika bir araç.

Pipeline Nedir?

Pipeline, bir veriyi sıralı aşamalardan (stage) geçirerek işleme yaklaşımı. Her aşama tek bir iş yapar ve sonraki aşamaya iletir. Unix pipe'larını düşünün: cat file | grep "error" | sort | uniq.

Laravel'deki Pipeline da aynı mantıkla çalışır:

use Illuminate\Pipeline\Pipeline;

$result = app(Pipeline::class)
    ->send($data)           // Başlangıç verisi
    ->through([              // İşlem aşamaları
        ValidateInput::class,
        SanitizeInput::class,
        FormatInput::class,
    ])
    ->thenReturn();          // Sonucu döndür

Pipeline Aşaması (Stage) Oluşturma

Her aşama bir handle metodu olan sınıf:

namespace App\Pipelines;

class ValidateInput
{
    public function handle($data, $next)
    {
        if (!isset($data['email']) || !filter_var($data['email'], FILTER_VALIDATE_EMAIL)) {
            throw new \InvalidArgumentException('Geçersiz email!');
        }

        return $next($data);
    }
}
namespace App\Pipelines;

class SanitizeInput
{
    public function handle($data, $next)
    {
        $data['name'] = trim($data['name']);
        $data['email'] = trim(strtolower($data['email']));

        return $next($data);
    }
}
namespace App\Pipelines;

class FormatInput
{
    public function handle($data, $next)
    {
        $data['name'] = mb_convert_case($data['name'], MB_CASE_TITLE, 'UTF-8');

        return $next($data);
    }
}

Gerçek Dünya Örneği: Sipariş İşleme

$order = app(Pipeline::class)
    ->send($orderData)
    ->through([
        \App\Pipelines\Order\ValidateStock::class,
        \App\Pipelines\Order\CalculateDiscount::class,
        \App\Pipelines\Order\CalculateShipping::class,
        \App\Pipelines\Order\ApplyTax::class,
        \App\Pipelines\Order\CreateOrder::class,
    ])
    ->thenReturn();

Her aşama bağımsız, test edilebilir ve yeniden kullanılabilir. Yeni bir kural eklemek mi istiyorsunuz? Array'e bir sınıf daha ekleyin.

Pipeline vs Middleware

Pipeline ve middleware aynı prensibi kullanır. Fark: middleware HTTP request/response döngüsünde çalışır, Pipeline herhangi bir veri üzerinde:

// Middleware: HTTP isteği üzerinde
public function handle(Request $request, Closure $next)

// Pipeline: Herhangi bir veri üzerinde
public function handle($data, $next)

Conditional Pipeline

Aşamaları koşullu ekleme:

$stages = [
    ValidateInput::class,
    SanitizeInput::class,
];

if ($applyDiscount) {
    $stages[] = ApplyDiscount::class;
}

$result = app(Pipeline::class)
    ->send($data)
    ->through($stages)
    ->thenReturn();

Pipeline'ın Avantajları

  • Modülerlik: Her aşama tek sorumluluk prensibine uyar
  • Okunabilirlik: İşlem akışı sıralı ve açık
  • Test edilebilirlik: Her aşama bağımsız test edilebilir
  • Bakım kolaylığı: Bir aşamayı değiştirmek diğerlerini etkilemez
  • Yeniden kullanılabilirlik: Aynı aşama farklı Pipeline'larda kullanılabilir

Ne Zaman Pipeline Kullanmalı?

  • Karmaşık veri dönüşüm zincirlerinde
  • Birden fazla validasyon/filtreleme adımında
  • Sipariş, ödeme gibi çok adımlı iş süreçlerinde
  • ETL (Extract-Transform-Load) işlemlerinde

Basit if/else yeterli olduğunda Pipeline overhead yaratır — pragmatik olun.

Sonuç

Pipeline, Laravel'in gizli silahlarından biri. Karmaşık veri işleme süreçlerini temiz, modüler ve test edilebilir hale getiriyor. Bir sonraki karmaşık işlem zincirinizde deneyin — kodunuzun ne kadar temizlendiğini göreceksiniz.