Bird
Raised Fist0
Laravelframework~5 mins

Terminable middleware in Laravel

Choose your learning style10 modes available
Introduction

Terminable middleware lets you run code after the response is sent to the user. This helps with tasks like logging or cleanup without slowing down the user.

You want to log request details after the user sees the page.
You need to clear temporary data after sending the response.
You want to send notifications or emails after the response is done.
You want to measure how long the request took without delaying the user.
You want to perform background tasks after the main work is finished.
Syntax
Laravel
class ExampleMiddleware implements TerminableMiddlewareInterface
{
    public function handle($request, Closure $next)
    {
        // Code before response
        $response = $next($request);
        // Code after response preparation but before sending
        return $response;
    }

    public function terminate($request, $response)
    {
        // Code that runs after response is sent
    }
}

The terminate method runs after the response is sent to the browser.

Make sure your middleware is registered in the kernel.php to use terminable middleware.

Examples
This middleware logs the request path after the response is sent.
Laravel
class LogAfterResponse implements TerminableMiddlewareInterface
{
    public function handle($request, Closure $next)
    {
        return $next($request);
    }

    public function terminate($request, $response)
    {
        // Log request info after response
        Log::info('Request completed: ' . $request->path());
    }
}
This middleware deletes a temporary file after the user gets the response.
Laravel
class CleanupAfterResponse implements TerminableMiddlewareInterface
{
    public function handle($request, Closure $next)
    {
        return $next($request);
    }

    public function terminate($request, $response)
    {
        // Clear temporary files or cache
        Storage::delete('temp-file.txt');
    }
}
Sample Program

This middleware logs the URL path the user visited after the response is sent. It does not delay the page loading.

Laravel
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Middleware\TerminableMiddleware;
use Illuminate\Support\Facades\Log;

class AfterResponseLogger implements TerminableMiddleware
{
    public function handle($request, Closure $next)
    {
        // Just pass the request to next middleware or controller
        return $next($request);
    }

    public function terminate($request, $response)
    {
        // Runs after response sent
        Log::info('User visited: ' . $request->path());
    }
}

// In Kernel.php, register this middleware in $middleware array or route middleware

// When a user visits a page, the response is sent immediately.
// After that, the terminate method logs the path.
OutputSuccess
Important Notes

Terminable middleware only works if the middleware implements the terminate method.

It is useful for tasks that don't need to block the user waiting for the response.

Remember to register the middleware properly in app/Http/Kernel.php.

Summary

Terminable middleware runs code after the response is sent to the user.

Use it for logging, cleanup, or background tasks.

Implement the terminate method to use this feature.

Practice

(1/5)
1. What is the main purpose of terminable middleware in Laravel?
easy
A. To validate user input before processing
B. To modify the HTTP request before it reaches the controller
C. To handle database migrations automatically
D. To run code after the HTTP response has been sent to the user

Solution

  1. Step 1: Understand middleware timing

    Terminable middleware runs after the response is sent, unlike regular middleware that runs before.
  2. Step 2: Identify terminable middleware purpose

    It is used for tasks like logging or cleanup after response delivery.
  3. Final Answer:

    To run code after the HTTP response has been sent to the user -> Option D
  4. Quick Check:

    Terminable middleware = post-response code [OK]
Hint: Terminable middleware runs after response is sent [OK]
Common Mistakes:
  • Confusing terminable middleware with regular middleware
  • Thinking it runs before the controller
  • Assuming it handles request validation
2. Which method must be implemented in a Laravel terminable middleware class?
easy
A. handle
B. process
C. terminate
D. finish

Solution

  1. Step 1: Recall terminable middleware interface

    Terminable middleware requires a terminate method to run code after response.
  2. Step 2: Differentiate from handle method

    handle runs before response, terminate runs after.
  3. Final Answer:

    terminate -> Option C
  4. Quick Check:

    Post-response method = terminate [OK]
Hint: Terminate method runs after response in terminable middleware [OK]
Common Mistakes:
  • Using handle instead of terminate for post-response code
  • Assuming process or finish are valid methods
  • Not implementing terminate method at all
3. Given this terminable middleware code, what will be logged after the response is sent?
class LogAfterResponse {
    public function handle($request, Closure $next) {
        return $next($request);
    }
    public function terminate($request, $response) {
        Log::info('Response sent with status: ' . $response->status());
    }
}
medium
A. Logs the request URL before sending the response
B. Logs the response status code after sending the response
C. Throws an error because terminate method is missing parameters
D. Does nothing because terminate is not called automatically

Solution

  1. Step 1: Analyze handle method

    The handle method passes the request to next middleware/controller without changes.
  2. Step 2: Analyze terminate method

    After response is sent, terminate logs the response status code using Log::info.
  3. Final Answer:

    Logs the response status code after sending the response -> Option B
  4. Quick Check:

    terminate logs status post-response [OK]
Hint: Terminate runs after response, so logs status then [OK]
Common Mistakes:
  • Thinking terminate runs before response
  • Assuming terminate is not called automatically
  • Confusing request and response parameters
4. Identify the error in this terminable middleware code:
class CleanupMiddleware {
    public function handle($request, Closure $next) {
        return $next($request);
    }
    public function terminate() {
        // cleanup code here
    }
}
medium
A. terminate method must accept $request and $response parameters
B. handle method must return a string, not a response
C. terminate method should be named handleTerminate
D. handle method must not call $next

Solution

  1. Step 1: Check terminate method signature

    Terminable middleware's terminate method must accept both $request and $response parameters.
  2. Step 2: Identify missing parameters

    The code's terminate method has no parameters, which will cause errors.
  3. Final Answer:

    terminate method must accept $request and $response parameters -> Option A
  4. Quick Check:

    terminate signature requires request and response [OK]
Hint: Terminate method needs both request and response parameters [OK]
Common Mistakes:
  • Omitting parameters in terminate method
  • Renaming terminate method incorrectly
  • Misunderstanding handle method return type
5. You want to log the total time taken to process a request including after the response is sent. How would you implement this using terminable middleware?
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?
    }
}
hard
A. $duration = microtime(true) - $this->startTime; \Log::info('Request took ' . $duration . ' seconds');
B. $duration = microtime(true) + $this->startTime; \Log::info('Request took ' . $duration . ' seconds');
C. return $this->startTime; // terminate must return a value
D. Call $this->handle($request, $next) again inside terminate

Solution

  1. Step 1: Calculate duration in terminate method

    Use current time minus stored start time to get total duration.
  2. Step 2: Log the duration

    Use Log::info to record the time taken after response is sent.
  3. Final Answer:

    $duration = microtime(true) - $this->startTime; \Log::info('Request took ' . $duration . ' seconds'); -> Option A
  4. Quick Check:

    Duration = now - startTime, then log [OK]
Hint: Subtract start time from current time in terminate to get duration [OK]
Common Mistakes:
  • Adding times instead of subtracting
  • Returning values from terminate method
  • Calling handle method inside terminate
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard