---
title: "Laravel 12.51.0: afterSending(), Validator hooks і timeout() для MySQL"
url: https://laravelukraine.com/blog/laravel-12510-aftersending-validator-hooks-i-timeout-dlia-mysql
author: "Олексій Бабінцев"
date: 2026-02-16
---

# Laravel 12.51.0: afterSending(), Validator hooks і timeout() для MySQL

Вийшов **Laravel 12.51.0**. Реліз зосереджений на контрольованій обробці, читабельній валідації та точковому контролі SQL-запитів.

### Ключові зміни

- `Notification::afterSending()` для post-send логіки по каналах. Метод викликається після фактичної відправки в кожен канал окремо. Зручно оновлювати статуси (notified_at), писати аудит або запускати події.

- Validator::whenFails() і whenPasses() замість ручних if. Валідація стає флюентною: реакція на fail/pass описується в одному ланцюжку. Особливо корисно в jobs/commands, де немає стандартного HTTP-flow.

- ->timeout() у Query Builder для MySQL (MAX_EXECUTION_TIME). Додає ліміт часу виконання на рівні конкретного запиту, а не всього з’єднання. Добре для важких пошуків і звітів, де важливо не блокувати БД надовго.

- Closure у firstOrCreate() / createOrFirst() для lazy-обчислень. Дорогі обчислення виконуються тільки якщо запису ще не існує. Це прибирає зайві API-виклики, геокодування чи обробку файлів.

- Глобальна подія BatchCancelled для відміни batch-задач. Подія спрацьовує і при ручному cancel, і при автоскасуванні через помилку. Можна централізовано логувати, сповіщати команду або чистити ресурси.

- Eloquent builder як subquery в update() без toBase(). Тепер Eloquent-підзапити можна передавати напряму, без зайвого перетворення. Код коротший, читабельніший і ближчий до бізнес-логіки.

- response()->withoutHeader() для видалення HTTP-заголовків. Можна прибрати один або кілька заголовків симетрично до withoutCookie(). Зручно для hardening-відповідей і прибирання службових заголовків у prod.

```php
use Illuminate\Support\Facades\Validator;

Validator::make($data, ['file' => 'required|image'])
	->whenFails(fn () => throw new InvalidArgumentException())
	->whenPasses(fn () => logger('Valid payload'));

$user = User::query()
	->where('email', 'like', '%@company.com')
	->timeout(60)
	->first();

$location = Location::firstOrCreate(
	['address' => $address],
	fn () => ['coordinates' => Geocoder::resolve($address)],
);

return response('ok')
	->withoutHeader(['X-Debug', 'Server']);
```

Джерело: [laravel-news.com/laravel-12-51-0](https://laravel-news.com/laravel-12-51-0)
