Laravel 13.9.0: генерация passwordrules и улучшения очередей

В Laravel 13.9.0 добавили метод Password::toPasswordRulesString(), поддержку метрик очередей в Laravel Cloud, возможность хранения больших SQS payload на диске и несколько улучшений для очередей, миграций и dependency injection.

Password::toPasswordRulesString()

Правило валидации Password получило метод toPasswordRulesString(), который преобразует настройки пароля в HTML-атрибут passwordrules. Это позволяет браузерам и менеджерам паролей автоматически генерировать пароль, соответствующий требованиям приложения.

Поддерживаются следующие преобразования:

  • min(n)minlength: n

  • max(n)maxlength: n

  • letters()required: lower

  • mixedCase()required: lower; required: upper

  • numbers()required: digit

  • symbols()required: special

Метод uncompromised() не имеет аналога в passwordrules, поэтому в результат не включается.

Примеры:

Password::min(8)->toPasswordRulesString();
// 'minlength: 8;'

Password::min(8)->max(64)->toPasswordRulesString();
// 'minlength: 8; maxlength: 64;'

Password::min(8)->letters()->toPasswordRulesString();
// 'minlength: 8; required: lower;'

Password::min(8)->mixedCase()->toPasswordRulesString();
// 'minlength: 8; required: lower; required: upper;'

Password::min(12)
    ->max(64)
    ->mixedCase()
    ->numbers()
    ->symbols()
    ->toPasswordRulesString();
// 'minlength: 12; maxlength: 64; required: lower; required: upper; required: digit; required: special;'

Практический сценарий использования это объединение Password::defaults() и HTML-атрибута passwordrules, чтобы серверная валидация и подсказки браузера использовали одинаковые правила:

// app/Providers/AppServiceProvider.php

Password::defaults(fn () => Password::min(12)
    ->max(64)
    ->mixedCase()
    ->numbers()
    ->symbols());
<input
    type="password"
    autocomplete="new-password"
    passwordrules="{{ Password::defaults()->toPasswordRulesString() }}"
/>

В поддерживаемых браузерах и менеджерах паролей пользователь получит автоматически сгенерированный пароль, который сразу проходит валидацию.

Метрики очередей в Laravel Cloud

Laravel Cloud получил поддержку метрик для queue connections. Новый декоратор Illuminate\Foundation\Cloud\Queue оборачивает драйвер очереди и отправляет события при постановке задач в очередь, старте и завершении обработки. Это позволяет отслеживать throughput, время обработки задач и активность воркеров.

Также появилась поддержка config:cache для Cloud queues. Значения prefix и suffix теперь читаются из конфигурации, а не напрямую из environment variables.

Хранение больших SQS payload на диске

AWS SQS ограничивает размер сообщения до 1 МБ. В Laravel 13.9.0 появился встроенный механизм для хранения больших payload на файловой системе, например в S3. В очередь отправляется только ссылка на payload, а воркер загружает содержимое во время обработки задачи.

Пример конфигурации:

// config/queue.php

'sqs' => [
    // ...
    'extended_store_options' => [
        'enabled' => env('SQS_STORE_ENABLED', false),
        'disk' => env('SQS_STORE_DISK', 's3'),
        'prefix' => env('SQS_STORE_PREFIX', ''),
        'always' => false,
        'cleanup' => true,
    ],
],

Доступны следующие параметры:

  • enabled — включает или отключает механизм

  • disk — диск для хранения payload

  • prefix — префикс пути

  • always — сохранять все payload независимо от размера

  • cleanup — удалять файл после успешной обработки

Функция является opt-in и не влияет на существующие SQS-конфигурации, пока enabled не установлен в true.

Поддержка timeout в Concurrency::run()

Метод Concurrency::run() получил параметр timeout для process driver:

Concurrency::run([
    fn () => longRunningTask(),
], timeout: 300);

Fork driver не изменился, поскольку spatie/fork не поддерживает timeout. Sync driver также сохранил прежнее поведение.

PendingDispatch теперь поддерживает when() и unless()

Класс PendingDispatch теперь использует trait Conditionable, благодаря чему можно применять when() и unless() прямо при dispatch:

SendPersonalDetailsToFraudDetectionTool::dispatch($customer)
    ->when(
        $customer->hasSufficientPersonalDetails(),
        fn ($job) => $job->withoutDelay()
    );
SendPersonalDetailsToFraudDetectionTool::dispatch($customer)
    ->unless(
        $customer->hasSufficientPersonalDetails(),
        fn ($job) => $job->delay(180)
    );

Это позволяет избегать отдельных условных конструкций вокруг dispatch-вызова.

Интерфейс PreparesForDispatch

Добавлен интерфейс PreparesForDispatch с методом prepareForDispatch(), который вызывается перед отправкой задачи в очередь. Метод может вернуть false, чтобы отменить dispatch.

Пример:

use Illuminate\Contracts\Queue\PreparesForDispatch;

class SyncPodcastsJob implements ShouldQueue, PreparesForDispatch
{
    use Queueable;

    public function __construct(public array $podcastIds) {}

    public function prepareForDispatch(): bool
    {
        $this->podcastIds = array_unique($this->podcastIds);

        return count($this->podcastIds) > 0;
    }

    public function handle(): void
    {
        // ...
    }
}

Такой подход позволяет централизовать подготовку данных перед постановкой задачи в очередь.

foreignUuidFor() для миграций

В schema blueprint появился метод foreignUuidFor() для создания UUID foreign key:

$table->foreignUuidFor(User::class)->constrained();

Laravel автоматически определяет имя колонки, связанную таблицу и primary key.

Closure в ThrottlesExceptions::backoff()

Метод backoff() middleware ThrottlesExceptions теперь принимает Closure с объектом исключения:

(new ThrottlesExceptions(maxAttempts: 10, decaySeconds: 300))
    ->byJob()
    ->when(fn (Throwable $e) =>
        $e instanceof ExternalAPIException &&
        $e->isRateLimited()
    )
    ->backoff(fn (Throwable $e) =>
        $e instanceof ExternalAPIException
            ? $e->retryAfter() / 60
            : 2
    );

Это позволяет использовать данные исключения, например Retry-After, для вычисления времени повторной попытки.

Поддержка enum в contextual attributes

Атрибуты #[Auth], #[Authenticated] и #[Cache] теперь поддерживают UnitEnum и backed enum:

use App\Enums\AuthGuard;

use Illuminate\Container\Attributes\Auth;

public function __construct(
    #[Auth(AuthGuard::Admin)]
    protected Guard $adminGuard,
) {}

Теперь enum можно использовать для указания guard и cache store в dependency injection.

Прочие изменения

Среди остальных изменений:

  • Storage::cloud() теперь работает с scoped disks

  • события MigrationStarted и MigrationEnded включают имя миграции

  • появился WORKER_TIMEOUT_EXIT_CODE

  • исправлена сериализация multipart в Guzzle PSR-7

  • paginate methods получили generic return types

  • Lottery сбрасывается после завершения тестов

  • исправлена работа custom AWS credential providers

  • добавлены Unicode modifiers для некоторых regex-операций

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

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

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

Laravel 13.4.0: строгий режим FormRequest и инспекция очередей

Обновление Laravel 13.4.0 добавляет строгий режим для FormRequest, улучшения работы с очередями и поддержку атрибута Delay. Также включены исправления валидации и обновления Carbon.

Разработка и инструменты 5 месяцев назад

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

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