Laravel 13.22: атрибут BindWhen для контейнера та умовне зв’язування залежностей

Перекладено ШІ 0 Laravel News 28 липня, 2026

Laravel 13.22 представляє атрибут #[BindWhen] для гнучкого керування контейнером та спрощує тестування валідації завдяки імітації DNS-запитів. Оновлення також приносить розширену підтримку атрибута #[Delay] для черг та можливість очищення кількох черг одночасно.

У 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.

Посилання

Популярні

Інше, що варто прочитати

51 Оновлено 26 червня, 2026

Nuxt 3 + Laravel Sanctum: Просте та надійне рішення для автентифікації вашого SPA та API

У сучасній веб-розробці аутентифікація є ключовою для захисту додатків і даних користувачів. Дізнайтеся, як модуль nuxt-sanctum-authentication спростить інтеграцію між Nuxt 3 та Laravel Sanctum, забезпечуючи надійний і зручний спосіб реалізації аутентифікації для вашого проєкту

Використання повнотекстового пошуку в Laravel
178 Оновлено 26 червня, 2026

Використання повнотекстового пошуку в Laravel

Laravel пропонує потужні можливості повнотекстового пошуку за допомогою методів whereFullText та orWhereFullText, що дозволяють здійснювати складні запити до бази даних. Дізнайтеся, як реалізувати ефективний пошук для вашого блогу чи системи управління контентом

38 Оновлено 26 червня, 2026

4 поширені помилки Vite у Laravel

Використання Vite для створення фронтенд-ресурсів у вашому додатку Laravel може бути захоплюючим, але іноді ви можете стикнутися з певними помилками. У цій статті ми розглянемо чотири поширені помилки, з якими ви можете зіткнутися, а також підкажемо способи їх усунення, щоб ви могли знову зосередитися на розробці вашого додатку