В версии 13.6.0 фреймворка Laravel добавлена поддержка debounce для заданий очереди, JSON-ответы для health route, новый форматтер логов и интеграция с Cloudflare Email Service.
Debounce для queued jobs
Добавлен механизм debounce для заданий очереди. Если одно и то же задание отправляется несколько раз в течение заданного интервала, выполнится только последнее, остальные будут отброшены при выполнении.
Для этого используется атрибут #[DebounceFor]:
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Queue\Attributes\DebounceFor;
#[DebounceFor(30)]
class RebuildSearchIndex implements ShouldQueue
{
use Dispatchable, InteractsWithQueue, Queueable;
public function __construct(public int $documentId) {}
public function debounceId(): string
{
return (string) $this->documentId;
}
public function handle(): void
{
SearchIndex::rebuild($this->documentId);
}
}
// Если пользователь изменяет документ 10 раз за 30 секунд то выполнится только последнее задание
RebuildSearchIndex::dispatch($document->id);Debounce можно задать и при отправке задания:
dispatch(new SyncExternalData($accountId))->debounceFor(30);Поддерживается параметр maxWait, ограничивающий максимальную задержку выполнения:
#[DebounceFor(30, maxWait: 120)]
class SyncDashboard implements ShouldQueue { ... }Этот механизм отличается от ShouldBeUnique: debounce оставляет последнее задание, а ShouldBeUnique блокирует повторные отправки на этапе dispatch.
JSON-ответы для health route
Встроенный маршрут /up теперь возвращает JSON, если запрос ожидает JSON. Ранее он всегда возвращал HTML.
При успешной работе:
{"status": "Application is up"}Если обработчик DiagnosingHealth выбрасывает исключение и отключён debug-режим:
{"status": "Application experiencing problems"}HTTP-коды остаются прежними (200 или 500), а для обычных запросов по-прежнему возвращается HTML-страница.
JsonFormatter для логирования
Добавлен JsonFormatter для структурированных JSON-логов, удобных для систем агрегации логов.
use Monolog\Handler\StreamHandler;
use Monolog\Logger;
use Illuminate\Support\Facades\Log;
$handler = new StreamHandler('php://stdout');
$handler->setFormatter(new \Illuminate\Log\Formatters\JsonFormatter);
Log::build(['handler' => $handler])
->info('User logged in', ['user_id' => 1]);Поддержка Cloudflare Email Service
Добавлена интеграция с сервисом отправки почты Cloudflare. Настройка выполняется в config/services.php:
'cloudflare' => [
'account_id' => env('CLOUDFLARE_ACCOUNT_ID'),
'token' => env('CLOUDFLARE_TOKEN'),
],Массив pivot-данных в hasAttached
Метод hasAttached в фабриках теперь принимает массив массивов pivot-данных, что позволяет задавать разные значения для связанных записей.
$user = User::factory()
->hasAttached(Role::factory()->count(2), [
['admin' => 'Y'],
['admin' => 'N'],
])
->create();Улучшения assertions для моделей
В тестах теперь можно проверять несколько записей одним вызовом:
$this->assertDatabaseHas(User::class, [
['name' => 'Alice', 'email' => 'alice@example.com'],
['name' => 'Bob', 'email' => 'bob@example.com'],
]);
$this->assertDatabaseMissing(User::class, [
['name' => 'Charlie', 'email' => 'charlie@example.com'],
]);Прочие изменения
В очередях добавлена поддержка именованных провайдеров учётных данных для SQS и исправлено поведение Queue::route. Валидация получила исправления для digits_between и правил работы с числовыми значениями. Добавлена поддержка enum в нескольких менеджерах, улучшена обработка ошибок и проведены оптимизации производительности.