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.