Вышел релиз Laravel 12.52.0. Обновление добавляет новые методы для фабрик моделей, улучшает работу очередей и почты, расширяет возможности локального хранилища и повышает стабильность компиляции Blade. Разберём ключевые изменения и посмотрим, как они работают на практике.
Метод makeMany() для фабрик моделей
В фабриках появился новый метод makeMany(). Он дополняет createMany(), но в отличие от него не сохраняет модели в базе данных. Вместо этого возвращается коллекция объектов в памяти.
Это удобно для юнит-тестов и сценариев, где нужно подготовить несколько экземпляров без записи в БД.
// Создать три экземпляра без сохранения
$users = User::factory()->makeMany(3);
// Эквивалент через count()
$users = User::factory()->count(3)->make();Отключение afterMaking() и afterCreating()
Теперь можно точечно отключать выполнение колбэков afterMaking() и afterCreating(). Это полезно, если фабрика автоматически создаёт связи или выполняет дополнительные действия, которые в конкретном тесте не нужны.
// Пропустить afterMaking
$user = User::factory()->withoutAfterMaking()->make();
// Пропустить afterCreating
$user = User::factory()->withoutAfterCreating()->create();Временные URL для локального диска
Метод temporaryUploadUrl() теперь поддерживает драйвер local. Ранее он работал только с облачными хранилищами вроде S3.
Это упрощает разработку и тестирование, когда проект использует локальную файловую систему.
$url = Storage::disk('local')->temporaryUploadUrl(
'uploads/photo.jpg',
now()->addMinutes(30)
);Атомарная запись при компиляции Blade
Компилятор Blade теперь использует атомарную запись при сохранении скомпилированных шаблонов. Это устраняет потенциальные состояния гонки, когда несколько процессов одновременно компилируют один и тот же файл и могут повредить кеш.
В результате повышается стабильность приложения под нагрузкой.
Исправление задержки в Mailable::later()
Исправлена ошибка, из-за которой задержка в Mailable::later() некорректно применялась к задаче SendQueuedMailable. Теперь задержка работает ожидаемо.
Также появилась возможность проверять delay в тестах:
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));
});LazyCollection::random() с сохранением ключей
Метод random() у LazyCollection теперь поддерживает параметр $preserveKeys. Если установить его в true, исходные ключи сохраняются.
$collection = LazyCollection::make([
'a' => 1,
'b' => 2,
'c' => 3,
'd' => 4,
]);
$sample = $collection->random(2, preserveKeys: true);
// Например: ['b' => 2, 'd' => 4]Строковые выражения в selectExpression()
Метод selectExpression() теперь принимает строку напрямую, а не только объект Expression. Это сокращает лишний код.
// Было
DB::table('orders')
->selectExpression(DB::raw('SUM(total) as revenue'));
// Стало
DB::table('orders')
->selectExpression('SUM(total) as revenue');Улучшенные трассировки исключений
В трассировках стека теперь корректно отображаются замыкания и автономные функции. Вместо обезличенных записей выводятся более понятные имена, что упрощает отладку маршрутов и анонимных обработчиков.
Другие исправления и улучшения
В релиз также вошли:
исправления работы defer-колбэков в sync-очереди;
корректировка
Batch::progress()с приведением к int;откат проверок точности столбцов для SQL Server;
обновление строки подключения MySQL;
улучшения phpDoc-аннотаций и внутренний рефакторинг.
Для большинства проектов обновление не содержит ломающих изменений. Однако если вы используете SQL Server и полагались на изменения из версии 12.51.0, стоит внимательно проверить миграции.