Выпущена версия Laravel 12.51.0. Очередное обновление стабильной ветки фреймворка. Оно не содержит революционных изменений, но привносит полезные улучшения для уведомлений, валидации, работы с базой данных MySQL и других сценариев, с которыми разработчики сталкиваются ежедневно.
Новые возможности уведомлений
Раньше после отправки уведомления вам приходилось вручную слушать событие NotificationSent, чтобы выполнить дополнительные действия. Теперь в классах уведомлений можно прямо определить метод afterSending, который будет вызываться после отправки по каждому каналу (например, email или SMS).
class BookingNotification extends Notification
{
public function __construct(public Booking $booking) {}
public function via(): array
{
return ['mail'];
}
public function afterSending($notifiable, $channel, $response)
{
// Обновляем модель после отправки
$this->booking->update(['notified_at' => now()]);
}
}Метод получает:
объект того, кому отправляется уведомление,
канал (mail, sms и т.п.),
ответ от сервиса отправки.
Это удобно, если нужно, например, пометить в базе, что уведомление ушло.
Fluently: валидация с whenFails() и whenPasses()
Методы валидации теперь поддерживают цепочки whenFails() и whenPasses(). Такой подход сокращает шаблонный код и делает обработку результатов валидации более выразительной, особенно вне HTTP-запросов. Например, в консольных командах или задачах очередей.
Validator::make(
['file' => $file],
['file' => 'required|image']
)->whenFails(function () {
throw new InvalidArgumentException('Файл невалиден');
});Этот пример заменяет явное условие if ($validator->fails()) и избавляет от лишних проверок.
Таймаут для запросов MySQL
Теперь можно указать ограничение времени выполнения запроса к MySQL прямо в конструкторе запросов. Laravel добавил метод timeout(), который вставляет подсказку MAX_EXECUTION_TIME в SQL.
Student::query()
->where('email', 'like', '%example.com')
->timeout(60) // таймаут в секундах
->get();Это полезно, если вы хотите ограничить время медленных запросов. Если вы хотите применять такой таймаут всегда для определённой модели, это можно сделать через глобальную область (scope).
Ленивое вычисление значений в firstOrCreate и createOrFirst
Методы firstOrCreate и createOrFirst теперь принимают замыкания (closures) для второго аргумента. Это позволяет отложить тяжёлые вычисления до фактической необходимости.
$location = Location::firstOrCreate(
['address' => $address],
fn () => ['coordinates' => Geocoder::resolve($address)]
);Если запись уже есть, замыкание вообще не будет выполнено. Это экономит время и ресурсы. Например, если геокодирование занимает заметное время.
Новые события, методы и улучшения
Помимо перечисленного, в Laravel 12.51.0 добавлены и другие изменения:
Событие BatchCancelled
Теперь при отмене батча (группы задач) выбрасывается событие BatchCancelled. Оно позволяет слушать и обрабатывать отмену во всей системе, а не вручную отслеживать её в каждом месте.
Удобная подстановка подзапросов в обновлениях
Раньше для использования построителя запросов (Eloquent) в качестве подзапроса в update() приходилось вручную приводить его к базовому запросу. Теперь это не требуется т.к. Eloquent умеет автоматически подставлять такие подзапросы.
Управление HTTP-ответами
Добавлен метод withoutHeader(), который позволяет удалять заголовки из ответа. Это зеркально отражает уже существующий метод withoutCookie().
return response('OK')
->withoutHeader('X-Debug');Мелкие улучшения и исправления
Laravel 12.51.0 также содержит множество исправлений и улучшений по всему фреймворку:
Улучшена работа тестов в пакетных задачах и изоляция кеша при параллельном тестировании.
Обновлены методы работы со строками и вспомогательными функциями.
Исправлены баги в локализации и очередях.
Улучшена работа HTTP-клиента.
Laravel 12.51.0 это преимущественно улучшение разработческого опыта. Новые возможности уведомлений, валидации, управления запросами и обновлений делают код чище и безопаснее, а повседневные задачи проще. Несмотря на то, что это не крупный релиз с большими функциями, каждое из изменений это шаг к более удобной разработке.