Performance: Terminable middleware
Terminable middleware affects the response lifecycle by running code after the response is sent, impacting server response time and user experience.
<?php namespace App\Http\Middleware; use Closure; class LogMiddleware { public function handle($request, Closure $next) { return $next($request); } public function terminate($request, $response) { // Logging happens after response sent \Log::info('Request logged'); } }
<?php namespace App\Http\Middleware; use Closure; class LogMiddleware { public function handle($request, Closure $next) { $response = $next($request); // Logging happens here before response is sent \Log::info('Request logged'); return $response; } }
| Pattern | DOM Operations | Reflows | Paint Cost | Verdict |
|---|---|---|---|---|
| Logging inside handle() | 0 (server-side) | 0 | 0 | [X] Bad - blocks response, delays user interaction |
| Logging inside terminate() | 0 (server-side) | 0 | 0 | [OK] Good - response sent immediately, no delay |
terminate method to run code after response.handle runs before response, terminate runs after.class LogAfterResponse {
public function handle($request, Closure $next) {
return $next($request);
}
public function terminate($request, $response) {
Log::info('Response sent with status: ' . $response->status());
}
}Log::info.class CleanupMiddleware {
public function handle($request, Closure $next) {
return $next($request);
}
public function terminate() {
// cleanup code here
}
}$request and $response parameters.class RequestTimer {
protected $startTime;
public function handle($request, Closure $next) {
$this->startTime = microtime(true);
return $next($request);
}
public function terminate($request, $response) {
// What code should go here?
}
}Log::info to record the time taken after response is sent.Pass the test and this pattern moves unknown