У 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).
Посилання