В Laravel 13.9.0 добавили метод Password::toPasswordRulesString(), поддержку метрик очередей в Laravel Cloud, возможность хранения больших SQS payload на диске и несколько улучшений для очередей, миграций и dependency injection.
Password::toPasswordRulesString()
Правило валидации Password получило метод toPasswordRulesString(), который преобразует настройки пароля в HTML-атрибут passwordrules. Это позволяет браузерам и менеджерам паролей автоматически генерировать пароль, соответствующий требованиям приложения.
Поддерживаются следующие преобразования:
min(n)→minlength: nmax(n)→maxlength: nletters()→required: lowermixedCase()→required: lower; required: uppernumbers()→required: digitsymbols()→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— диск для хранения payloadprefix— префикс пути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-операций