Команда Laravel випустила версії 13.21.0 та 13.21.1 21 липня 2026 року. Патч-версія лише оновлює константу версії фреймворку, тому обидва релізи розглядаються разом. Оновлення додає кілька нових можливостей, включно з атрибутом #[RouteKey] для Eloquent моделей, правилом валідації base64, атрибутом #[RequestAttribute] для контекстного впровадження, а також розширеними форматами виводу у компоненті Image.
Атрибут #[RouteKey] для Eloquent моделей
Раніше налаштування колонки для route model binding вимагало перевизначення методу getRouteKeyName() у моделі. Слідуючи патерну, закладеному атрибутами #[ObservedBy] та #[ScopedBy], тепер можна оголошувати ключ маршруту за допомогою атрибуту класу:
use Illuminate\Database\Eloquent\Attributes\RouteKey;
#[RouteKey('slug')]
class Post extends Model
{
// ...
}
З цим атрибутом неявне прив'язування моделі до маршруту визначає Post за колонкою slug, а getRouteKeyName() повертається до первинного ключа, якщо атрибут відсутній. Внесок від @nimnaherath у PR #60841.
Правило валідації base64
До перевірок формату рядків валідатора додалося правило base64, яке заповнює прогалину, вже покриту бібліотеками на кшталт Zod. Правило перевіряє, що значення є валідним Base64 рядком згідно RFC 4648:
$request->validate([
'signature' => ['required', 'base64'],
]);
Перевірка вимагає канонічного кодування: значення має декодуватися у суворому режимі та повторно кодуватися точно в той самий рядок, тому помилки padding та зайві символи провалюють валідацію. Внесок від @lucasmichot у PR #60808.
Контекстний атрибут #[RequestAttribute]
Міжпрограмне забезпечення часто зберігає визначені об'єкти у мішку атрибутів запиту, наприклад, орендаря чи організацію, визначені з API ключа. Отримання їх назад означало виклик $request->attributes->get() та ручне вказування типу. Новий контекстний атрибут #[RequestAttribute] безпосередньо впроваджує значення у визначений параметр:
use Illuminate\Container\Attributes\RequestAttribute;
class InventoryController
{
public function index(#[RequestAttribute('org')] Organization $org)
{
return $this->inventoryService->getForOrg($org);
}
}
Внесок від @cosmastech у PR #60847.
Додаткові формати виводу для компонента Image
Компонент Image, представлений у Laravel 13.20, міг конвертувати лише у WebP, JPG та JPEG через свої гнучкі методи, навіть незважаючи на те, що вбудовані кодери Intervention Image підтримують більше форматів. Цей реліз додає toPng(), toGif(), toAvif() та toBmp():
use Illuminate\Support\Facades\Image;
Image::fromUpload($request->file('avatar'))
->cover(400, 400)
->toAvif()
->quality(80)
->store('avatars');
Зміна також виправляє Image::extension(), якому бракувало відповідності MIME image/avif і який би створював розширення .bin для збереженого AVIF виводу. Внесок від @Tresor-Kasenda у PR #60713.
Налаштовуваний Application Builder
Раніше Application::configure() жорстко кодував клас ApplicationBuilder, тому пакунки, що розширюють Application Laravel, мали перевизначати весь метод для його заміни. Тепер захищена статична властивість $applicationBuilder дозволяє підкласам надавати власний клас білдера, зберігаючи існуючий API. Див. PR #60848.
Subsplit для Concurrency
Компонент Illuminate\Concurrency тепер має власний subsplit лише для читання, приєднуючись до інших компонентів Illuminate, опублікованих як окремі пакунки. Див. PR #60836.
Інші виправлення та покращення
- Колбеки відкату транзакцій бази даних тепер спрацьовують коректно (PR #60777), додано виявлення нового повідомлення про втрату з'єднання для автоматичного перепідключення (PR #60819)
- Знаки питання екрануються у
Grammar::whereColumn() (PR #60832)
- Повідомлення
InvalidPayloadException тепер включають назву завдання та чергу (PR #60799)
- Передача enum до
LogManager::forgetChannel() більше не викидає TypeError (PR #60801), а RedisTaggedCache::decrement() обробляє ключі enum (PR #60821)
Str::wordWrap() коректно обробляє багатобайтові рядки (PR #60814)
- Кешування контекстних атрибутів більше не конфліктує між властивостями одного класу (PR #60815), а хибні параметри винятків concurrency зберігаються (PR #60822)
- Виправлено парсинг порту хосту в команді
serve (PR #60828) та невизначений індекс у Pipeline\Hub::pipe() (PR #60802)