Laravel v12.52.0 додає метод фабрики makeMany(), нові хелпери withoutAfterMaking() та withoutAfterCreating(), атомарні записи в компіляторі Blade для уникнення умов гонки і покращені трасування виключень для замикань та автономних функцій.
Основні нововведення:
- Новий метод фабрики
makeMany() - Хелпери
withoutAfterMaking()таwithoutAfterCreating()для фабрик - Підтримка
temporaryUploadUrl()для локального файлового сховища - Атомарні записи в BladeCompiler для запобігання умовам гонки
- Виправлення затримки в
Mailable::later()і перевірки delay для queued mailables - Підтримка
$preserveKeysуLazyCollection::random() - Строкові вирази для
selectExpression() - Замикання та автономні функції тепер правильно відображаються в трасуваннях виключень
- Численні виправлення помилок і внутрішні поліпшення
Що нового
Метод фабрики makeMany()
Фабрики тепер мають метод makeMany() як доповнення до createMany(). Якщо createMany() зберігає записи в базі, то makeMany() повертає колекцію інстансів моделей без збереження — зручно для створення кількох об'єктів у пам'яті під час unit-тестів або перетворень:
// Create multiple unsaved instances
$users = User::factory()->makeMany(3);
// Equivalent longhand
$users = User::factory()->count(3)->make();
Pull Request: #58795
Хелпери withoutAfterMaking() та withoutAfterCreating()
Два нові хелпери дозволяють пропускати колбеки afterMaking та afterCreating для конкретного виклику. Це корисно, коли колбеки налаштовують зв'язки або викликають побічні ефекти, які не потрібні в поточному тесті:
// Skip afterMaking callbacks
$user = User::factory()->withoutAfterMaking()->make();
// Skip afterCreating callbacks
$user = User::factory()->withoutAfterCreating()->create();
Pull Request: #58794
temporaryUploadUrl() для локального файлового сховища
Метод temporaryUploadUrl() тепер працює з драйвером local, тоді як раніше був доступний лише для хмарних драйверів типу S3. Тепер можна використовувати temporaryUploadUrl() в локальній розробці та тестах без переходу на хмарний драйвер:
$url = Storage::disk('local')->temporaryUploadUrl(
'uploads/photo.jpg',
now()->addMinutes(30)
);
Pull Request: #58499
Атомарні записи в BladeCompiler
Компілятор Blade тепер використовує атомарні записи при кешуванні скомпільованих view і inline component views. Раніше при одночасній компіляції одного view кількома процесами могла виникати умова гонки й пошкоджуватися файл кешу. Тепер спочатку запис у тимчасовий файл, а потім переміщення на місце усуває цю проблему.
Виправлення затримки в Mailable::later() і перевірки delay
Mailable::later() неправильно застосовував delay до відправленого завдання SendQueuedMailable — це виправлено. Супутній PR додає підтримку delay у Mail::assertQueued(), щоб перевіряти, що mailable була поставлена в чергу з певною затримкою:
Mail::fake();
Mail::to('user@example.com')->later(now()->addMinutes(10), new WelcomeMail());
Mail::assertQueued(WelcomeMail::class, function ($mail) {
return $mail->delay->equalTo(now()->addMinutes(10));
});
Підтримка $preserveKeys у LazyCollection::random()
LazyCollection::random() тепер приймає параметр $preserveKeys, як і Collection::random(). Якщо він true, у результаті зберігаються оригінальні ключі:
$collection = LazyCollection::make(['a' => 1, 'b' => 2, 'c' => 3, 'd' => 4]);
// Preserves original keys
$sample = $collection->random(2, preserveKeys: true);
// e.g. ['b' => 2, 'd' => 4]
Pull Request: #58791
Строкові вирази для selectExpression()
selectExpression() у query builder тепер приймає сирі рядки поряд з об'єктами Expression. Це зменшує бойлерплейт, коли потрібен один raw-вираз у select:
// Before
DB::table('orders')->selectExpression(DB::raw('SUM(total) as revenue'));
// After
DB::table('orders')->selectExpression('SUM(total) as revenue');
Pull Request: #58753
Заміки та автономні функції правильно відображаються в трасуваннях виключень
Трасування виключень тепер коректно показує імена замикань та автономних функцій замість загальних або порожніх міток. Це робить налагодження анонімних функцій і Closure-based route-обробників читабельнішим у сторінках помилок і логах.
Pull Request: #58879
Виправлення помилок та покращення
Черги та асинхронність:
- Виправлено відкидання defer-колбеків при використанні sync-черги (#58745)
- Повернене значення
Batch::progress()приводиться доint(#58767)
База даних та Eloquent:
- Виправлено повернення пустої
Collectionдля JSON:API ресурсів, що не є моделями (#58752) - Кешовані касти об'єднуються лише для доступних атрибутів (#57627)
- Відкотили перевірки точності стовпців SQL Server, які спричиняли регресії (#58888)
- Строка підключення MySQL оновлена для сучасних клієнтів:
--ssl-mode=DISABLED(#58786)
Тестування:
- Додано опцію вимкнути ізоляцію префікса кешу для parallel-safe (#58801)
Middleware:
- Портовано зміни
withMiddlewareз 13.x (#58798)
Покращення типів і документація:
- Масові виправлення та стандартизація
@returnу докблоках (#58746, #58764, #58774, #58805) - Уніфікація докблоків
Throwableдо повних кваліфікованих імен (#58802) - Різні рефактори та поліпшення стилю коду (#58748, #58751, #58777, #58789, #58793, #58818, #58820, #58824, #58825)
Нотатки щодо оновлення
Для типових застосунків не очікується зламів. Відкат перевірок точності стовпців SQL Server відновлює поведінку до стану до v12.51.0 — якщо ви покладалися на ту перевірку, перегляньте свої SQL Server-міграції. Для повних деталей дивіться повний changelog перед оновленням.