Метод пакетної обробки в HTTP Client у Laravel 12.32

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 07 жовтня, 2025
Цього тижня команда Laravel представила версію 12.32.0, яка включає нові можливості, зокрема метод пакетних HTTP-запитів та підтримку обробки помилок у пакетних джобах. Читайте далі, щоб дізнатися, як ці нововведення полегшать вашу роботу з бібліотекою

Команда Laravel цього тижня випустила версію 12.32.0, яка містить нові можливості, такі як метод HTTP batch, метод "after" для контролю швидкості обмеження за відповіддю, підтримка колбеків для невдач пакетних задач та інше

# HTTP Batch Запити

Wendell Adriel додав метод Http::batch(), який дозволяє працювати з паралельними запитами в пакетному режимі і визначати різні колбеки для життєвого циклу пакету:

use Illuminate\Http\Client\Batch;
use Illuminate\Http\Client\RequestException;
use Illuminate\Http\Client\Response;
use Illuminate\Support\Facades\Http;

$responses = Http::batch(fn (Batch $batch) => [
    $batch->get('http://localhost/first'),
    $batch->get('http://localhost/second'),
    $batch->get('http://localhost/third'),
])->before(function (Batch $batch) {
    // Пакет створено, але запити ще не ініціалізовані...
})->progress(function (Batch $batch, int|string $key, Response $response) {
    // Конкретний запит успішно завершено...
})->then(function (Batch $batch, array $results) {
    // Всі запити успішно завершено...
})->catch(function (Batch $batch, int|string $key, Response|RequestException $response) {
    // Виявлено невдачу першого запиту в пакеті...
})->finally(function (Batch $batch, array $results) {
    // Виконання пакету завершено...
})->send();

Ви також можете називати свої запити за допомогою методу as():

$responses = Http::batch(fn (Batch $batch) => [
    $batch->as('first')->get('http://localhost/first'),
    $batch->as('second')->get('http://localhost/second'),
    $batch->as('third')->get('http://localhost/third'),
])->send();

Крім того, пакет HTTP має різні властивості та методи для перевірки статусу:

// Кількість запитів у пакеті...
$batch->totalRequests;

// Кількість запитів, які ще не оброблені...
$batch->pendingRequests;

// Кількість запитів, що завершилися невдачею...
$batch->failedRequests;

// Кількість оброблених запитів...
$batch->processedRequests();

$batch->finished(); // Bool
$batch->hasFailures(); // Bool

Деталі реалізації можна знайти в Pull Request #56946. Документація з пакетних запитів містить додаткову інформацію про використання.

# Підтримка Колбеків afterRollback() для Бази Даних

Malte Kuhr додав метод afterRollback(), який реагує на скасування транзакцій:

use Illuminate\Support\Facades\DB;

DB::transaction(function () {
    DB::afterCommit(function () {
        // ...
    });

    DB::afterRollBack(function () {
        // ...
    });

    // Виконати код в рамках транзакції...
    // Якщо транзакція зазнає невдачі, запуститься колбек `afterRollback()`.
});

# Підтримка Колбеків Невдач Пакетних Завдань

Yitz Willroth оновив PendingBatch::allowFailures(), щоб приймати колбеки або масив колбеків. Раніше це дозволяло позначити пакети, які могли відключити стандартну поведінку скасування при невдачах. Якщо ви передасте колбек (нова поведінка), він запуститься при кожній невдачі:

// Новий приклад використання:
$batch->allowFailures(function ($batch, $exception) {
    // Обробка невдачі окремої роботи
    Log::error("Запит не вдався в пакеті {$batch->id}: {$exception->getMessage()}");
});

Деталі реалізації і обговорення можна знайти в Pull Request #55916.

# Введення "after" для Обмеження Швидкості

Tim MacDonald додав метод after(), який ви можете використовувати для обмеження швидкості на основі відповіді. Він зазначив таке в своєму запиті:

Зараз можна обмежувати швидкість лише на основі запиту. Часто корисно обмежити швидкість на основі відповіді.

З оригінального PR: Наприклад, уявіть, що у вас є точка реєстрації, яка може повертати помилки валідації. Якщо ви хочете обмежити реєстрацію до одного запиту на день для IP адреси, будь-яка відповідь з помилкою валідації спровокує обмежувач швидкості, ускладнюючи повторну реєстрацію протягом дня.

Ще один приклад — обмеження 404 відповідей, щоб запобігти атакам на ідентифікатори ресурсів. Якщо окрема користувач отримує певний рівень відповідей 404 за короткий проміжок часу, це може свідчити про спроби атаки на ідентифікаційні дані.

Ось приклад, як можна використовувати цей колбек:

use Illuminate\Http\Request;
use Illuminate\Support\Facades\RateLimiter;
use Symfony\Component\HttpFoundation\Response;

/*
 * Забезпечити, щоб користувач міг отримати тільки десять 404 відповідей за хвилину, перш ніж їх
 * швидкість обмежиться, щоб запобігти перерахуванню ідентифікаторів ресурсів.
 */
RateLimiter::for('resource-not-found', function (Request $request) {
    return Limit::perMinute(10)
        ->by("user:{$request->user()->id}")

        // Новий хук `after`...
        
        ->after(function (Response $response) {
            return $response->getStatusCode() === 404;
        });
});

# Примітки до випуску

Повний список нових функцій та оновлень ви можете переглянути нижче, а також порівняння між 12.31.0 та 12.32.0 на GitHub. Нижче наведені примітки до випуску з changelog:

# v12.32.0