Laravel 13.19: поддержка HTTP QUERY, новые методы для коллекций и строк

Laravel 13.19 расширяет поддержку HTTP-метода QUERY в HTTP-клиенте и средствах тестирования, а также включает несколько улучшений для коллекций, строковых помощников и очередей, помимо традиционных исправлений.

В этом релизе появились:

  • поддержка метода Http::query() для отправки HTTP-запросов с методом QUERY;

  • методы query() и queryJson() для HTTP-тестов;

  • новый метод коллекций reduceInto();

  • метод counted() для Str и Stringable;

  • пакетная отправка сообщений в Amazon SQS через SendMessageBatch и возможность проверки зарезервированных заданий в Queue Fake.

Метод Http::query()

HTTP-клиент Laravel получил новый метод query(), предназначенный для отправки запросов с HTTP-методом QUERY. В отличие от обычных GET-запросов, параметры передаются в теле запроса, а не в URL.

По поведению новый метод аналогичен post(), put() и patch(): по умолчанию данные отправляются в формате JSON, а при использовании asForm() как данные формы.

$response = Http::query('https://api.example.com/search', [
    'filter' => ['status' => 'active'],
]);

При этом существующие способы передачи параметров запроса остаются без изменений. Методы withQueryParameters() и аргумент $query у get() продолжают работать так же, как и раньше.

Методы query() и queryJson() для тестирования

Вместе с новым методом HTTP-клиента Laravel добавляет поддержку QUERY-запросов и в средства тестирования.

Появились методы query() и queryJson(), которые работают аналогично delete() и deleteJson(), но предназначены для тестирования маршрутов, обрабатывающих HTTP QUERY. Передаваемые данные помещаются в тело запроса.

Route::match(['QUERY'], '/search', fn () => request()->input('filter'));

$this->queryJson('/search', ['filter' => 'active'])->assertOk();

Метод reduceInto() для коллекций

Новый метод reduceInto() представляет собой альтернативу reduce() для случаев, когда аккумулятор изменяется "на месте", а не возвращается заново после каждой итерации. В функцию обратного вызова передаются аккумулятор и текущий элемент коллекции. Возвращаемое значение при этом игнорируется, поэтому при использовании объектов их не нужно возвращать вручную.

$stats = $orders->reduceInto(new OrderStats, function ($stats, $order) {
    $stats->total += $order->amount;
    $stats->count++;
    $stats->largest = max($stats->largest, $order->amount);
});

Если аккумулятором является массив или скалярное значение, его необходимо передавать по ссылке.

$tagsMap = $posts->reduceInto([], function (&$map, $post) {
    $post->tags->each(fn ($tag) => $map[$tag][] = $post->title);
});

Метод counted() для строк

Классы Str и Stringable получили новый метод counted(). Он автоматически склоняет слово в зависимости от количества и сразу добавляет перед ним числовое значение.

Фактически это сокращённая запись вызова plural($count, prependCount: true).

str('order')->counted(1); // "1 order"
str('order')->counted(2); // "2 orders"

Улучшения очередей

Laravel оптимизировал пакетную отправку сообщений в Amazon SQS. Теперь при массовой отправке используется API SendMessageBatch вместо выполнения отдельного запроса для каждого задания, что уменьшает количество обращений к сервису.

Кроме того, Queue Fake теперь позволяет проверять зарезервированные задания. Это даёт возможность писать тесты для задач, которые уже были получены обработчиком очереди, но ещё не завершили выполнение.

Другие исправления и улучшения

В Laravel 13.19 также вошли несколько дополнительных изменений:

  • параметр deletedAtColumn теперь передаётся в методы assertSoftDeleted() и assertNotSoftDeleted();

  • параметры конфигурации почты теперь можно определять без указания имени;

  • значение стиля по умолчанию в ComponentAttributeBag::merge() теперь корректно завершается точкой с запятой;

  • добавлены тесты для условий с относительными датами и методов past() и future() в правилах проверки дат.

Похожие статьи

Рекомендательные технологии Подробнее

4 полезных способа использования Array.map() в JavaScript

Разбираем четыре практических способа использования метода Array.map() в JavaScript: преобразование данных, работа со строками, генерация списков и трансформация объектов.

Вышла версия OpenVPN 2.7 с поддержкой модуля DCO для Linux-ядра и mbedTLS 4

OpenVPN 2.7 вышла с поддержкой ускоренного модуля DCO для Linux-ядра, улучшенной серверной архитектурой, обновлённой работой с DNS и расширенной поддержкой TLS через mbedTLS 4.