Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Новини 24 вересня 2026

Підтримка тегованого мемоїзованого кешу та оновлення атрибутів моделей у Laravel 13.33

Команда Laravel випустила версію 13.33.0 з підтримкою тегів для мемоїзованого кешу, атрибутом #[Refreshes] для автоматичного оновлення згенерованих колонок моделей та низкою інших покращень.

Тегований мемоїзований кеш

Joost de Bruijn додав метод tags() до мемоїзованого кеш-сховища, тому тепер Cache::memo() працює з тегованими кешами. Читання в межах одного запиту звертаються до бекенду кешу лише один раз, а всі наступні запити виконуються з пам'яті:

// Два виклики, один звернення до Redis
Cache::memo()->tags(['permissions'])->get("permissions:{$user->id}");
Cache::memo()->tags(['permissions'])->get("permissions:{$user->id}");

// Записи йдуть у тегований кеш і видаляють мемоїзовану копію
Cache::memo()->tags(['permissions'])->put("permissions:{$user->id}", $permissions);

// Очищення тегу також видаляє мемоїзовані записи
Cache::memo()->tags(['permissions'])->flush();

До цього релізу той самий патерн вимагав обгортання виклику тегованого кешу у додатковий пошук Cache::store('array') вручну. Нетеговану версію було представлено у Laravel 12.9.

Оновлення атрибутів моделі після запису

Caleb White додав атрибут #[Refreshes] (та відповідну властивість $refreshes), який перезавантажує вказані колонки з бази даних після створення або оновлення моделі. Це призначено для колонок virtualAs і storedAs та інших значень, які встановлює база даних, і які інакше залишаються відсутніми або застарілими в моделі в пам'яті до виклику refresh():

use Illuminate\Database\Eloquent\Attributes\Refreshes;

#[Refreshes('name')]
class User extends Model
{
    //
}

$user = User::create(['first_name' => 'Taylor', 'last_name' => 'Otwell']);
$user->name; // "Taylor Otwell" без виклику refresh()

Оновлення виконується одним запитом лише для перелічених колонок, на з'єднанні для запису. Атрибут приймає масив або варіативні імена колонок, а властивість $refreshes працює аналогічно, якщо ви не використовуєте атрибути.

Збереження справжнього NULL з AsCollection та AsArrayObject

Zein Ahmad додав опціональний режим nullable() для кастів AsCollection та AsArrayObject. Присвоєння null одному з цих кастів зберігає JSON-рядок "null" у колонці, тому whereNull() ніколи не знаходить рядок. З nullable() каст зберігає базу даних NULL замість цього:

protected function casts(): array
{
    return [
        'items' => AsCollection::class,      // без змін: зберігає "null"
        'meta' => AsCollection::nullable(),  // зберігає NULL
        'options' => AsArrayObject::nullable(),
    ];
}

Тепер запити whereNull() коректно працюють з такими колонками.

Модифікатори inplace() та lock() для міграцій індексів

Sander Muller додав модифікатор inplace() для операцій з індексами та зовнішніми ключами, а також модифікатор lock(), щоб міграція MySQL могла запитувати ALGORITHM=INPLACE та LOCK=NONE замість повного блокуючого перебудови таблиці:

Schema::table('video_sessions', function (Blueprint $table) {
    $table->index('foo', 'foo_index')->inplace()->lock('none');
});

Модифікатор працює з наступними методами:

  • index()
  • unique()
  • primary()
  • fullText()
  • spatialIndex()
  • foreign()

Він віддзеркалює модифікатор instant(), який вже існує для визначень колонок.

Атрибути Form Request з батьківських класів

Md Sukkur Ali виправив атрибути form request, щоб дочірній запит успадковував їх від батьківського класу. PHP не успадковує атрибути автоматично, тому атрибути на кшталт #[StopOnFirstFailure] на спільному базовому запиті ігнорувалися кожним підкласом:

#[StopOnFirstFailure]
#[FailOnUnknownFields]
abstract class ApiRequest extends FormRequest
{
    //
}

// Обидва атрибути тепер застосовуються
class StorePostRequest extends ApiRequest
{
    //
}

Тепер успадкування атрибутів працює коректно для усіх підкласів.

Відмова від завершення воркера при таймауті

Jack Bayliss додав прапорець Worker::$killOnTimeout. За замовчуванням джоба, яка перевищує таймаут, завершує весь процес воркера, і супервайзер запускає новий. Встановіть прапорець у false, і воркер викине TimeoutExceededException замість цього, що дозволить джобі очистити ресурси, а воркер продовжить працювати:

use Illuminate\Queue\Worker;

Worker::$killOnTimeout = false;

Увага: джоба, яка обгортає тіло handle() у широкий try/catch, може проковтнути виняток.

