Laravel nâng cao

Laravel Pipeline Pattern: Viết code sạch cho quy trình xử lý phức tạp

Refactor 'God Controller' thành chuỗi xử lý Pipeline thanh lịch. Cách áp dụng Design Pattern này để code Laravel dễ đọc và dễ test hơn.

newspaper

Phạm Hoàng Long

6 tháng 1, 2026 schedule 2 phút đọc
Laravel Pipeline Pattern: Viết code sạch cho quy trình xử lý phức tạp
Featured Image

Bạn có một Controller xử lý “Place Order” dài 500 dòng?

  1. Check tồn kho
  2. Validate coupon
  3. Tính thuế
  4. Charge thẻ tín dụng
  5. Gửi email confirm
  6. Notify Slack team

Nếu viết hết vào một function method: ác mộng để test và maintain.

Laravel cung cấp một công cụ ẩn rất mạnh: Illuminate\Pipeline\Pipeline. Đây chính là cơ chế vận hành Middleware của Laravel, nhưng bạn có thể dùng nó cho Business Logic của mình.

Cách Implement

Đầu tiên, hãy định nghĩa các “Pipe” (các bước xử lý). Mỗi Pipe là một class.

// app/Pipes/CheckInventory.php
class CheckInventory
{
    public function handle($order, Closure $next)
    {
        if (!Inventory::check($order->items)) {
            throw new Exception("Out of stock");
        }
        
        return $next($order);
    }
}

// app/Pipes/ApplyDiscount.php
class ApplyDiscount
{
    public function handle($order, Closure $next)
    {
        if ($order->coupon) {
            $order->total -= Coupon::calculate($order->coupon);
        }
        
        return $next($order);
    }
}

Sau đó, sử dụng Pipeline trong Controller hoặc Service:

use Illuminate\Pipeline\Pipeline;

public function store(Request $request)
{
    $order = new Order($request->all());
    
    $processedOrder = app(Pipeline::class)
        ->send($order)
        ->through([
            \App\Pipes\CheckInventory::class,
            \App\Pipes\ApplyDiscount::class,
            \App\Pipes\CalculateTax::class,
            \App\Pipes\ProcessPayment::class,
        ])
        ->then(function ($order) {
            $order->save();
            return $order;
        });

    return response()->json($processedOrder);
}

Tại sao nó tuyệt vời?

  1. Single Responsibility: Mỗi class chỉ làm một việc duy nhất (Check kho riêng, Tính tiền riêng).
  2. Testability: Bạn có thể viết Unit Test cho từng Pipe cực dễ, không cần mock cả thế giới.
  3. Flexibility: Muốn tạm tắt chức năng Discount? Comment dòng ApplyDiscount::class. Muốn thêm bước Log? Thêm LogStep::class. Không cần sửa logic chính.

Khi nào dùng?

  • Quy trình Checkout / Payment.
  • Xử lý file upload (Resize -> Watermark -> Upload S3 -> Save DB).
  • Quy trình duyệt bài (Validate -> Check Offensive Words -> Notify Admin).

Đừng lạm dụng cho CRUD đơn giản. Nhưng với complex flows, Pipeline là cứu cánh cho Clean Code.

quizQuick Quiz
Câu 1/3

Mục đích chính của Pipeline Pattern trong Laravel là gì?

history_edu Góc học tập & giải trí

Thử Thách Kiến Thức Lịch Sử?

Khám phá hàng trăm câu hỏi trắc nghiệm lịch sử thú vị tại HistoQuiz. Vừa học vừa chơi, nâng cao kiến thức ngay hôm nay!

Chơi Ngay arrow_forward