Команда Laravel цього тижня випустила версію 12.32.0, яка містить нові можливості, такі як метод HTTP batch, метод "after" для контролю швидкості обмеження за відповіддю, підтримка колбеків для невдач пакетних задач та інше
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. Документація з пакетних запитів містить додаткову інформацію про використання.
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.
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:
e() від @Carnicero90 в https://github.com/laravel/framework/pull/57157Arr від @daniser в https://github.com/laravel/framework/pull/57165can та успадкування моделей у групах маршрутів від @bonroyage в https://github.com/laravel/framework/pull/57172ThrottleRequests::using від @sethsandaru в https://github.com/laravel/framework/pull/57190pre-package-uninstall від @cosmastech в https://github.com/laravel/framework/pull/57144queue відповідно до поведінки функції від @MrYamous в https://github.com/laravel/framework/pull/57207