Команда 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
- Додано типи до ViewErrorBag від @AJenbo в #55329
- Додано типи до MessageBag від @AJenbo в #55327
- [12.x] додано генералії до методів у Schema/Builder від @taka-oyama в #55330
- Повернення "замороженого часу" для легшого тестування від @jasonmccreary в #55323
- Поліпшення DetectsLostConnections для підтримки сценарію обертання облікових даних AWS Aurora від @msaifmfz в #55331
- [12.x] перейменування методу тестування failedRequest() від @LKaemmerling в #55332
- Додано зворотний виклик для збоїв транзакцій від @dshafik в #55338
- [12.x] додано метод withRelationshipAutoloading до моделі від @litvinchuk в #55344
- [12.x] активовано повторні запити HTTP, коли посередник викликає виняток від @27pchrisl в #55343
- [12.x] виправлено помилку серіалізації Closure в автоматичному завантаженні зв'язків від @litvinchuk в #55345
- Додано тест для правила валідації Unique з умовами WhereIn від @mohammadrasoulasghari в #55351
- Додано @throws у документації від @mohammadrasoulasghari в #55361
- [12.x] оновлено документацію методу
propagateRelationAutoloadCallbackToRelationвід @derian-all-win-software в #55363 - [12.x] Redis - спершу встановити підключення, перш ніж задавати параметри від @alexmontoanelli в #55370
- [12.x] виправлено перевизначення FileLoader з відсутнім ключем від @fabio-ivona в #55342
- [12.x] виправлено події моделі pivot, які не працюють при використанні
withPivotValueвід @amir9480 в #55280 - [12.x] представлено механізм кешування з мемоізацією від @timacdonald в #55304
- [12.x] додано тест для методу Filesystem::lastModified() від @roshandelpoor в #55389
- [12.x] підтримка
pda/pheanstalk7 від @crynobone в #55397 - [12.x] додано комплексні тести для операцій файлової системи до FilesystemTest від @roshandelpoor в #55399
- Оновлено vite з 5.4.17 до 5.4.18 в /src/Illuminate/Foundation/resources/exceptions/renderer від @dependabot в #55402
- Додано детальні повідомлення про помилки до assertViewHas() від @3Descape в #55392
- Використання анотацій загальних типів для методів LazyCollection від @mohammadrasoulasghari в #55380
- [12.x] додано тестове покриття для процесу з кількома змінними середовища від @roshandelpoor в #55406
- [12.x] виправлено об'єднання адрес cc/bcc/replyTo в
MailMessageвід @onlime в #55404 - [12.x] додано функцію
makeвFluentвід @michaelnabil230 в #55417