Пов'язаний PR від Kieran Brown додає Worker::killUsing() - хук, який виконується перед SIGKILL, щоб користувацький код виходу міг досягти супервайзера.

Тестові хелпери mockArtisan() та realArtisan()

Jenthe Noordsij додав два тестові хелпери, які розділяють дві функції $this->artisan(). Метод mockArtisan() завжди повертає PendingCommand для очікувань, а realArtisan() завжди виконує команду та повертає код виходу як int, тому вам більше не потрібно перемикати $mockConsoleOutput для перемикання між двома режимами:

$this->mockArtisan('inspire')
    ->expectsOutputToContain('Simplicity')
    ->assertExitCode(0);

$code = $this->realArtisan('migrate', ['--force' => true]);

Це спрощує тестування Artisan-команд і робить тести більш явними.

Інші покращення

Версія 13.33.0 також включає:

  • Підтримку протоколів valkey:// та valkeys:// для Redis-з'єднань
  • Виправлення для дублікатів у Eloquent Collection duplicates() з ключем або callback
  • Опцію --pretend для команди install:broadcasting
  • Методи createQuietly та createManyQuietly для BelongsToMany
  • Покращену обробку PostgreSQL server options та нативний pooling для Laravel Cloud
  • Підтримку MariaDB 11 та 12.3 у тестах
  • Виправлення LazyCollection::take() з від'ємним лімітом, більшим за колекцію
  • Покращення обробки батчів у черзі та Cloud job retries

Повний список змін та оновлень доступний у changelog та diff між версіями 13.32.0 та 13.33.0 на GitHub.

7

Читати в документації

Коментарі

Увійдіть, щоб залишити коментар

Будьте першим, хто залишить коментар!

Читайте також

Filament v5.10.0
Новини 12 жовтня 2026

Filament v5.10.0: сітка в rich editor, скелетони таблиць і десятки виправлень

Вийшов Filament v5.10.0: елементи керування сіткою в rich editor, допоміжний контент для віджетів-графіків, скелетони завантаження таблиць, submitOnCompletion() для OneTimeCodeInput та багато виправлень авторизації, доступності й стану.

22
Laravel AI SDK на практиці
Новини 09 жовтня 2026

Laravel AI SDK на практиці: агент, що стоїть за There There

Фрік Ван дер Гертен розповідає, як у Spatie побудували AI-шар хелпдеска There There на Laravel AI SDK: клас агента, інструменти з типізованою JSON-схемою та делегування роботи звичайним domain-діям.

18

Вакансії за темою

Z Global E-Commerce
22 дні тому

Full-Stack Developer (PHP/Laravel + Vue 3)

Full-Stack розробник з глибоким досвідом бекенду. Розробляєте масштабовані веб-платформи з комплексною бізнес-логікою, працюєте з PHP/Laravel, SQL, Vue 3/TypeScript. Основні вимоги: досвід з Laravel, Eloquent, проектування API, оптимізація баз даних (включно з мільйонами записів), фронтенд на Vue 3 з Composition API, TypeScript. Цінується розуміння архітектури, продуктивності й довгострокової підтримуваності коду.

Wooden Sword
23 дні тому

Senior PHP Developer (Game Backend)

Розробник backend для мобільної RPG з високим навантаженням. Основний стек: PHP Laravel API та TypeScript Nakama Game Server. Відповідальність за повний цикл розробки функцій — від логіки до тестування, code review, оптимізації та документації. Вимоги: 5+ років backend-досвіду, бездоганне знання Laravel/PHP, сильні навички TypeScript, PostgreSQL та асинхронного програмування.

Kredyt Kapital
23 дні тому

Middle Full-Stack Developer (PHP / Laravel / Vue / React)

Middle Full-Stack Developer для розробки внутрішніх IT-продуктів. Основний стек: PHP 8.3+, Laravel, PostgreSQL, REST API, Vue.js/React. Розробник займатиметься backend (бізнес-логіка, Eloquent, Jobs/Queues) і frontend (компоненти, інтерфейси), інтеграціями та оптимізацією. Вимоги: 2-3+ років комерційного досвіду з PHP, 2+ років практики з Laravel, впевнене знання PostgreSQL, Git, JavaScript ES6+.

Пакети за темою

Pest

pestphp/pest

Тестовий фреймворк з лаконічним синтаксисом поверх PHPUnit: тести описуються функціями замість класів. Має паралельний запуск, тести архітектури, покриття і мутаційне тестування.

11,667 v5.1.1 4

Laravel Medialibrary

spatie/laravel-medialibrary

Пакет для асоціювання файлів з Eloquent-моделями. Надає зручний інтерфейс для управління медіа-файлами, пов'язаними з вашими моделями бази даних.

6,168 11.23.10 13 8