Команда Laravel випустила версію v12.10.0, яка містить оновлення, зокрема мапування атрибутів Eloquent за допомогою колекції до конкретного об'єкта, перевірку вкладених зв'язків із методом relationLoaded(), поліпшення продуктивності Arr::dot() та інші новинки:
# Мапування атрибутів Eloquent до інших об'єктів
@DarkGhostHunter додав можливість мапування атрибута Eloquent до заданого класу за допомогою методу AsCollection::of():
use App\ValueObjects\Option;
use Illuminate\Database\Eloquent\Casts\AsCollection;
protected function casts(): array
{
return [
'options' => AsCollection::of(Option::class)
];
}
// Аналогічно
Collection::make($this->attributes['options'])->mapInto(Option::class);
Ці об'єкти повинні реалізовувати контракт Arrayable Laravel і інтерфейс JsonSerializable PHP. Деталі можна знайти в документації Eloquent.
# Додано трейтер Conditionable до Fluent
Michael Nabil додав трейтер Conditionable до класу Fluent, що дозволяє виразно модифікувати значення в екземплярі:
// До
$data = Fluent::make([
'name' => 'Michael Nabil',
'developer' => true,
'posts' => 25,
]);
if (auth()->isAdmin()) {
$data = $data->set('role', 'admin');
} else {
$data = $data->forget('posts');
}
// Після
$data = Fluent::make([
'name' => 'Michael Nabil',
'developer' => true,
'posts' => 25,
])->when(auth()->isAdmin(), function (Fluent $input) {
return $input->set('role', 'admin');
})->unless(auth()->isAdmin(), function (Fluent $input) {
return $input->forget('posts');
});
# Поліпшена продуктивність Arr::dot()
@cyppe вніс поліпшення продуктивності для методу Arr::dot(), що дозволяє підвищити швидкість виконання в 150-300 разів для великих масивів:
Цей PR оптимізує метод Arr::dot(), замінюючи рекурсивну реалізацію на ітераційний підхід на основі замикань. Оптимізація значно покращує продуктивність при сплющуванні великих вкладених масивів, що особливо корисно для валідатора Laravel при обробці великих наборів даних.
Деталі ви можете знайти в Pull Request #55495.
# Перевірка вкладених зв'язків із relationLoaded()
До версії Laravel 12.10, метод relationLoaded() перевіряв тільки одноуровневі зв'язки моделі. У цьому релізі Mahesh Perera додав можливість перевірки вкладених зв'язків:
$user->load('posts.comments');
// Раніше
$user->relationLoaded('posts'); // true
$user->relationLoaded('posts.comments'); // false
// Тепер
$user->relationLoaded('posts'); // true
$user->relationLoaded('posts.comments'); // true
# Примітки до випуску
Повний список нових функцій та оновлень ви можете переглянути нижче, а також порівняти версії 12.9.0 та 12.10.0 на GitHub. Примітки до випуску взято з чангелогу:
# v12.10.0
- Додано допоміжну функцію value() у метод 'when' від @mohammadrasoulasghari у https://github.com/laravel/framework/pull/55465
- [12.x] Перевірка директиви
@useбез лапок від @osbre у https://github.com/laravel/framework/pull/55462 - [12.x] Розширено покриття тестами для подій Broadcast від @roshandelpoor у https://github.com/laravel/framework/pull/55458
- [12.x] Додано трейтер
ConditionableдоFluentвід @michaelnabil230 у https://github.com/laravel/framework/pull/55455 - [12.x] Виправлено автозавантаження зв'язків за ручного встановлення зв'язків від @patrickweh у https://github.com/laravel/framework/pull/55452
- Додано відсутні типи до RateLimiter від @ClaudioEyzaguirre у https://github.com/laravel/framework/pull/55445
- [12.x] Виправлено роботу глобального автозавантаження зв'язків у певних випадках від @litvinchuk у https://github.com/laravel/framework/pull/55443
- [12.x] Виправлено додавання методу
setTagsдля нових подій скидання кешу від @erikn69 у https://github.com/laravel/framework/pull/55405 - Виправлено: унікальне блокування не знімалось після скасування транзакції в ShouldBeUnique від @toshitsuna-otsuka у https://github.com/laravel/framework/pull/55420
- [12.x] Розширення
AsCollectionдля мапування елементів в об'єкти або інші значення від @DarkGhostHunter у https://github.com/laravel/framework/pull/55383 - [12.x] Виправлено групові імпорти в директиві Blade
@useвід @osbre у https://github.com/laravel/framework/pull/55461 - Виправлення (тести): узгодження назв тестів із загальноприйнятим стилем іменування від @kauffinger у https://github.com/laravel/framework/pull/55496
- Оновлення скомпільованих переглядів лише у разі необхідності зміни від @pizkaz у https://github.com/laravel/framework/pull/55450
- Поліпшення продуктивності методу Arr::dot - 300x у деяких випадках від @cyppe у https://github.com/laravel/framework/pull/55495
- [12.x] Додано тести для
CacheBasedSessionHandlerвід @imanghafoori1 у https://github.com/laravel/framework/pull/55487 - [12.x] Додано тести для
FileSessionHandlerвід @imanghafoori1 у https://github.com/laravel/framework/pull/55484 - [12.x] Додано тести для
DatabaseSessionHandlerвід @imanghafoori1 у https://github.com/laravel/framework/pull/55485 - [12.x] Виправлено відключення багатозначного зв'язку без ID при використанні кастомного піва від @amir9480 у https://github.com/laravel/framework/pull/55490
- [12.x] Підтримка вкладених зв'язків у методі
relationLoadedвід @tmsperera у https://github.com/laravel/framework/pull/55471 - Виправлення для Cache::memo()->many(), що повертає неправильне значення з типом ключа integer від @bmckay959 у https://github.com/laravel/framework/pull/55503
- [12.x] Дозволено контейнеру створювати
Migratorз назви класу від @cosmastech у https://github.com/laravel/framework/pull/55501