Атрибут #[RouteKey] для моделей у Laravel 13.21

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

Laravel 13.21 додає зручні атрибути #[RouteKey] та #[RequestAttribute] для лаконічного налаштування моделей і контролерів. Дізнайтеся про нову валідацію base64 та розширену підтримку форматів зображень у свіжому оновленні фреймворку.

У Laravel 13.21 з’явився атрибут класу #[RouteKey] для кастомізації route model binding в Eloquent, нове правило валідації base64, контекстний атрибут #[RequestAttribute] для ін’єкції атрибутів запиту, а також підтримка форматів PNG, GIF, AVIF та BMP у компоненті Image. Команда Laravel випустила версії v13.21.0 та v13.21.1; оскільки патч лише оновлює константу версії фреймворку, ми розглянемо їх разом.

  • Атрибут #[RouteKey] для route model binding в Eloquent
  • Нове правило валідації base64
  • Контекстний атрибут #[RequestAttribute]
  • Підтримка PNG, GIF, AVIF та BMP для компонента Image
  • Кастомізація application builder та окремий пакет illuminate/concurrency

# Що нового

# Атрибут #[RouteKey] для моделей Eloquent

Раніше для зміни колонки, що використовується в route model binding, потрібно було перевизначати метод getRouteKeyName() у моделі. Тепер, за аналогією з #[ObservedBy] та #[ScopedBy], ключ маршруту можна вказати за допомогою атрибута класу:

use Illuminate\Database\Eloquent\Attributes\RouteKey;
 
#[RouteKey('slug')]
class Post extends Model
{
    // ...
}

За наявності цього атрибута implicit route model binding шукатиме Post за колонкою slug. Якщо атрибут відсутній, getRouteKeyName() за замовчуванням використовуватиме primary key. Функцію реалізував @nimnaherath у PR #60841.

# Правило валідації base64

Правило base64 доповнює стандартні перевірки форматів рядків, закриваючи прогалину, яку раніше заповнювали сторонні бібліотеки на кшталт Zod. Воно перевіряє, чи є рядок коректним Base64 згідно з RFC 4648:

$request->validate([
    'signature' => ['required', 'base64'],
]);

Перевірка вимагає канонічного кодування: значення має коректно декодуватися в строгому режимі (strict mode) і при повторному кодуванні давати ідентичний рядок. Це запобігає помилкам у заповненні (padding) або наявності зайвих символів. Автор — @lucasmichot, PR #60808.

# Контекстний атрибут #[RequestAttribute]

Middleware часто зберігають оброблені об'єкти (наприклад, поточного орендаря або організацію) в атрибутах запиту. Щоб отримати їх назад, доводилося викликати $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. У цьому релізі додано методи 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. Автор — @Tresor-Kasenda, PR #60713.

# Кастомізація Application Builder

Раніше метод Application::configure() жорстко використовував клас ApplicationBuilder. Тепер додана захищена статична властивість $applicationBuilder. Це дозволяє розробникам пакетів, що розширюють Application, підміняти клас білдера, не переписуючи весь метод конфігурації. Деталі в #60848.

# Виокремлення Concurrency

Компонент Illuminate\Concurrency отримав власну read-only гілку (subsplit). Тепер він доступний як окремий незалежний пакет, як і інші компоненти Illuminate. Дивіться #60836.

# Інші виправлення та покращення

  • Виправлено роботу rollback-коллбеків у транзакціях бази даних (#60777), додано розпізнавання нових повідомлень про втрату з'єднання для автоперепідключення (#60819).
  • Додано екранування знаків питання у Grammar::whereColumn() (#60832).
  • Повідомлення InvalidPayloadException тепер містять назву job та черги (#60799).
  • Виправлено TypeError при передачі Enum у LogManager::forgetChannel() (#60801) та додано підтримку Enum-ключів у RedisTaggedCache::decrement() (#60821).
  • Str::wordWrap() тепер коректно працює з багатобайтними рядками (#60814).
  • Кешування контекстних атрибутів більше не конфліктує між властивостями одного класу (#60815).
  • Виправлено парсинг портів у команді serve (#60828).

Посилання

Популярні

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

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

Створення CLI-додатка за допомогою Laravel та Docker

Зазирніть у світ Laravel, де потужний CLI-фреймворк відкриває нові можливості для розробки командного інтерфейсу. Дізнайтеся, як створити просту утиліту для перевірки акцій, яка працює з Docker, та які переваги це може принести у вашому проєкті!

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

Все, що потрібно знати про Laravel 13

Laravel 13 вийде в березні 2026 року й вимагатиме мінімум PHP 8.3. Хочете дізнатися, як PHP‑атрибути для моделей, нові налаштування черг і метод Cache::touch() вплинуть на вашу розробку?

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

Використання штучного інтелекту для управління перекладами в Laravel

Досліджуйте нові можливості локалізації вашого Laravel-додатку з пакунками, які використовують штучний інтелект, такими як ChatGPT та Claude. Які рішення можуть спростити ваш процес перекладу та зробити його більш точним? Читайте далі, щоб дізнатися більше!