Оптимізуйте очищення конвеєра за допомогою методу finally в Laravel

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 21 травня, 2025
В Laravel з'явився метод finally, який революційно змінює управління очисткою після виконання пірамід, роблячи код простішим і зрозумілішим. Які переваги надає цей новий підхід у складних операціях? Читайте далі, щоб дізнатися більше!

Laravel покращує управління пайплайнами завдяки запровадженню методу finally, який пропонує елегантніший спосіб обробки операцій після виконання пайплайну, незалежно від результату — успіху чи невдачі

Раніше для управління операціями очищення в пайплайнах Laravel потрібно було обгортати логіку пайплайнів в блоки try-finally. Новий метод finally інтегрує очищення безпосередньо в ланцюг пайплайна, створюючи більш зрозумілий і підтримуваний код:

$result = Pipeline::send($order)
    ->through([StepOne::class, StepTwo::class])
    ->finally(fn () => /** виконати очищення */)
    ->then(fn () => $order->process());

Цей підхід особливо ефективний у складних операціях, де важливо гарантовано здійснити очищення ресурсів:

class OrderProcessor
{
    public function process(Order $order)
    {
        return Pipeline::send($order)
            ->through([
                ValidateInventory::class,
                CalculateShipping::class,
                ProcessPayment::class,
                UpdateInventory::class
            ])
            ->finally(function () use ($order) {
                // Завжди звільняємо резервування товару
                InventoryManager::releaseHolds($order->id);
 
                // Очищаємо блокування процесу
                Cache::forget("order-processing:{$order->id}");
 
                // Оновлюємо часову мітку статусу замовлення
                $order->update(['processed_at' => now()]);
 
                // Надсилаємо сповіщення незалежно від результату
                event(new OrderProcessingCompleted($order));
            })
            ->then(fn () => $this->completeOrder($order));
    }
 
    protected function completeOrder(Order $order)
    {
        return [
            'status' => 'processed',
            'order_id' => $order->id,
            'total' => $order->total
        ];
    }
}

Метод finally має кілька переваг над традиційними блоками try-finally. Він дозволяє зберігати логіку очищення в потоці пайплайна, створюючи більш природний прогрес коду, який легше зрозуміти. Цей підхід є особливо цінним при обробці складних операцій, що вимагають належного управління ресурсами