Laravel 13.6.0: debounce для очередей и JSON-ответы health route

В версии 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 в нескольких менеджерах, улучшена обработка ошибок и проведены оптимизации производительности.

Комментарии (0)

Войдите, чтобы оставить комментарий

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

Как создать AI-агента на Python с OpenAI для автоматического парсинга счетов

Подробный гайд, как разработать полноценного AI-агента на Python и OpenAI API, который автоматически парсит счета (PDF, фото), вытягивает данные в структурированный JSON, валидирует их и сохраняет в CSV или базу. Плюс интеграция с Telegram-ботом для загрузки документов.

Laravel 12.44: добавлены HTTP-клиентские callbacks после получения ответа

Обзор релиза Laravel 12.44: добавлен метод afterResponse() для HTTP-клиента, новые методы для тестов и улучшенная валидация дат. Поясняется, как использовать новые фичи на практике.

Почему стоит использовать Python для скриптов

Почему Bash-скрипты часто ломаются на macOS и в CI, и как Python решает эту проблему. Разбираем, в каких случаях Python лучше подходит для автоматизации, чем bash, и почему он делает скрипты понятнее, стабильнее и кросс-платформеннее.