---
title: "Laravel 13.21: атрибут RouteKey для моделей, валідація base64 та розширення можливостей Image"
url: https://laravelukraine.com/blog/laravel-1321-atribut-routekey-dlia-modelei-validaciia-base64-ta-rozsirennia-mozlivostei-image
date: 2026-07-23
source: https://laravel-news.com/laravel-13-21-0?utm_medium=feed&utm_source=feedpress.me&utm_campaign=Feed%3A+laravelnews
---

# Laravel 13.21: атрибут RouteKey для моделей, валідація base64 та розширення можливостей Image

Команда Laravel випустила версії 13.21.0 та 13.21.1 21 липня 2026 року. Патч-версія лише оновлює константу версії фреймворку, тому обидва релізи розглядаються разом. Оновлення додає кілька нових можливостей, включно з атрибутом `#[RouteKey]` для Eloquent моделей, правилом валідації `base64`, атрибутом `#[RequestAttribute]` для контекстного впровадження, а також розширеними форматами виводу у компоненті Image.

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

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

```php
use Illuminate\Database\Eloquent\Attributes\RouteKey;

#[RouteKey('slug')]
class Post extends Model
{
    // ...
}
```

З цим атрибутом неявне прив'язування моделі до маршруту визначає `Post` за колонкою `slug`, а `getRouteKeyName()` повертається до первинного ключа, якщо атрибут відсутній. Внесок від [@nimnaherath](https://github.com/nimnaherath) у PR [#60841](https://github.com/laravel/framework/pull/60841).

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

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

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

Перевірка вимагає канонічного кодування: значення має декодуватися у суворому режимі та повторно кодуватися точно в той самий рядок, тому помилки padding та зайві символи провалюють валідацію. Внесок від [@lucasmichot](https://github.com/lucasmichot) у PR [#60808](https://github.com/laravel/framework/pull/60808).

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

Міжпрограмне забезпечення часто зберігає визначені об'єкти у мішку атрибутів запиту, наприклад, орендаря чи організацію, визначені з API ключа. Отримання їх назад означало виклик `$request->attributes->get()` та ручне вказування типу. Новий контекстний атрибут `#[RequestAttribute]` безпосередньо впроваджує значення у визначений параметр:

```php
use Illuminate\Container\Attributes\RequestAttribute;

class InventoryController
{
    public function index(#[RequestAttribute('org')] Organization $org)
    {
        return $this->inventoryService->getForOrg($org);
    }
}
```

Внесок від [@cosmastech](https://github.com/cosmastech) у PR [#60847](https://github.com/laravel/framework/pull/60847).

## Додаткові формати виводу для компонента Image

Компонент Image, представлений у Laravel 13.20, міг конвертувати лише у WebP, JPG та JPEG через свої гнучкі методи, навіть незважаючи на те, що вбудовані кодери Intervention Image підтримують більше форматів. Цей реліз додає `toPng()`, `toGif()`, `toAvif()` та `toBmp()`:

```php
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](https://github.com/Tresor-Kasenda) у PR [#60713](https://github.com/laravel/framework/pull/60713).

## Налаштовуваний Application Builder

Раніше `Application::configure()` жорстко кодував клас `ApplicationBuilder`, тому пакунки, що розширюють `Application` Laravel, мали перевизначати весь метод для його заміни. Тепер захищена статична властивість `$applicationBuilder` дозволяє підкласам надавати власний клас білдера, зберігаючи існуючий API. Див. PR [#60848](https://github.com/laravel/framework/pull/60848).

## Subsplit для Concurrency

Компонент `Illuminate\Concurrency` тепер має власний subsplit лише для читання, приєднуючись до інших компонентів Illuminate, опублікованих як окремі пакунки. Див. PR [#60836](https://github.com/laravel/framework/pull/60836).

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

- Колбеки відкату транзакцій бази даних тепер спрацьовують коректно (PR [#60777](https://github.com/laravel/framework/pull/60777)), додано виявлення нового повідомлення про втрату з'єднання для автоматичного перепідключення (PR [#60819](https://github.com/laravel/framework/pull/60819))
- Знаки питання екрануються у `Grammar::whereColumn()` (PR [#60832](https://github.com/laravel/framework/pull/60832))
- Повідомлення `InvalidPayloadException` тепер включають назву завдання та чергу (PR [#60799](https://github.com/laravel/framework/pull/60799))
- Передача enum до `LogManager::forgetChannel()` більше не викидає `TypeError` (PR [#60801](https://github.com/laravel/framework/pull/60801)), а `RedisTaggedCache::decrement()` обробляє ключі enum (PR [#60821](https://github.com/laravel/framework/pull/60821))
- `Str::wordWrap()` коректно обробляє багатобайтові рядки (PR [#60814](https://github.com/laravel/framework/pull/60814))
- Кешування контекстних атрибутів більше не конфліктує між властивостями одного класу (PR [#60815](https://github.com/laravel/framework/pull/60815)), а хибні параметри винятків concurrency зберігаються (PR [#60822](https://github.com/laravel/framework/pull/60822))
- Виправлено парсинг порту хосту в команді `serve` (PR [#60828](https://github.com/laravel/framework/pull/60828)) та невизначений індекс у `Pipeline\Hub::pipe()` (PR [#60802](https://github.com/laravel/framework/pull/60802))
