Код до $next($request) виконується до контролера, код після - коли відповідь уже готова.
public function handle(Request $request, Closure $next): Response
{
$start = hrtime(true);
$response = $next($request);
$response->headers->set('Server-Timing', 'app;dur='.(hrtime(true) - $start) / 1e6);
$response->headers->set('X-Frame-Options', 'SAMEORIGIN');
return $response;
}
Типові задачі «після»: заголовки безпеки, Cache-Control, кореляційний ID запиту, вимірювання часу.
На що зважати:
- Порядок. На вході middleware виконуються за списком, на виході - у зворотному порядку. Middleware, що ставить
Cache-Control, має йти після того, що може його змінити. Laravel дозволяє задати пріоритет (priority()уbootstrap/app.php). - Потокові й файлові відповіді.
StreamedResponseіBinaryFileResponseне мають готового тіла - не можна читати чи змінюватиgetContent(), лише заголовки. - Глобальний чи маршрутний. Глобальний middleware спрацьовує навіть для 404 і на запити до Livewire чи ресурсів, тож важка логіка там коштує на кожен запит.
- Чужі middleware можуть перетерти заголовок. Наприклад, Livewire ставить
no-storeглобально, тож власний middleware, що робить сторінку кешованою, мусить бути в тому самому глобальному стеку й іти після нього. - Робота після відповіді - не тут, а в
terminate()чиdefer(): інакше користувач чекає.