Меморизований кеш-драйвер у Laravel 12.9

Перекладено ШІ
Оригінал: Laravel News
Оновлено: 17 квітня, 2025
Оновлення Laravel до версії 12.9.0 принесло низку захоплюючих функцій, включаючи новий драйвер кешу з мемоізацією та автоматичне завантаження стосунків моделі. Які ще нововведення та поліпшення вас очікують? Читайте далі, щоб дізнатися про всі деталі

Команда Laravel представила версію 12.9.0, яка містить новий механізм кешування, зручне автозавантаження зв'язків моделей, зворотний виклик на випадок збою транзакцій у базі даних та багато іншого:

# Механізм кешування з мемоізацією

Тім Макдональд розробив механізм кешування з мемоізацією, який декорує будь-який інший механізм кешування в пам'яті:

Ми використовуємо кеш, оскільки він швидкий; це не означає, що доступ до кешу є безкоштовним.

Цей PR представляє новий механізм кешування з мемоізацією. Він запам'ятовує значення, отримані з кешу, і зберігає їх у пам'яті на час виконання.

Cache::get('foo');         // звернення до кешу
Cache::memo()->get('foo'); // звернення до кешу
Cache::memo()->get('foo'); // не звертається до кешу

Додаткову інформацію про мемоізацію дивіться в документації по кешу. Також ознайомтеся з Pull Request #55304 для детальної інформації про цю функцію.

# Оновлення тестів freeze Time

Джейсон МакКріарі оновив методи тестування freezeTime() та freezeSecond(), які тепер повертають дату, якщо не задано зворотний виклик:

Цей PR оновлює freezeTime і freezeSecond таким чином, щоб вони повертали "заморожений час" без необхідності задавати зворотний виклик. Це дозволяє більш зручне тестування без неприємних моментів.

// До
$now = now();
Carbon::setTestNow($now);
$post->slug = $slug;
$post->save();
$package->refresh();
$this->assertTrue($now->equalTo($post->updated_at));

// Після
$now = $this->freezeSecond();
$post->slug = $slug;
$post->save();
$package->refresh();
$this->assertTrue($now->equalTo($post->updated_at));

Деталі обговорення та реалізації можна знайти у Pull Request #55323.

# Додано зворотний виклик для збоїв транзакцій у БД

Дейві Шафік розширив метод DB::transaction(), додавши можливість передавати зворотний виклик, який виконується при невдачі транзакції:

DB::transaction(
    callback: function () {
        // виконати дії з БД
    },
    onFailure: function () {
        Notification::send($admin, new SomethingImportantBroke());
    }
);

# Автозавантаження зв'язків моделі

Сергій Літвінчук додав функцію автозавантаження зв'язків моделей:

У поточній реалізації #53655 автоматичне завантаження зв'язків можливе лише для колекцій.

Іноді нам потрібно активувати автоматичне завантаження зв'язків для однієї моделі:

// До
$post->tags->withRelationshipAutoloading();
$post->authors->withRelationshipAutoloading();

// Після
$post->withRelationshipAutoloading();

# Додано детальні повідомлення про помилки до assertViewHas()

@3Descape оновив повідомлення про помилки для assertViewHas(). Наприклад:

$response->assertViewHasAll([
    'key_without_value',
    'key_with_value' => 10,
    'key_with_closure' => fn ($value) => $value == 10,
    'key_with_model' => Customer::first(),
    'key_with_collection' => Customer::factory()->count(10)->create(),
]);

Тепер, якщо буде зафіксовано збій, ви отримаєте інформативні деталі про помилку:

# До
1) Tests\Feature\App\Http\CustomerControllerTest::a_test_example
Не вдалося стверджувати, що false є true.

// Після
1) Tests\Feature\App\Http\CustomerControllerTest::a_test_example
Не вдалося стверджувати, що 'key_with_value' відповідає очікуваному значенню.
Не вдалося стверджувати, що 0 відповідає 10.

# Метод Fluent make()

Майкл Набіль додав метод Fluent::make() для створення екземплярів:

use Illuminate\Support\Fluent;

$instance = Fluent::make($attributes);

# Примітки до випуску

Ви можете переглянути повний список нових функцій і оновлень нижче, а також різницю між версією 12.8.0 та 12.9.0 на GitHub. Наступні примітки безпосередньо з журналу змін:

# v12.9.0