У Laravel 13.22 з’явився атрибут #[BindWhen] для умовного зв’язування в контейнері, метод Validator::fakeDnsLookups() для тестування правил валідації через DNS, а також підтримка атрибута #[Delay] для пакетних і масових завдань. Крім того, команда queue:clear тепер дозволяє вказувати назви черг через кому. Реліз версії 13.22.0 відбувся 24 липня 2026 року.
- Атрибут
#[BindWhen]для умовного зв'язування залежностей (container bindings). - Фейкові DNS-запити для правил валідації
active_urlтаemail:dns. - Підтримка атрибута
#[Delay]дляBus::batch()таQueue::bulk(). - Можливість очищення кількох черг одночасно в
queue:clear. - Підтримка макросів для
RateLimiter, відновлення потокових тіл (stream bodies) у фейкових HTTP-відповідях та низка виправлень.
# Що нового
# Атрибут #[BindWhen] для умовних зв'язувань
Атрибут #[Bind] дозволяє пов’язати інтерфейс із конкретною реалізацією, проте раніше умови можна було задавати лише через аргумент environments. Новий атрибут #[BindWhen] приймає closure (замикання), що отримує примірник контейнера. Це дозволяє реалізувати гнучку логіку: наприклад, змінювати реалізацію залежно від конфігурації, feature flags або інших параметрів під час виконання програми:
use Illuminate\Container\Attributes\Bind;
use Illuminate\Container\Attributes\BindWhen;
#[BindWhen(BetaPaymentGateway::class, static function ($container) {
return $container->make('config')->get('features.payments.beta');
})]
#[Bind(FakePaymentGateway::class, environments: ['local', 'testing'])]
#[Bind(StripePaymentGateway::class)]
interface PaymentGatewayInterface {}
Атрибут можна використовувати кілька разів. Умови перевіряються в порядку їх оголошення, тому специфічні правила можна ставити перед стандартним #[Bind]. Зверніть увагу: використання closure в аргументах атрибутів — це можливість PHP 8.5. Автор нововведення — @ziadoz.
# Імітація DNS-запитів у валідації
Правило active_url та параметр dns у правилі email виконують реальні мережеві запити. Це робить тести залежними від інтернет-з'єднання та може призводити до випадкових помилок. Новий метод fakeDnsLookups() дозволяє імітувати ці запити, не порушуючи логіку перевірки формату даних:
use Illuminate\Support\Facades\Validator;
protected function setUp(): void
{
parent::setUp();
Validator::fakeDnsLookups();
}
Некоректні URL або адреси все одно не пройдуть валідацію, але система більше не звертатиметься до реальної мережі. Вимкнути імітацію можна, передавши false. Автор — @SjorsO.
# Підтримка #[Delay] для пакетних і масових відправок
Раніше завдання з атрибутом #[Delay] спрацьовували із затримкою лише при індивідуальному відправленні. Методи Bus::batch() та Queue::bulk() враховували лише властивість $delay, ігноруючи атрибут. Тепер драйвери черг перевіряють обидва варіанти, що гарантує стабільну поведінку незалежно від способу відправки:
use Illuminate\Queue\Attributes\Delay;
#[Delay(15)]
class ProcessPodcast implements ShouldQueue
{
use Queueable;
}
Bus::batch([new ProcessPodcast])->dispatch();
Автор — @jackbayliss.
# Очищення кількох черг у queue:clear
Команда queue:clear тепер приймає назви черг через кому, аналогічно до команд queue:work та queue:listen:
php artisan queue:clear redis --queue=high,low,emails
Зайві пробіли автоматично видаляються, а дублікати назв ігноруються. Автор — @miladshakerdn.
# Інші виправлення та покращення
- Клас
RateLimiterтепер підтримує макроси, аQueueFakeотримав методcreationTimeOfOldestPendingJob()для коректного тестування часу очікування завдань. - Виправлено регресію у фейкових HTTP-відповідях: вони знову підтримують PSR-7
StreamInterfaceта ресурси PHP. - Подія
JobReleasedAfterExceptionтепер містить інформацію про виняток (exception), що спричинив повернення завдання в чергу. - Виправлено параметр назви черги в
Mailer::later()та обробку терміну дії вCache::touch(). - Відновлено підтримку ітерованих об’єктів у методах
Arr::every(),Arr::some()таArr::last(). - Дані для автентифікації в HTTP-тестах тепер позначені як
sensitive parameters, щоб вони не потрапляли до stack traces. - Методи
Str::ucfirst()таStr::lcfirst()тепер використовують нативні мультибайтні функції PHP 8.4, а розпізнавання атрибутів класів тепер працює і для трейтів (traits).
Примітки щодо оновлення
Для стандартних застосунків оновлення не містить критичних змін. Пам’ятайте, що #[BindWhen] потребує PHP 8.5 через використання closure в атрибутах. Детальний перелік усіх змін можна знайти в changelog.
Посилання
- Офіційний changelog
- Порівняння версій v13.21.1...v13.22.0
- PR: #60862 (атрибут
#[BindWhen]) - PR: #60879 (фейкові DNS-запити)
- PR: #60766 (атрибут
#[Delay]у батчах) - PR: #60873 (мультичерги в
queue:clear)