Команда 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
- [12.x] виправлення помилки статичного аналізу від @cosmastech в https://github.com/laravel/framework/pull/57162
- Виправлено: Обробка ненадрукованих результатів з Htmlable::toHtml() у допоміжному методі
e()від @Carnicero90 в https://github.com/laravel/framework/pull/57157 - [12.x] виправлено атрибути, що очікують у групі розкладу від @jamessa в https://github.com/laravel/framework/pull/57156
- Прибрано огляд запиту з винятків від @barryvdh в https://github.com/laravel/framework/pull/57158
- [12.x] передача опції "throw" з обмеженого диска на батьківський диск від @daniser в https://github.com/laravel/framework/pull/57163
- [12.x] приведення типу документації у відповідність з фактичним типом повернення від @parijke в https://github.com/laravel/framework/pull/57164
- [12.x] коригування типу
Arrвід @daniser в https://github.com/laravel/framework/pull/57165 - [12.x] відстеження оформлення адаптера файлової системи від @daniser в https://github.com/laravel/framework/pull/57167
- [12.x] підтримка колбеків невдач пакетних завдань від @yitzwillroth в https://github.com/laravel/framework/pull/55916
- [12.x] виправлено пріоритет операторів від @daniser в https://github.com/laravel/framework/pull/57169
- [12.x] очищення після тестів менеджера файлової системи від @daniser в https://github.com/laravel/framework/pull/57168
- Виправлено: поліпшення зручності використання validateInteger та виправлення зворотної сумісності від @ntm-dev в https://github.com/laravel/framework/pull/57175
- [12.x] виправлено вкладений
canта успадкування моделей у групах маршрутів від @bonroyage в https://github.com/laravel/framework/pull/57172 - [12.x] синтаксичне підсвічування на фронтенді від @avosalmon в https://github.com/laravel/framework/pull/57184
- [12.x] додано відсутній тип замикання до документування методу Collection::pluck() від @Bariss61 в https://github.com/laravel/framework/pull/57178
- Додано підтримку колбеків afterRollback для бази даних та тести від @maltekuhr в https://github.com/laravel/framework/pull/57180
- Виправлення: додавання типу повернення від @alipowerful7 в https://github.com/laravel/framework/pull/57192
- [12.x] додано підтримку enum для методу
ThrottleRequests::usingвід @sethsandaru в https://github.com/laravel/framework/pull/57190 - [12.x] введення "after" для обмеження швидкості від @timacdonald в https://github.com/laravel/framework/pull/57125
- [12.x] JSON схема дозволяє null від @Katalam в https://github.com/laravel/framework/pull/57181
- [12.x] відправлення подій фреймворку на подію композитора
pre-package-uninstallвід @cosmastech в https://github.com/laravel/framework/pull/57144 - [12.x] додання методу Http::batch від @WendellAdriel в https://github.com/laravel/framework/pull/56946
- [12.x] [Mail] оновлення документації
queueвідповідно до поведінки функції від @MrYamous в https://github.com/laravel/framework/pull/57207 - [12.x] видалення зайвих дужок від @AhmedAlaa4611 в https://github.com/laravel/framework/pull/57212
- [12.x] виправлення генератора помилок для сторінки звіту від @xiCO2k в https://github.com/laravel/framework/pull/57208
- [12.x] розширення підтримки SQS FIFO та справедливої черги від @patrickcarlohickman в https://github.com/laravel/framework/pull/57187